Java Mail 发送邮件
详细 Spring 如何进行邮件发送
本文由乐字节 Java 架构课程独家赞助播出
发送普通文本的邮件
package com.xxxx.mail;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
/**
* 发送普通文本的邮件
*/
public class MailTest01 {public static void main(String[] args) throws Exception {
// 定义邮箱服务器配置
Properties prop = new Properties();
// 设置邮件服务器主机名(163 邮件服务器地址:"mail.smtp.host" "smtp.163.com")prop.setProperty("mail.smtp.host", "smtp.163.com");
// 设置邮件服务器的端口
prop.setProperty("mail.smtp.port", "25");
// 设置邮件服务器认证属性(设置为 true 表示发送服务器需要身份验证)prop.setProperty("mail.smtp.auth", "true");
// 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证
// prop.setProperty("mail.smtp.port", "465");
// prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
// prop.setProperty("mail.smtp.socketFactory.fallback", "false");
// prop.setProperty("mail.smtp.socketFactory.port", "465");
// 使用 JavaMail 发送邮件的 5 个步骤
// 1. 创建 session
Session session = Session.getInstance(prop);
// 开启 Session 的 debug 模式,这样就可以查看到程序发送 Email 的运行状态
session.setDebug(true);
// 2. 通过 session 得到 transport 对象
Transport ts = session.getTransport();
// 3. 使用邮箱的用户名和密码连上邮件服务器(用户名只需写 @前面的即可,密码是指授权码)ts.connect("smtp.163.com", "用户名", "密码");
// 4. 创建邮件
// 发送普通文本的邮件
Message message = createSimpleTxtMail(session);
// 5. 发送邮件
ts.sendMessage(message, message.getAllRecipients());
// 关闭 transport 对象
ts.close();}
/**
* 普通文本邮件
* 创建一封只包含文本的邮件
* @param session
* @return
*/
public static MimeMessage createSimpleTxtMail(Session session) throws MessagingException {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 设置邮件的发件人的邮箱地址
message.setFrom(new InternetAddress("发件人的邮箱地址"));
// 设置邮件的收件人的邮箱地址(现在发件人和收件人是一样的,那就是自己给自己发)message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的邮箱地址"));
// 发送给多个收件人
// message.setRecipients(Message.RecipientType.TO, new InternetAddress[] {});
// Cc: 抄送(可选)// message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(""));
// Bcc: 密送(可选)// message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(""));
// 邮件的主题
message.setSubject("测试文本邮件");
// 设置发送日期
message.setSentDate(new Date());
// 邮件的文本内容(setText():纯文本内容)message.setText("你好,这是一封测试邮件!");
// 返回创建好的邮件对象
return message;
}
}
效果如下:
![]()
发送 HTML 内容的邮件
package com.xxxx.mail;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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.MimeMultipart;
import java.util.Date;
import java.util.Properties;
/**
* 发送 HTML 内容的邮件
*/
public class MailTest02 {public static void main(String[] args) throws Exception {
// 定义邮箱服务器配置
Properties prop = new Properties();
// 设置邮件服务器主机名(163 邮件服务器地址:"mail.smtp.host" "smtp.163.com")prop.setProperty("mail.smtp.host", "smtp.163.com");
// 设置邮件服务器的端口
prop.setProperty("mail.smtp.port", "25");
// 设置邮件服务器认证属性(设置为 true 表示发送服务器需要身份验证)prop.setProperty("mail.smtp.auth", "true");
// 使用 JavaMail 发送邮件的 5 个步骤
// 1. 创建 session
Session session = Session.getInstance(prop);
// 开启 Session 的 debug 模式,这样就可以查看到程序发送 Email 的运行状态
session.setDebug(true);
// 2. 通过 session 得到 transport 对象
Transport ts = session.getTransport();
// 3. 使用邮箱的用户名和密码连上邮件服务器(用户名只需写 @前面的即可,密码是指授权码)ts.connect("smtp.163.com", "用户名", "密码");
// 4. 创建邮件
// 发送 HTML 内容的邮件
Message message = createHtmlMail(session);
// 5. 发送邮件
ts.sendMessage(message, message.getAllRecipients());
// 关闭 transport 对象
ts.close();}
/**
* HTML 内容邮件
* 创建一封包含 html 内容的邮件
*/
public static MimeMessage createHtmlMail(Session session) throws Exception {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 设置邮件的发件人的邮箱地址
message.setFrom(new InternetAddress("发件人的邮箱地址"));
// 设置邮件的收件人的邮箱地址(现在发件人和收件人是一样的,那就是自己给自己发)message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的邮箱地址"));
// 邮件的主题
message.setSubject("测试 HTML 邮件");
// 设置发送日期
message.setSentDate(new Date());
// 准备邮件数据
/**
* Message 表示一个邮件,messgaes.getContent() 返回一个 Multipart 对象。* 一个 Multipart 对象包含一个或多个 BodyPart 对象,来组成邮件的正文部分(包括附件)。*/
// 创建多媒体对象
MimeMultipart multipart = new MimeMultipart();
// 创建邮件体对象
MimeBodyPart bodyPart = new MimeBodyPart();
// 设置 HTML 内容
StringBuffer sb = new StringBuffer();
sb.append("<html><body><a href='http://www.baidu.com'> 百度一下 </a></body></html>");
bodyPart.setContent(sb.toString(), "text/html;charset=UTF-8");
// 将 bodyPart 对象设置到 multipart 对象中
multipart.addBodyPart(bodyPart);
// 将 multipart 对象设置到 message 对象中(setContent():)message.setContent(multipart);
// 返回创建好的邮件对象
return message;
}
}
效果如下:
![]()
发送包含附件的邮件
package com.xxxx.mail;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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.MimeMultipart;
import java.util.Date;
import java.util.Properties;
/**
* 发送包含附件的邮件
*/
public class MailTest03 {public static void main(String[] args) throws Exception {
// 定义邮箱服务器配置
Properties prop = new Properties();
// 设置邮件服务器主机名(163 邮件服务器地址:"mail.smtp.host" "smtp.163.com")prop.setProperty("mail.smtp.host", "smtp.163.com");
// 设置邮件服务器的端口
prop.setProperty("mail.smtp.port", "25");
// 设置邮件服务器认证属性(设置为 true 表示发送服务器需要身份验证)prop.setProperty("mail.smtp.auth", "true");
// 使用 JavaMail 发送邮件的 5 个步骤
// 1. 创建 session
Session session = Session.getInstance(prop);
// 开启 Session 的 debug 模式,这样就可以查看到程序发送 Email 的运行状态
session.setDebug(true);
// 2. 通过 session 得到 transport 对象
Transport ts = session.getTransport();
// 3. 使用邮箱的用户名和密码连上邮件服务器(用户名只需写 @前面的即可,密码是指授权码)ts.connect("smtp.163.com", "用户名", "密码");
// 4. 创建邮件
// 发送包含附件的邮件
Message message = createAttachMail(session);
// 5. 发送邮件
ts.sendMessage(message, message.getAllRecipients());
// 关闭 transport 对象
ts.close();}
/**
* 包含附件的邮件
* 创建一封包含附件的邮件
* @param session
* @return
* @throws MessagingException
*/
public static MimeMessage createAttachMail(Session session) throws MessagingException {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 设置邮件的发件人的邮箱地址
message.setFrom(new InternetAddress("发件人的邮箱地址"));
// 设置邮件的收件人的邮箱地址(现在发件人和收件人是一样的,那就是自己给自己发)message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的邮箱地址"));
// 邮件的主题
message.setSubject("测试包含附件的邮件");
// 设置发送日期
message.setSentDate(new Date());
// 创建邮件正文
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent("使用 JavaMail 创建的带附件的邮件", "text/html;charset=UTF-8");
// 创建附件
MimeBodyPart attachPart = new MimeBodyPart();
// 本地文件
DataHandler dh = new DataHandler(new FileDataSource("C:\\work\\ 邮件附件.txt"));
attachPart.setDataHandler(dh);
// 附件名
attachPart.setFileName(dh.getName());
// 创建容器描述数据关系
MimeMultipart multipart = new MimeMultipart();
// 添加正文
multipart.addBodyPart(bodyPart);
// 添加附件
multipart.addBodyPart(attachPart);
// 如果在邮件中要添加附件,设置为 mixed;。multipart.setSubType("mixed");
// 设置邮件的内容
message.setContent(multipart);
// 返回创建好的邮件对象
return message;
}
}
效果如下:
![]()
Java Mail 邮件发送封装
创建邮件发送信息类
package com.xxxx.mail;
import java.util.List;
/**
* 邮件发送信息类
* 定义发送邮件时 邮件服务器 端口 发送方用户名 密码等字段
*/
public class MailSendInfo {
private String serverHost; // 服务器主机
private String serverPort; // 服务器端口
private String fromAddress;// 发送方邮箱地址
private List<String> toAddress; // 接收方邮箱地址
private String userName; // 邮件服务器用户名
private String userPwd; // 邮件服务器密码(授权密码)private String subject; // 邮件主题
private String content; // 邮件内容
private Boolean flag = true; // 是否需要身份认证
private List<String> attachFileNames; // 附件文件名
public Boolean getFlag() {return flag;}
public void setFlag(Boolean flag) {this.flag = flag;}
public String getServerHost() {return serverHost;}
public void setServerHost(String serverHost) {this.serverHost = serverHost;}
public String getServerPort() {return serverPort;}
public void setServerPort(String serverPort) {this.serverPort = serverPort;}
public String getFromAddress() {return fromAddress;}
public void setFromAddress(String fromAddress) {this.fromAddress = fromAddress;}
public List<String> getToAddress() {return toAddress;}
public void setToAddress(List<String> toAddress) {this.toAddress = toAddress;}
public String getUserName() {return userName;}
public void setUserName(String userName) {this.userName = userName;}
public String getUserPwd() {return userPwd;}
public void setUserPwd(String userPwd) {this.userPwd = userPwd;}
public String getSubject() {return subject;}
public void setSubject(String subject) {this.subject = subject;}
public String getContent() {return content;}
public void setContent(String content) {this.content = content;}
public List<String> getAttachFileNames() {return attachFileNames;}
public void setAttachFileNames(List<String> attachFileNames) {this.attachFileNames = attachFileNames;}
}
创建认证类
package com.xxxx.mail;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* 认证类
*/
public class MyAuthenticator extends Authenticator {
private String userName; // 邮箱
private String userPwd; // 密码(授权码)public MyAuthenticator(String userName, String userPwd) {
this.userName = userName;
this.userPwd = userPwd;
}
/**
* 邮件服务器发送邮件时,进行身份验证
* @return
*/
@Override
protected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(userName, userPwd);
}
}
创建邮件发送器
package com.xxxx.mail;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;
public class MailSender {public void sendMail(MailSendInfo mailSendInfo){
Message message = null;
Session session = null;
try {
// 定义邮箱服务器配置
Properties props = new Properties();
// 163 邮件服务器地址
props.put("mail.smtp.host", mailSendInfo.getServerHost());
// 163 邮件服务器端口
props.put("mail.smtp.port",mailSendInfo.getServerPort());
// 163 邮件服务器认证属性
props.put("mail.smtp.auth", mailSendInfo.getFlag());
// 身份认证类
MyAuthenticator authenticator = new MyAuthenticator(mailSendInfo.getUserName(), mailSendInfo.getUserPwd());
// 创建 session
session = Session.getDefaultInstance(props, authenticator);
// 开启 Session 的 debug 模式,这样就可以查看到程序发送 Email 的运行状态
session.setDebug(true);
// 创建 message 邮件对象
message = new MimeMessage(session);
// 设置发送方的邮箱地址
Address from = new InternetAddress(mailSendInfo.getFromAddress());
message.setFrom(from);
// 设置发送时间
message.setSentDate(new Date());
// 判断接收方的邮箱地址
if(null != mailSendInfo.getToAddress() && mailSendInfo.getToAddress().size() > 0){
// 定义数组
Address[] addresses = new Address[mailSendInfo.getToAddress().size()];
// 循环获取接收方的邮箱地址,并设置到对应的 address 数组中
for(int i = 0; i < mailSendInfo.getToAddress().size(); i++){Address address = new InternetAddress(mailSendInfo.getToAddress().get(i));
addresses[i] = address;
}
// 设置接收方的邮箱地址
message.setRecipients(Message.RecipientType.TO, addresses);
// 设置邮件主题
message.setSubject(mailSendInfo.getSubject());
// 创建多媒体对象容器
Multipart multipart = new MimeMultipart();
// 创建正文内容
BodyPart bodyPart =new MimeBodyPart();
bodyPart.setContent(mailSendInfo.getContent(),"text/html;charset=utf-8");
// 添加正文(将正文内容设置到多媒体对象容器中)multipart.addBodyPart(bodyPart);
// 获取所有的附件内容
List<String> files = mailSendInfo.getAttachFileNames();
// 判断是否包含附件内容
if(null != files && files.size() > 0){for(int i = 0; i < files.size(); i++){
// 获取对应的附件对象
File tempFile = new File(files.get(i));
// 判断附件是否存在
if(tempFile.exists()){
// 如果附件存在,创建附件对象
BodyPart attachPart = new MimeBodyPart();
attachPart.setDataHandler(new DataHandler(new FileDataSource(tempFile)));
// 设置文件名(解决附件名乱码)attachPart.setFileName(MimeUtility.encodeText(tempFile.getName()));
// 添加附件(将附件内容添加到多媒体对象容器中)multipart.addBodyPart(attachPart);
}
}
}
// 设置邮件内容
message.setContent(multipart);
// 发送邮件
Transport.send(message);
}
} catch (Exception e) {e.printStackTrace();
}
}
}
邮件发送测试
发送 HTML 内容的邮件
/**
* 发送 HTML 内容的邮件
*/
public static void testHtmlMail() {MailSendInfo mailSendInfo = new MailSendInfo();
mailSendInfo.setServerHost("smtp.163.com");
mailSendInfo.setServerPort("25");
mailSendInfo.setUserName("邮箱用户名");
mailSendInfo.setUserPwd("密码(授权码)");
mailSendInfo.setSubject("邮件封装");
mailSendInfo.setFromAddress("发件人的邮箱地址");
mailSendInfo.setContent("<h2> 这是封装后发送的邮件 </h2>");
List<String> users = new ArrayList<>();
users.add("收件人的邮箱地址");
mailSendInfo.setToAddress(users);
MailSender mailSender=new MailSender();
mailSender.sendMail(mailSendInfo);
}
效果如下:
![]()
发送包含附件的邮件
/**
* 发送包含附件的邮件
*/
public static void testAttachMail() {MailSendInfo mailSendInfo = new MailSendInfo();
mailSendInfo.setServerHost("smtp.163.com");
mailSendInfo.setServerPort("25");
mailSendInfo.setUserName("用户名");
mailSendInfo.setUserPwd("密码(授权码)");
mailSendInfo.setSubject("邮件封装");
mailSendInfo.setFromAddress("发件人的邮箱地址");
mailSendInfo.setContent("<h2> 包含附件的邮件 </h2>");
List<String> users = new ArrayList<>();
users.add("收件人的邮箱地址");
mailSendInfo.setToAddress(users);
// 添加附件
List<String> files=new ArrayList<String>();
files.add("C:\\work\\ 邮件附件.txt");
files.add("C:\\work\\ 名单.xlsx");
mailSendInfo.setAttachFileNames(files);
MailSender mailSender=new MailSender();
mailSender.sendMail(mailSendInfo);
}
效果如下:
![]()