JavaWeb学习——邮件发送
1.邮件发送简介
我们想要实现在网络上邮件发送,就必须有专门的邮件服务器。就像是现实生活中的邮局,负责接受用户递来的邮件,并把邮件送到邮件接受者的邮箱中去。
邮件发送有一个专门的协议叫做SMTP,有了这个协议才能收发邮件。那么一般的邮件服务器地址是smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
电子邮箱的获取需要在邮件服务器上进行申请,比如QQ邮箱。
2.传输协议
- SMTP协议:邮件发送请求协议
- POP3协议:邮件接受协议
3.邮件收发原理
- ①用户1将邮件发送给QQ服务器
- ②QQ的SMTP邮件发送服务器将邮件发送给网易的POP3邮件接受服务器
- ③网易的邮件服务器将接收到的邮件存入用户2的邮件空间内,等待用户读取
- ④用户2连接到自己的POP3服务器收取邮件
- ⑤网易的POP3服务器从用户2邮件空间中取出邮件
- ⑥POP3服务器将邮件取出来给用户2.
注意:现在的邮箱有识别垃圾邮件的功能,如果重复发邮件,多次发送可能会导致收到的邮件直接被邮件服务器放到垃圾箱里去。
4.准备工作
①邮件发送的两个jar包
②邮件发送四个核心类
- Message类:是创建和解析邮件的核心API,他的实例对象代表一封电子邮件。
- Transport类:是发送邮件的核心类,它的实例对象实现了某个邮件发送协议的邮件发送对象,如:SMTP协议
- Stroe类:是接收邮件的核心API,它的实力对象代表实现了某个邮件接收的协议的邮件接收对象,如:POP3协议
- Session类:用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名,端口号,采用的邮件发送协议和接收协议。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,已经欸客户端创建Message对象时提供信息支持
③在QQ邮箱中获取对应的权限
打开QQ邮箱找到邮箱的设置---->账户
找到服务设置,开启POP3/SMTP服务
记住这个授权码
准备工作好了之后,我们下面就开始准备发送一封简单的邮件
5.使用JavaMail发送一封简单的邮件(发送纯文本)
```
package com.muhan.sendMail;
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 SendMail {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
//第一步:创建配置文件,保存并读取信息
Properties properties = new Properties();
//1.设置qq邮件服务器
properties.setProperty("mail.host","semp.qq.com");
//2.设置发送协议
properties.setProperty("mail.transport.protocol","smtp");
//3.设置用户是否需要验证
properties.setProperty("mail.stmpt.auth","true");
//第二步:设置QQ邮箱SSL加密
//因为我们使用的是QQ邮箱,还要设置SSL加密,加上以下几行代码即可(别的邮箱不需要)
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
System.out.println("=============准备工作完成===============");
//第三步:正式开始准备发送邮件
//1.创建Session会话对象
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//实现方法,传入发件方的邮箱地址和权限校验码
return new PasswordAuthentication("462447812@qq.com","bxxovtwbczspbhcg");
}
});
//2.开启Sessin的debug模式,这样就可以在控制台查看程序Email发送的状态了
session.setDebug(true);
//3.获取连接对象,通过session对象获取transport对象
Transport transport = session.getTransport();
//4.连接服务器,需要传入邮件服务器,发件方的账号和权限校验码
transport.connect("smtp.qq.com","462447812@qq.com","euwawaosjlnobhcg");
//5.发送邮件(这里为了理清楚逻辑,抽取一个方法调用)
sendText(session,transport);
//6.最后关闭连接
transport.close();
}
//发送邮件
private static void sendText(Session session, Transport transport) throws MessagingException {
//1.创建邮件对象,传入session
MimeMessage mimeMessage = new MimeMessage(session);
//2.设置邮件发送人
mimeMessage.setFrom(new InternetAddress("462447812@qq.com"));
//3.设置邮件收件人,可以设置多人,也可以设置自己给自己发(这里我就设置的是自己给自己发)
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("462447812@qq.com"));
//4.设置邮件标题
mimeMessage.setSubject("Hello 邮件发送");
//5.设置邮件内容,为防止乱码问题这里参数2将文本类型和字符编码设置
String msg = "资料已经整理好了,请查收";
mimeMessage.setContent(msg,"text/html;charset=utf-8");
//6.发送
transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
}
}
```
效果展示:
6.发送带图片的邮件
我们要想发送一封带图片的邮件,就得先知道它的原理。在邮件中资源是这样的位置:
那么在我们Java中也为我们提供了用来组合的类:MimeMultipart;
javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
除此之外,Java还为我们提供了一个类:MimeBodyPart
javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,MIME:多用途互联网邮件扩展类型。它和MimeMessage类一样都是从Part接口继承过来。就是用来封装消息的类。
package com.muhan.sendMail;
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 SendImgMail {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
//第一步:创建配置文件,保存并读取信息
Properties properties = new Properties();
//1.设置qq邮件服务器
properties.setProperty("mail.host","semp.qq.com");
//2.设置发送协议
properties.setProperty("mail.transport.protocol","smtp");
//3.设置用户是否需要验证
properties.setProperty("mail.stmpt.auth","true");
//第二步:设置QQ邮箱SSL加密
//因为我们使用的是QQ邮箱,还要设置SSL加密,加上以下几行代码即可(别的邮箱不需要)
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
System.out.println("=============准备工作完成===============");
//第三步:正式开始准备发送邮件
//1.创建Session会话对象
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//实现方法,传入发件方的邮箱地址和权限校验码
return new PasswordAuthentication("462447812@qq.com","bxxovtwbczspbhcg");
}
});
//2.开启Sessin的debug模式,这样就可以在控制台查看程序Email发送的状态了
session.setDebug(true);
//3.获取连接对象,通过session对象获取transport对象
Transport transport = session.getTransport();
//4.连接服务器,需要传入邮件服务器,发件方的账号和权限校验码
transport.connect("smtp.qq.com","462447812@qq.com","bxxovtwbczspbhcg");
//5.发送邮件
sendImgMail(session, transport);
//6.关闭连接
transport.close();
}
private static void sendImgMail(Session session, Transport transport) throws MessagingException {
//第一步:创建邮件
//1创建邮件消息对象
MimeMessage message = new MimeMessage(session);
//2设置邮件的基本信息
message.setFrom(new InternetAddress("462447812@qq.com"));//发件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("462447812@qq.com"));//收件人
message.setSubject("图片邮件,请查收");//邮件主题
//3准备邮件数据
//3-1准备图片数据
MimeBodyPart imgBody = new MimeBodyPart();
//把图片封装成流,参数是本地图片的路径
DataHandler dataHandler = new DataHandler(new FileDataSource("E:/IdeaProjects/JavaWeb邮件发送/src/resources/1.jpg"));
imgBody.setDataHandler(dataHandler);
imgBody.setContentID("1.jpg");//设置图片CID
//3-2准备正文数据
MimeBodyPart txtBody = new MimeBodyPart();
//设置正文内容,并将图片利用html嵌入,参数二为文本类型和字符编码
txtBody.setContent("这是一封附带图片的邮件,图片:<img src='cid:1.jpg'>","text/html;charset=UTF-8");
//4描述数据关系,将图片和文本组合
MimeMultipart mimeMultipart= new MimeMultipart();
mimeMultipart.addBodyPart(imgBody);
mimeMultipart.addBodyPart(txtBody);
mimeMultipart.setSubType("related");//设置邮件类型为嵌入式
//5.5将邮件数据设置到邮件消息对象中,并保存修改
message.setContent(mimeMultipart);
message.saveChanges();//保存修改
//6.发送邮件
transport.sendMessage(message,message.getAllRecipients());
}
}
效果展示:
7.带附件,图片的复合型邮件发送
原理和带图片的邮件发送一样,也是将每一部分封装再组合成一个整体。然后发送
package com.muhan.mail;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.GeneralSecurityException;
import java.util.Properties;
//发送文本,图片,附件复合邮件
public class SendAllMail {
public static void main(String[] args) throws MessagingException, GeneralSecurityException, UnsupportedEncodingException {
Properties properties = new Properties();
properties.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器,如果是别的邮箱参数二改变即可
properties.setProperty("mail.transport.protocol","smtp");//设置邮件协议
properties.setProperty("mail.smtp.auth","true");//设置需要验证用户名和密码
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可,其他邮箱不用这段代码
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
System.out.println("=========准备工作完成===========");
//开始发送邮件步骤
//1.创建Session对象
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("462447812@qq.com", "bxxovtwbczspbhcg");//邮箱用户名和密码(授权码)
}
});
//2.开启Session的deBug模式,这样可以查看到程序发送Email的运行状态
session.setDebug(true);
//3.通过Session获得Transport对象
Transport transport = session.getTransport();
//4.使用邮箱用户名和密码(授权码)连接邮件服务器
transport.connect("smtp.qq.com","462447812@qq.com","bxxovtwbczspbhcg");
//5.准备邮件
//5.1创建邮件消息对象
MimeMessage message = new MimeMessage(session);
//5.2设置邮件的基本信息
message.setFrom(new InternetAddress("462447812@qq.com"));//发件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("462447812@qq.com"));//收件人
message.setSubject("复合邮件,请查收");//邮件主题
//5.3编写邮件内容
//5.3.1图片
MimeBodyPart imgBody = new MimeBodyPart();
DataHandler dataHandler = new DataHandler(new FileDataSource(
"E:/IdeaProjects/JavaWeb邮件发送/src/resources/1.jpg"));//封装图片为流
imgBody.setDataHandler(dataHandler);
imgBody.setContentID("1.jpg");//设置图片CID
//5.3.2文本
MimeBodyPart txtBody = new MimeBodyPart();
//设置正文内容,并将图片利用html嵌入,参数二为文本类型和字符编码
txtBody.setContent("这是一封混合邮件,<img src='cid:1.jpg'>","text/html;charset=UTF-8");
//5.3.3附件
MimeBodyPart fileBody = new MimeBodyPart();
fileBody.setDataHandler(new DataHandler(new FileDataSource(
"E:/IdeaProjects/JavaWeb邮件发送/src/resources/我的文本文件.txt")));//封装附件为流
//fileBody.setFileName(MimeUtility.encodeText("我的文本文件.txt"));
//这里是将附件的名称做处理,防止乱码
String str = new String("我的文本文件.txt".getBytes("UTF-8"),"ISO-8859-1");
fileBody.setFileName(str);
//5.4将三部分拼装
MimeMultipart allFile = new MimeMultipart();
allFile.addBodyPart(imgBody);
allFile.addBodyPart(txtBody);
allFile.addBodyPart(fileBody);
allFile.setSubType("mixed");//设置邮件类型为带附件的混合类型
//6.将整体放入message中,并保存修改
message.setContent(allFile);
message.saveChanges();//保存修改
//7.发送邮件
transport.sendMessage(message,message.getAllRecipients());
//8.关闭连接
transport.close();
}
}
效果显示: