电子邮件
1、基础知识铺垫
要在网络上实现邮件功能,必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过的邮件,并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱能;
传输协议
- SMTP协议
发送邮件:
我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。 - POP3协议
接收邮件:
我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
邮件收发原理
1、邮件服务器
①SMTP邮件服务器:替用户发送邮件和接收外面发送给本地用户的邮件
②POP3/IMAP邮件服务器:帮助用户读取SMTP邮件服务器接收进来的邮件
2、邮件传输协议
①电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行邮件传递,那就必须要遵守一定的规则,这个规则就是邮件传输协议
②SMTP协议:全称为 Simple Mail Transfer Protocol,简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则
③POP3协议:全称为 Post Office Protocol,邮局协议。它定义了邮件客户端软件和POP3邮件服务器的通信规则
④IMAP协议:全称为 Internet Message Access Protocol,Internet消息访问协议,它是对POP3协议的一种扩展,也是定义了邮件客户端软件和IMAP邮件服务器的通信规则
我们说所有的邮件服务器和邮件客户端软件程序都是基于上面的协议编写的.
使用java实现邮件发送功能需要使用的类
我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。 使用Java发送 E-mail 十分简单,但是首先你应该准备 JavaMail API 和Java Activation Framework 。 得到两个jar包: 1.mail.jar 2.activation.jar JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。
我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络。
- 创建包含邮件服务器的网络连接信息的Session对象。
- 创建代表邮件内容的Message对象
- 创建Transport对象,连接服务器
- 发送Message
- 关闭连接
2、java实现邮件简单发送
解析以下简单邮件发送的7个固定步骤,如果你要使用,直接复制粘贴代码,并将你的邮箱+授权码填进去就可以用了
1、准备一些参数
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); //设置QQ邮件服务器
prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
2、获取session对象
//1、创建定义整个应用程序所需的环境信息的 Session 对象
// 使用QQ邮箱的时候才需要,其他邮箱不需要这一段代码
Session session = Session.getDefaultInstance(prop, new Authenticator() {//获取和SMTP服务器的连接对象
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
return new PasswordAuthentication("XXXX@qq.com", "授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//不开DEBUG我们在控制台就看不到它是怎么发送的邮件,只能等着程序结束再去邮箱中查看是不是收到了邮件
3、获取传输对象
//2、通过session得到transport对象
Transport ts = session.getTransport();//通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象
4、登陆授权
//3、使用邮箱的用户名和授权码连上SMTP邮件服务器,即登陆
ts.connect("smtp.qq.com", "XXXX@qq.com", "授权码");
5、写邮件
//4、创建邮件对象MimeMessage——点击网页上的写信
//创建一个邮件对象
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人——在网页上填写发件人
message.setFrom(new InternetAddress("XXXX@qq.com"));//设置发件人
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发——在网页上填写收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("XXXX@qq.com"));//设置收件人
//邮件的标题——在网页上填写邮件标题
message.setSubject("简单邮件发送实现");//设置邮件主题
//邮件的文本内容——在网页上填写邮件内容
message.setContent("<h2 style='color:red'>你好啊!</h2>", "text/html;charset=UTF-8");//设置邮件的具体内容
6、发送邮件
//5、发送邮件——在网页上点击发送按钮
ts.sendMessage(message, message.getAllRecipients());
7、关闭服务器资源
//6、关闭连接对象,即关闭程序中打开的连接资源
ts.close();
实现向自己邮箱发送邮件的功能代码:
public class MailDemo01 {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); //设置QQ邮件服务器
prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
// 1.创建session对象
//使用QQ邮箱的时候才需要,其他邮箱不需要这一段代码
Session session = Session.getDefaultInstance(prop, new Authenticator() {//获取和SMTP服务器的连接对象
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
// mtxsmbxgflekebhb
// pzsctkyklfnxebfe
return new PasswordAuthentication("2277644734@qq.com", "mtxsmbxgflekebhb");
}
});
// 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
// 2.创建Transport对象
// 通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象
Transport ts = session.getTransport();
// 3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","2277644734@qq.com","mtxsmbxgflekebhb");
// 4.创建一个Message对象(需要传递session)
MimeMessage message = new MimeMessage(session);
// 指明邮件的发件人——在网页上填写发件人
message.setFrom(new InternetAddress("2277644734@qq.com")); // 设置发送人
// 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发——在网页上填写收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress ("2277644734@qq.com")); // 设置收件人
// 邮件的标题——在网页上填写邮件标题
message.setSubject("简单的邮件发送测试");
// 邮件的文本内容——在网页上填写邮件内容
message.setContent("<h2 style='color:red'> 恭喜你啦!</h2>","text/html;charset=UTF-8");
// 5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
// 6.关闭连接
ts.close();
}
}
3、复杂邮件的发送
复杂邮件就是非纯文本的邮件,可能还包含了图片和附件等资源
先认识两个类一个名词:
MIME(多用途互联网邮件扩展类型)
- MimeBodyPart类
javax.mail.internet.MimeBodyPart类表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。即一个MIME消息对应一个MimeBodyPart对象,而MimeBodyPart对象就是我们写的邮件内容中的元素
- MimeMultipart类
javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。即一个MimeMultipart对象表示多个MimeBodyPart的集合,而一个MimeMultipart表示的就是我们一封邮件的内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YhcZKhGA-1607266159332)(JavaWeb.assets/1747479-20200909180657427-1563537314.png)]
MimeMultipart对象的使用的时候需要设置setSubType()的属性值,一共就下面3种取值
- alternative:表明这个MimeMultipart对象中的MimeMessage对象的数据是纯文本文件
- related:表明这个MimeMultipart对象中的MimeMessage对象的数据包含非纯文本文件
- mixed:表明这个MimeMultipart对象中的MimeMessage对象的数据包含附件
相较于简单邮件,复杂邮件变化的地方只是在于邮件内容本身会发送变化,而其他的步骤都是一样的
1、准备一些参数
2、获取session对象
3、获取传输对象
4、登陆授权
5、写邮件 (和简单邮件相区别)
6、发送邮件
7、关闭服务器资源
复杂邮件和简单邮件的区别的地方:
//图片
MimeBodyPart body1 = new MimeBodyPart();
body1.setDataHandler(new DataHandler(new FileDataSource("图片的绝对地址")));
body1.setContentID("yhbxb.png"); //图片设置ID
//文本
MimeBodyPart body2 = new MimeBodyPart();
body2.setContent("请注意,我不是广告<img src='cid:yhbxb.png'>","text/html;charset=utf-8");
//附件
MimeBodyPart body3 = new MimeBodyPart();
body3.setDataHandler(new DataHandler(new FileDataSource("附件1的绝对地址")));
body3.setFileName("test.c"); //附件设置名字
MimeBodyPart body4 = new MimeBodyPart();
body4.setDataHandler(new DataHandler(new FileDataSource("附件2的绝对地址")));
body4.setFileName("test.txt"); //附件设置名字
//拼装邮件正文内容
MimeMultipart multipart1 = new MimeMultipart();
multipart1.addBodyPart(body1);
multipart1.addBodyPart(body2);
multipart1.setSubType("related"); //1.文本和图片内嵌成功!
//new MimeBodyPart().setContent(multipart1); //将拼装好的正文内容设置为主体
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(multipart1);
//拼接附件
MimeMultipart allFile =new MimeMultipart();
allFile.addBodyPart(body3); //附件
allFile.addBodyPart(body4); //附件
allFile.addBodyPart(contentText);//正文
allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed;
//设置到消息中,保存修改
message.setContent(allFile);//将MimeMultipart放入消息对象中
message.saveChanges();//保存上面的修改