JavaMail 知识点
需要用到依赖包
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.5.0-b01</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
获取QQ邮箱的 客户端授权码
QQ邮箱开启服务 获取客户端授权码(设置->账户->开启服务)

JavaMail发送邮件的步骤
注意QQ邮箱需要SSL秘钥验证
-
创建定义整个应用程序所需的环境信息的Session对象
-
通过session得到transport对象
Transport ts = session.getTransport(); -
使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","邮箱地址","邮箱授权码(QQ邮箱必须要获取指定的授权码)"); -
创建邮件
- 通过session获取MimeMessage消息实例
MimeMessage msg = new MimeMessage(session); - 指定邮件发件人
msg.setFrom(new InternetAddress("邮箱地址")); - 指定邮件接收人(可以设置多个接收人)
msg.setRecipient(Message.RecipientType.TO,new InternetAddress("邮箱地址")); - 指定邮件标题
msg.setSubject("邮件标题"); - 邮件的内容(文本、图片、附件)
msg.setContent(邮件内容实例);
- 通过session获取MimeMessage消息实例
-
发送邮件
ts.sendMessage(msg,msg.getAllRecipients()); -
关闭连接
ts.close();
邮件类型
- alternative 普通文本邮件
- related 内嵌资源邮件
- mixed 混合模式,可以携带附件(默认)

普通文本邮件
普通HTML文本邮件设置方式:
msg.setContent("HTML文本","text/html;charset=UTF-8");
代码:
package com.kun;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
/**
* 简单文本邮件 alternative
*/
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("main.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发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的Session对象
//QQ才有!其他邮箱不用
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("317557750@qq.com", "misxauephvtfcaij");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts = session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","317557750@qq.com","misxauephvtfcaij");
//4.创建邮件
//注意需要传递session
MimeMessage msg = new MimeMessage(session);
//邮件发件人
msg.setFrom(new InternetAddress("317557750@qq.com"));
//邮件接收人
msg.setRecipient(Message.RecipientType.TO,new InternetAddress("317557750@qq.com"));
//邮件标题
msg.setSubject("简单文本邮件");
//邮件的文本内容
msg.setContent("<h1 style='color:red'>冲冲冲!</h1>","text/html;charset=UTF-8");
//5.发送邮件
ts.sendMessage(msg,msg.getAllRecipients());
//6.关闭连接
ts.close();
}
}
控制台输出
DEBUG: setDebug: JavaMail version 1.5.0-b01
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 25, isSSL false
220 newxmesmtplogicsvrszc6.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.qq.com", port: 25
EHLO guokun.mshome.net
250-newxmesmtplogicsvrszc6.qq.com
250-PIPELINING
250-SIZE 73400320
250-STARTTLS
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "73400320"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<317557750@qq.com>
250 OK.
RCPT TO:<317557750@qq.com>
250 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP: 317557750@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>.
From: 317557750@qq.com
To: 317557750@qq.com
Message-ID: <1020391880.0.1629456485728.JavaMail.31755@smtp.qq.com>
Subject: =?UTF-8?B?566A5Y2V5paH5pys6YKu5Lu2?=
MIME-Version: 1.0
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<h1 style=3D'color:red'>=E5=86=B2=E5=86=B2=E5=86=B2=EF=BC=81</h1>
.
250 OK: queued as.
QUIT
221 Bye.
Process finished with exit code 0
收到的邮件

内嵌资源邮件
-
嵌入的图片等资源需要先通过
DataHandler类进行解析 -
MimeBodyPart是每一个邮件具体项目的最小单位,可以存放文本、图片等资源setDataHandler()将解析后的资源放到MimeBodyPart中setContentID()指定该MimeBodyPart中的资源ID值(字符串),调用方式:src = ‘cid:xxxx’setContent()将文本或资源放入MimeBodyPart中
-
MimeMultipart用于将指定一组MimeBodyPart实例一起组合打包addBodyPart()添加要打包的MimeBodyPart实例setSubType()设置打包好的邮件邮件类型

