javamail技术研究

4 篇文章 0 订阅
完成javamail的总结:
1.什么是javamail技术?
javamail通俗易懂就是通过java程序来实现发送邮件的一项技术。
2.邮件是通过什么发出去呢?
邮件都是通过邮件服务器发送出去的,也是通过邮件服务器接受的。邮件服务器按通讯协议可以划分为两种类型:
①smtp服务器(发送邮件服务器)
②pop3服务器(接受邮件服务器)
就比如我们的QQ邮箱的服务器就是分为发送QQ邮件服务器为smtp.qq.com,QQ的接受邮件服务器为pop3.qq.com。那么我们的smtp和pop3协议是分别是什么协议呢?
smtp协议:全称为Simple Mail Transfer Protocol(简单邮件传输协议),它定义了邮件客户端软件与SMTP服务器之间、以及两台SMTP服务器之间的通讯规则。
pop3协议:全称为Post Office Protocol(邮局协议),它定义了邮件客户端软件与POP3服务器的通讯规则。

3.接下来就说明一下javamail的使用实例。这里用的是QQ邮箱进行测试的。程序的流程图如下:


根据以上的流程图我们来具体的学习一下javamail的API:
JavaMail API按其功能划分通常可分为如下三大类:
①创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
②发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
③ 接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
其中javamail中还有一个很重要的类就是Session
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。那么通过以上的类我们就可以完成一个简单邮件的发送。那么在具体的进行实现时首先我们需要引入javamail的jar包:
截图如下:


要说明的是如果你的jdk的版本在1.6以上那么就只需要mail.jar包即可。
①首先对Session邮件会话对象的属性进行配置,如下图:


配置内容如下图:


这里需要说明的是
mail.smtp.host配置的是qq发送邮件的服务器主机为smtp.qq.com
mail.smtp.port=587是指发送服务器的端口
mail.debug是设置邮件的调试模式
mail.smtp.auth是设置发送服务器需要对邮件进行身份验证
mail.user这个是设置你在qq发送邮件的账号
mail.password这个设置的是在你开启pop3和smtp服务时分配给你的密码而不是你的qq密码,这个需要注意的,具体设置可以自己查询。
那么接下来就根据具体的代码来进行解析具体的java代码实现如下:

package com.yd.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;

import org.eclipse.jdt.internal.compiler.ast.ThisReference;

//邮件发送类
public class SendMail {
	public static void main(String[] args) throws MessagingException, IOException {
		//获得类加载器  并且获得资源的读取流
		InputStream is=SendMail.class.getClassLoader().getResourceAsStream("mail.properties");
		//设置发送邮件服务器的属性
		Properties properties=new Properties();
		properties.load(is);
		//创建一个验证授权对象
		Authenticator authenticator=new Authenticator() {
			//密码验证的方法
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(properties.getProperty("mail.user"),properties.getProperty("mail.password"));
			}
		};
		//1.首先创建一个发送邮件会话对象  将会话属性和验证对象加入到邮件会话对象当中
		Session session=Session.getInstance(properties, authenticator);
		//创建一个邮件对象
		MimeMessage message=new MimeMessage(session);
		//对邮件对象设置参数
		//1.标题
		message.setSubject("这是我发的邮件");
		//2.邮件的发送人
		message.setSentDate(new Date());
		//设置发送人
		message.setFrom(new InternetAddress("xxxxxxxxx@qq.com"));
		//接受人
		message.setRecipient( RecipientType.TO, new InternetAddress("xxxxxxxxx@qq.com"));
		//设置正文部分
		message.setText("这是第一封我给你发的邮件");
		//最后保存文件
		message.saveChanges();
		//Transport.send(message);
		//创建一个发送对象
		Transport transport=session.getTransport("smtp");
		//发送对象发送到发送到发送服务器中    连接需要主机名  用户名和密码
		//设置smtp协议发送的对象
		transport.connect(properties.getProperty("mail.smtp.host"),properties.getProperty("mail.user") ,properties.getProperty("mail.password"));
		//发送对象发送邮件		
		transport.sendMessage(message,message.getAllRecipients());
		//关闭发送对象
		transport.close();
	}
}
4.那么我们如何发送一个有图片和一个有附件的邮件呢?那么就首先要了解一下javamail的mime的组织结构,如下图:


如图可以看出复杂邮件内容可以分为三个级别:
①就是很简单的纯文本和超文本格式的邮件
②就是带有内嵌资源的邮件,比如在邮件中添加连接,图片,多媒体等。
③就是带有附件的邮件
javamail是如何实现的呢?javamail将邮件组织定义成如下图:


其实很简单,每一个邮件简单内容如文本,图片,附件都当作一个MimeBodyPart,而MimeMutipart就是由多个MimeBodyPart组成,相当于是一个大容器。而最外层的MimeMultipart则是邮件Message对象的内容。以下实现了一个带有图片和附件的邮件,具体的java代码实现如下:

package com.yd.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;

public class SendRelated {
	public static void main(String[] args) throws IOException, MessagingException {
		//设置邮件的信息
		InputStream is=SendRelated.class.getClassLoader().getResourceAsStream("mail.properties");
		//获得邮件的属性
		Properties properties=new Properties();
		properties.load(is);
		//创建一个验证邮件用户的对象
		Authenticator authenticator=new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(properties.getProperty("mail.user"), properties.getProperty("mail.password"));
			}
		};
		//创建一个邮件会话对象
		Session session=Session.getInstance(properties, authenticator);
		//创建一个邮件对象
		MimeMessage message=new MimeMessage(session);
		//创建邮件附件的内容块
		MimeMultipart mixed=new MimeMultipart("mixed");
		//创建一个内容块放正文部分
		MimeBodyPart c=new MimeBodyPart();
		mixed.addBodyPart(c);
		//MimeBodyPart attch=new MimeBodyPart();
		//创建附件
		MimeBodyPart attch1=new MimeBodyPart();
		//mimeBodyPart.setDataHandler(arg0);
		//创建附件模块
		String attch1path=SendRelated.class.getClassLoader().getResource("usermanage.sql").getPath();
		DataSource ds1=new FileDataSource(new File(attch1path));
		DataHandler dh1=new DataHandler(ds1);
		attch1.setDataHandler(dh1);
		attch1.setFileName("usermanage.sql");
		//创建附件二
		MimeBodyPart attch2=new MimeBodyPart();
		String attch1path2=SendRelated.class.getClassLoader().getResource("usermanage.sql").getPath();
		DataSource ds2=new FileDataSource(new File(attch1path2));
		DataHandler dh2=new DataHandler(ds2);
		attch2.setDataHandler(dh2);
		attch2.setFileName("b.sql");
		//将附件加入
		mixed.addBodyPart(attch1);
		mixed.addBodyPart(attch2);
		
		//创建邮件的复杂内容块 此内容块为正文部分
		Multipart multipart=new MimeMultipart("related");  //创建一个带有内嵌资源和文本的复杂内容块
		c.setContent(multipart);
		//设置复杂块内容  文本内容
		MimeBodyPart content=new MimeBodyPart();
		content.setContent("<img src='cid:8.png'/><img src='cid:9.png'/>这是我的爱你的人嗯啊","text/html;charset=utf-8");
		String path=SendRelated.class.getClassLoader().getResource("8.png").getPath();
		MimeBodyPart image=new MimeBodyPart();
		DataSource dataSource=new FileDataSource(path);
		DataHandler dataHandler=new DataHandler(dataSource);
		image.setDataHandler(dataHandler);
		//给内嵌资源设置id号  在正文的超文本中就可以直接通过cid:id来使用
		image.setContentID("8.png");

		
		String path2=SendMail.class.getClassLoader().getResource("9.png").getPath();
		MimeBodyPart image2=new MimeBodyPart();
		DataSource dataSource2=new FileDataSource(path2);
		DataHandler dataHandler2=new DataHandler(dataSource2);
		image2.setDataHandler(dataHandler2);
		image2.setContentID("9.png");
		//multipart.addBodyPart(content);
		multipart.addBodyPart(content);        
		multipart.addBodyPart(image);
		multipart.addBodyPart(image2);
		//邮件设置标题
		message.setSubject("本的邮件");
		message.setFrom(new InternetAddress(properties.getProperty("mail.user")));
		//设置收件人
		message.setRecipient(RecipientType.TO, new InternetAddress("xxxxxx@qq.com"));
		//邮件对象设置内容
		message.setContent(mixed);
		
		//设置smtp协议发送的对象
		Transport transport=session.getTransport("smtp");
		transport.connect(properties.getProperty("mail.smtp.host"),properties.getProperty("mail.user") ,properties.getProperty("mail.password"));
		transport.sendMessage(message,message.getAllRecipients());
		transport.close();
	}
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值