六、邮件收发
电子邮件
要在网络上实现邮件功能,必须要有专门的邮件服务器。
这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
SMTP服务器地址:一般是smtp.xxx.com, 比如163邮箱是smtp.163.com, qq邮箱是smtp.qq.com
电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。
传输协议
SMTP协议
发送邮件:
我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
POP3协议
接收邮件:
我们通常把处理用户POP3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
【注意】有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这个时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试。
Java发送邮件
概述:
我们将用代码完成邮件的发送。这在实际项目中应用的非常广发,比如注册需要发送永健进行账号激活,再比如OA项目中利用邮件进行任务提醒等。
使用java发送E-mail十分简单,但是首先你应该准备JavaMail和Java Activation Framework.
得到两个jar包:
-
mail.jar
下载地址:https://mvnrepository.com/artifact/javax.mail/mail/1.4.7
-
activation.jar
下载地址:https://mvnrepository.com/artifact/javax.activation/activation/1.1.1
JavaMail是sun公司(现以被甲骨文收购)为方便java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME。我们在使用JavaMail API编写邮件时,无须考虑邮件的底层实现细节,只调用JavaMail开发包中相应的API类就可以了。
我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络。
-
创建包含邮件服务器的网络连接信息的Session对象。
-
创建代表邮件内容的Message对象
-
创建Transport对象,连接服务器,发送Message,关闭连接
主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序。
MIME(多用途互联网邮件扩展类型)
简单邮件:没有附件和图片,纯文本邮件
复杂邮件:有附件和图片,不是纯文本邮件
发送简单邮件
使用JavaMail发送邮件五个步骤:
1.创建定义整个应用程序所需的环境信息的Session对象
2.通过Session得到transport对象
3.使用邮箱的用户名和授权码连上邮件服务器
4.创建邮件:写邮件【主体】
5.发送邮件
6.关闭连接
纯文本邮件
注意QQ邮箱SSL加密有两个地方不同于其他邮箱
package com.kuang.servlet;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
//简单邮件:文本
public class MailDemo01 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop=new Properties();
prop.setProperty("mail.host","smtp.qq.com");
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);
/*使用JavaMail发送邮件五个步骤
1.创建定义整个应用程序所需的环境信息的Session对象
2.通过Session得到transport对象
3.使用邮箱的用户名和授权码连上邮件服务器
4.创建邮件:写邮件【主体】
5.发送邮件
6.关闭连接
*/
//1.创建定义整个应用程序所需的环境信息的Session对象
//QQ邮箱才需在初始化Session时,需要授权new Authenticator(),其他邮箱不用
Session session=Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//发件人邮箱用户名,授权码
return new PasswordAuthentication("xxxx@qq.com","授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过Session得到transport对象
Transport ts=session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","xxxx@qq.com","授权码");
//4.创建邮件:写邮件
//主要专递session
MimeMessage message=new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("xxxx@qq.com"));
//指明邮件收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("18260036612@163.com"));
//邮件的主题
message.setSubject("简单邮件");
//邮件的文本内容
message.setContent("<h1 style='color:red'>只有文本的简单邮件<h1>","text/html;charset=utf-8");
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
}
}
带图片和附件的邮件
先认识两个类一个名词:
MIME(多用途互联网邮件扩展类型)
MimeBodyPart类
javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。
MimeMultipart类
javax.mail.internet.MimeMultipart是抽象类Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
文本中嵌入图片的邮件
只有邮件的内容发生了改变
MimeBodyPart相当于是一层封装,文本、图片、附件各自有封装,最后再封装一次
package com.kuang.servlet;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.security.GeneralSecurityException;
import java.util.Properties;
//文本+嵌入文本的内容
public class MailDemo02 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop=new Properties();
prop.setProperty("mail.host","smtp.qq.com");
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);
/*使用JavaMail发送邮件五个步骤
1.创建定义整个应用程序所需的环境信息的Session对象
2.通过Session得到transport对象
3.使用邮箱的用户名和授权码连上邮件服务器
4.创建邮件:写邮件【主体】
5.发送邮件
6.关闭连接
*/
//1.创建定义整个应用程序所需的环境信息的Session对象
//QQ邮箱才需在初始化Session时,需要授权new Authenticator(),其他邮箱不用
Session session=Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//发件人邮箱用户名,授权码
return new PasswordAuthentication("xxxx@qq.com","授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过Session得到transport对象
Transport ts=session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","xxxx@qq.com","授权码");
//4.创建邮件:写邮件
//主要专递session
MimeMessage message=new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("xxxx@qq.com"));
//指明邮件收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxx@qq.com"));
//邮件的主题
message.setSubject("简单邮件");
//********************只有邮件的内容发生了改变*******************
//邮件的内容:文本+嵌入文本的图片
//MimeBodyPart相当于是一层封装,文本、图片、附件各自有封装,最后再封装一次
//1)准备图片,需要经过数据处理
MimeBodyPart image=new MimeBodyPart();
DataHandler dataHandler=new DataHandler(new FileDataSource("E:\\winfile\\桌面\\javaweb\\maven\\mail\\src\\1.png"));
image.setDataHandler(dataHandler);
image.setContentID("bz.jpg");
//2)准备正文数据
MimeBodyPart text=new MimeBodyPart();
text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件","text/html;charset=UTF-8");
//3)图片和文本封装在一起,描述数据关系
MimeMultipart mm=new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
//4)设置到消息中,保存修改
message.setContent(mm); //把最后编辑好的文件放到消息中去
message.saveChanges(); //保存修改
//***********************************************************
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
}
}
文本中嵌入图片、带有附件的邮件
邮件内容提取成一个方法
- 图片,需要经过数据处理 MimeBodyPart1
- 文本 MimeBodyPart2
- 附件 MimeBodyPart3
- 图片和文本嵌套 MimeBodyPart1+MimeBodyPart2=>MimeMultipart1
- MimeMultipart=>multipart1再封装成MimeBodyPart,将imageText和附件组合 >MimeMultipart1=>MimeBodyPart4 MimeBodyPart4+MimeBodyPart3=>MimeMultipart allFile
- 放到message消息中
package com.kuang.servlet;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.security.GeneralSecurityException;
import java.util.Properties;
//文本+嵌入文本的内容
public class MailDemo03 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop=new Properties();
prop.setProperty("mail.host","smtp.qq.com");
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);
/*使用JavaMail发送邮件五个步骤
1.创建定义整个应用程序所需的环境信息的Session对象
2.通过Session得到transport对象
3.使用邮箱的用户名和授权码连上邮件服务器
4.创建邮件:写邮件【主体】
5.发送邮件
6.关闭连接
*/
//1.创建定义整个应用程序所需的环境信息的Session对象
//QQ邮箱才需在初始化Session时,需要授权new Authenticator(),其他邮箱不用
Session session=Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//发件人邮箱用户名,授权码
return new PasswordAuthentication("xxxx@qq.com","授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过Session得到transport对象
Transport ts=session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","xxxx@qq.com","授权码");
//********************只有邮件的内容发生了改变*******************
//4.创建邮件:写邮件
//邮件的内容:文本+嵌入文本的图片+附件
//MimeBodyPart相当于是一层封装,文本、图片、附件各自有封装,最后再封装一次
//此处将邮件内容提取成了一个方法
MimeMessage message=imageMail(session);
//***********************************************************
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
}
/**
* 邮件内容提取成一个方法
* @param session
* @return
* @throws MessagingException
*/
public static MimeMessage imageMail(Session session) throws MessagingException {
//主要专递session
MimeMessage message=new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("xxxx@qq.com"));
//指明邮件收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxx@qq.com"));
//邮件的主题
message.setSubject("简单邮件");
//********************只有邮件的内容发生了改变(文本、图片、附件)*******************
/*
1)图片,需要经过数据处理 MimeBodyPart1
2)文本 MimeBodyPart2
3)附件 MimeBodyPart3
4)图片和文本嵌套 MimeBodyPart1+MimeBodyPart2=>MimeMultipart1
5)MimeMultipart=>multipart1再封装成MimeBodyPart,将imageText和附件组合 >MimeMultipart1=>MimeBodyPart4 MimeBodyPart4+MimeBodyPart3=>MimeMultipart allFile
6)放到message消息中
*/
//1)图片,需要经过数据处理
MimeBodyPart image=new MimeBodyPart();
DataHandler dataHandler=new DataHandler(new FileDataSource("E:\\winfile\\桌面\\javaweb\\maven\\mail\\src\\1.png"));
image.setDataHandler(dataHandler);
image.setContentID("bz.jpg"); //图片设置ID
//2)文本
MimeBodyPart text=new MimeBodyPart();
text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件","text/html;charset=UTF-8");
//3)附件
MimeBodyPart fujian=new MimeBodyPart();
fujian.setDataHandler(new DataHandler(new FileDataSource("E:\\winfile\\桌面\\javaweb\\maven\\mail\\src\\刘杰.pdf")));
fujian.setFileName("fujian.pdf"); //附件设置名字【图片设置很相似】
//4)图片和文本嵌套
MimeMultipart multipart1=new MimeMultipart(); //注意区分MimeBodyPart和MimeMultipart
multipart1.addBodyPart(image);
multipart1.addBodyPart(text);
multipart1.setSubType("related");
//MimeMultipart=>multipart1再封装成MimeBodyPart
MimeBodyPart imageText=new MimeBodyPart();
imageText.setContent(multipart1);
//5)将imageText和附件组合
MimeMultipart allFile=new MimeMultipart();
allFile.addBodyPart(imageText);
allFile.addBodyPart(fujian);
allFile.setSubType("mixed");
//6)放到message消息中
message.setContent(allFile);
message.saveChanges(); //保存修改
return message;
}
}