代码
package com.kun;
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.util.Properties;
/**
* 内嵌图片邮件 related
*/
public class MailDemo02 {
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("main.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发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的Session对象
//QQ才有!其他邮箱不用
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("317557750@qq.com", "misxauephvtfcaij");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts = session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","317557750@qq.com","misxauephvtfcaij");
//4.创建邮件
//注意需要传递session
MimeMessage msg = new MimeMessage(session);
//邮件发件人
msg.setFrom(new InternetAddress("317557750@qq.com"));
//邮件接收人
msg.setRecipient(Message.RecipientType.TO,new InternetAddress("317557750@qq.com"));
//邮件标题
msg.setSubject("带有图片资源的邮件");
//=============================================================
//准备图片数据
MimeBodyPart img = new MimeBodyPart();
//图片要经过数据处理... DataHandler:数据处理
DataHandler imgDh = new DataHandler(new FileDataSource("E:\\Users\\31755\\Desktop\\code\\JAVA\\javaweb_learn\\功能扩展\\Mail\\src\\main\\resources\\link.jpg"));
img.setDataHandler(imgDh);//在Body主体中放入处理后的图片数据
img.setContentID("link.jpg");//给图片设置一个ID 后续可以使用(HTML中通过src='cid:...'调用)
//准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("太阳系的行星分布图:<img src='cid:link.jpg'>","text/html;charset=UTF-8");
//描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(img);
mm.setSubType("related");//默认是 mixed
//设置到消息中,保存修改
msg.setContent(mm);//把最终编辑好的邮件放在消息当中
msg.saveChanges();//保存修改
//===================================================
//5.发送邮件
ts.sendMessage(msg,msg.getAllRecipients());
//6.关闭连接
ts.close();
}
}
控制台输出
DEBUG: setDebug: JavaMail version 1.5.0-b01
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 25, isSSL false
220 newxmesmtplogicsvrszb6.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.qq.com", port: 25
EHLO guokun.mshome.net
250-newxmesmtplogicsvrszb6.qq.com
250-PIPELINING
250-SIZE 73400320
250-STARTTLS
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "73400320"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<317557750@qq.com>
250 OK.
RCPT TO:<317557750@qq.com>
250 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP: 317557750@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>.
From: 317557750@qq.com
To: 317557750@qq.com
Message-ID: <5592464.1.1629456729052.JavaMail.31755@smtp.qq.com>
Subject: =?UTF-8?B?566A5Y2V5paH5pys6YKu5Lu2?=
MIME-Version: 1.0
Content-Type: multipart/related;
boundary="----=_Part_0_1837543557.1629456729042"
------=_Part_0_1837543557.1629456729042
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: base64
5aSq6Ziz57O755qE6KGM5pif5YiG5biD5Zu+77yaPGltZyBzcmM9J2NpZDpsaW5rLmpwZyc+
------=_Part_0_1837543557.1629456729042
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: link.jpg
//这里省略解码后的图片代码信息
------=_Part_0_1837543557.1629456729042--
.
250 OK: queued as.
QUIT
221 Bye.
Process finished with exit code 0
收到的邮件

混合邮件
- 实际上就是用
MimeBodyPart和MimeMultipart一层套一层达到混合目的

- 创建的附件MimeBodyPart可以通过调用
setFileName(字符串)设置附件的名称,使用MimeUtility.encodeText(字符串)可以解决中文显示乱码问题
代码
package com.kun;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
/**
* 混合邮件 mixed
*/
public class MailDemo03 {
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("main.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发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的Session对象
//QQ才有!其他邮箱不用
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("317557750@qq.com", "misxauephvtfcaij");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts = session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","317557750@qq.com","misxauephvtfcaij");
//4.创建邮件
MimeMessage msg = getMimeMessage(session);
//5.发送邮件
ts.sendMessage(msg,msg.getAllRecipients());
//6.关闭连接
ts.close();
}
private static MimeMessage getMimeMessage(Session session) throws Exception {
//注意需要传递session
MimeMessage msg = new MimeMessage(session);
//邮件发件人
msg.setFrom(new InternetAddress("317557750@qq.com"));
//邮件接收人
msg.setRecipient(Message.RecipientType.TO,new InternetAddress("317557750@qq.com"));
//邮件标题
msg.setSubject("文本、图片、附件我都有,无敌混合邮件在此");
//=============================================================
/*
编写邮件内容
1.图片
2.附件
3.文本
*/
//准备图片数据
MimeBodyPart img = new MimeBodyPart();
//图片要经过数据处理... DataHandler:数据处理
DataHandler imgDh = new DataHandler(new FileDataSource("E:\\Users\\31755\\Desktop\\code\\JAVA\\javaweb_learn\\功能扩展\\Mail\\src\\main\\resources\\link.jpg"));
img.setDataHandler(imgDh);//在Body主体中放入处理后的图片数据
img.setContentID("link.jpg");//给图片设置一个ID 后续可以使用(HTML中通过src='cid:...'调用)
//准备文本数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("太阳系的行星分布图:<img src='cid:link.jpg'>","text/html;charset=UTF-8");
//准备附件数据E:\Users\31755\Desktop\code\JAVA\javaweb_learn\功能扩展\Mail\src\main\resources\javaWeb文件上传与下载.md
MimeBodyPart attachment = new MimeBodyPart();
attachment.setDataHandler(new DataHandler(new FileDataSource("E:\\Users\\31755\\Desktop\\code\\JAVA\\javaweb_learn\\功能扩展\\Mail\\src\\main\\resources\\javaWeb文件上传与下载.md")));
attachment.setFileName(MimeUtility.encodeText("javaWeb文件上传与下载.md"));//给附件设置名字,MimeUtility.encodeText()解决中文乱码问题
//拼装邮件正文内容 文本和图片打包
MimeMultipart textAndImgMM = new MimeMultipart();
textAndImgMM.addBodyPart(text);
textAndImgMM.addBodyPart(img);
textAndImgMM.setSubType("related");
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(textAndImgMM);
//将正文与附件打包
MimeMultipart mailMM = new MimeMultipart();
mailMM.addBodyPart(contentText);//正文
mailMM.addBodyPart(attachment);//附件
mailMM.setSubType("mixed");//混合型-->默认的可以不手动设置
//===================================================
//设置到消息中,保存修改
msg.setContent(mailMM);//把最终编辑好的邮件放在消息当中
msg.saveChanges();//保存修改
return msg;
}
}
控制台输出
DEBUG: setDebug: JavaMail version 1.5.0-b01
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 25, isSSL false
220 newxmesmtplogicsvrszc9.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.qq.com", port: 25
EHLO guokun.mshome.net
250-newxmesmtplogicsvrszc9.qq.com
250-PIPELINING
250-SIZE 73400320
250-STARTTLS
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "73400320"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<317557750@qq.com>
250 OK.
RCPT TO:<317557750@qq.com>
250 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP: 317557750@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>.
From: 317557750@qq.com
To: 317557750@qq.com
Message-ID: <142638629.2.1629462749975.JavaMail.31755@smtp.qq.com>
Subject: =?UTF-8?B?5paH5pys44CB5Zu+54mH44CB6ZmE5Lu25oiR6YO9?=
=?UTF-8?B?5pyJ77yM5peg5pWM5re35ZCI6YKu5Lu25Zyo5q2k?=
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_1_668849042.1629462749968"
------=_Part_1_668849042.1629462749968
Content-Type: multipart/related;
boundary="----=_Part_0_1450821318.1629462749968"
------=_Part_0_1450821318.1629462749968
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: base64
5aSq6Ziz57O755qE6KGM5pif5YiG5biD5Zu+77yaPGltZyBzcmM9J2NpZDpsaW5rLmpwZyc+
------=_Part_0_1450821318.1629462749968
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: link.jpg
//此处省略资源解析的输出
------=_Part_1_668849042.1629462749968--
.
250 OK: queued as.
QUIT
221 Bye.
Process finished with exit code 0
收到的邮件

JavaMail Web实战
创建web项目配置Tomcat

导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kun</groupId>
<artifactId>Mail</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.5.0-b01</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Tomcat导包
如果在代码没有问题的情况下 网页出现500错误 没有找到某一个类,有可能就是因为这个类在Tomcat中没有,所以需要进行导包,把该类所在的包手动导入到Tomcat中


前端页面
-
index.jsp 邮箱注册页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>注册</title> </head> <body> <form action="${pageContext.request.contextPath}/RegisterServlet" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> 邮箱:<input type="text" name="email"><br> <input type="submit" value="注册"> </form> </body> </html> -
info.jsp 注册结果页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>提示页面</title> </head> <body> <h1>温馨提示</h1> ${message} </body> </html>
实体类 User
User主要就是用来存储注册的用户信息,这样就可以运行工具类SendMail引用User中的邮箱地址。
实现Serializable接口,使得该实体类可以被序列化。
package com.kun.entity;
import java.io.Serializable;
public class User implements Serializable {
private String username;
private String password;
private String mail;
public User() {
}
public User(String username, String password, String mail) {
this.username = username;
this.password = password;
this.mail = mail;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", mail='" + mail + '\'' +
'}';
}
}
工具类 SendMail
这个工具类就只是简单的用来向指定用户的邮箱发送他的注册信息。
继承Thread实现run()方法,由于发送邮件需要连接服务器可能会耗时比较多,因此通过多线程的方式避免空白等待时间,提升用户体验。
package com.kun.utils;
import com.kun.entity.User;
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.util.Properties;
//网站3秒原则:用户体验
//多线程实现用户体验!(异步处理)
public class SendMail extends Thread{
//发送方邮箱
private String fromMail = "317557750@qq.com";
//邮箱用户名
private String username = "317557750@qq.com";
//邮箱密码(授权码)
private String password = "misxauephvtfcaij";
//服务器地址
private String serverHost = "smtp.qq.com";
private User user;
public SendMail(User user) {
this.user = user;
}
public void run() {
try {
Properties prop = new Properties();
prop.setProperty("mail.host",serverHost);//设置QQ邮件服务器
prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
prop.setProperty("main.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发送邮件的5个步骤
//1.创建定义整个应用程序所需的环境信息的Session对象
//QQ才有!其他邮箱不用
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts = session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect(serverHost,username,password);
//4.创建邮件
//注意需要传递session
MimeMessage msg = new MimeMessage(session);
//邮件发件人
msg.setFrom(new InternetAddress(fromMail));
//邮件接收人
msg.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getMail()));
//邮件标题
msg.setSubject("注册信息");
//邮件的文本内容
msg.setContent("<h1 style='color:red'>"+user+"</h1>","text/html;charset=UTF-8");
//5.发送邮件
ts.sendMessage(msg,msg.getAllRecipients());
//6.关闭连接
ts.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
Servlet RegisterServlet
这里通过调用start()方法启动线程,如果使用run()方法则会在当前线程中执行。
package com.kun.servlet;
import com.kun.entity.User;
import com.kun.utils.SendMail;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收用户请求 封装成对象
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
User user = new User(username, password, email);
//用户注册成功之后 给用户发送一封邮件
//我们使用线程来专门发送邮件 防止出现耗时 和网站注册人数过多的情况
SendMail send = new SendMail(user);
//启动线程 线程启动之后就会执行run方法来发送邮件
send.start();
//注册用户
req.setAttribute("message","注册成功,我们已经发送带了注册信息的电子邮件,请查收!如网络不稳定,可能过一会才能收到!!");
req.getRequestDispatcher("info.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注册Servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>com.kun.servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/RegisterServlet</url-pattern>
</servlet-mapping>
</web-app>
运行




本博客参考 B站 狂神说Java
本文详细介绍了使用JavaMail发送邮件的步骤,包括依赖配置、获取授权码、不同类型的邮件(普通文本、内嵌资源、混合邮件)的创建与发送。此外,还展示了如何在Web环境中集成JavaMail,通过Tomcat配置、Servlet和实体类实现用户注册邮件的发送。
1907

被折叠的 条评论
为什么被折叠?



