1.pom引入包
javax.mail
1.4.7
2.Email实体类
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
import java.util.Map;
/**
* @ClassName: Email
* @author: mxy
* @Description: Email的实体类
*/
@Data
@EqualsAndHashCode
@Accessors(chain = true)
public class Email {
/**
* 接收人列表 元素如"10*****787@qq.com"
*/
private List toList;
/**
* (可不填)抄送人列表 元素如"10*****787@qq.com"
*/
private List ccList;
/**
* (可不填)密送人列表 元素如"10*****787@qq.com"
*/
private List bccList;
/**
* (可不填)发送者昵称
*/
private String fromName;
/**
* 发送人(邮箱账号)
*/
private String from;
/**
* 密码(腾讯邮箱为16位授权码)
*/
private String password;
/**
* 邮件主机地址
*/
private String host;
/**
* (可不填)发信端口 默认465
*/
private String port="465";
/**
* 正文
*/
private String text;
/**
* 主题
*/
private String subject;
/**
* (可不填)附件
*/
private List fileList;
/**
* (可不填)要插入的图片 正文需写成html语言,如
* String text = "
HTML+附件+内嵌图片的邮件测试!!!
"* +"点击跳转"
* +"
LOGO图标
"* +"";
* Map imagesMap = new HashMap<>();
* imagesMap.put("logo","D:\\asf_logo_wide.gif");
*/
private Map imagesMap;
3.SendEmailUtils类(SMTP)
将email中的所需属性值注入,调用sendSmtpEmail(email)即可,返回值为Boolean.
import com.bonc.industry.email.pojo.Email;
import com.sun.mail.util.MailSSLSocketFactory;
import lombok.extern.slf4j.Slf4j;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
/**
* @ClassName:sendEmail
* @author:mxy
* @Description: 发送邮件的工具类
*/
@Slf4j
public class SendEmailUtils {
//发送的主要类:涉及到"登录邮箱"-"组装邮件"-"发送".
public static Boolean sendSmtpEmail(Email email){
try {
Properties properties = getProperties(email);
//发送人名称(为空则默认为发送账户)
Session session = getSession(properties, email);
session.setDebug(true);
//创建email
MimeMessage message = getMimeMessage(email, session);
Transport.send(message);
return true;
}catch (Exception e){
log.error("发送失败:"+e.toString());
return false;
}
}
private static MimeMessage getMimeMessage(Email email, Session session) throws Exception {
MimeMessage message = new MimeMessage(session);
// 设置邮件的属性
// 设置发件人
if (!email.getFromName().isEmpty()) {
// 自定义发件人昵称
message.setFrom(new InternetAddress(MimeUtility.encodeText(email.getFromName()) + " "));
} else {
message.setFrom(new InternetAddress(email.getFrom()));
}
// 一对多发送:
// 构建一个群发地址数组(1对多)
InternetAddress[] adr = new InternetAddress[email.getToList().size()];
for (int i = 0; i < adr.length; i++) {
adr[i] = new InternetAddress(email.getToList().get(i));
}
// Message的setRecipients方法支持群发。 收件人
message.setRecipients(Message.RecipientType.TO, adr);
// 设置密送人
if (null!=email.getBccList()&&email.getBccList().size()>0) {
InternetAddress[] internetAddressBCC = new InternetAddress[email.getBccList().size()];
for (int i = 0; i < internetAddressBCC.length; i++) {
internetAddressBCC[i] = new InternetAddress(email.getBccList().get(i));
}
message.setRecipients(Message.RecipientType.BCC, internetAddressBCC);
}
// 设置抄送人
if (null!=email.getCcList()&&email.getCcList().size()>0) {
InternetAddress[] internetAddressCC = new InternetAddress[email.getCcList().size()];
for (int i = 0; i < internetAddressCC.length; i++) {
internetAddressCC[i] = new InternetAddress(email.getCcList().get(i));
}
message.setRecipients(Message.RecipientType.CC, internetAddressCC);
}
/*
* JavaMail API不限制信息只为文本,任何形式的信息都可能作MimeMessage的一部分.
* 除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的. JavaMail
* API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法.
*/
// 设置发生日期
message.setSentDate(new Date());
// 设置邮件的主题
message.setSubject(email.getSubject());
//创建用于组合邮件正文和附件的MimeMultipart对象
MimeMultipart mimeMultipart = new MimeMultipart("mixed");
// 创建邮件的正文
message.setText(email.getText(), "text/html;charset=gb2312");
// 设置HTML内容
MimeBodyPart content = createContent(email.getText(), email.getImagesMap());
mimeMultipart.addBodyPart(content);
// 创建附件
if(null!=email.getFileList()&&email.getFileList().size()>0){
for (String filePath:email.getFileList()){
MimeBodyPart attachmentPart = createAttachment(filePath);
mimeMultipart.addBodyPart(attachmentPart);
}
}
message.setContent(mimeMultipart);
message.saveChanges(); // 保存修改
return message;
}
public static MimeBodyPart createContent(String body, Map imagesMap) throws Exception {
/* 创建代表组合MIME消息的MimeMultipart对象和该对象保存到的MimeBodyPart对象 */
MimeBodyPart content = new MimeBodyPart();
// 创建一个MimeMultipart对象
MimeMultipart multipart = new MimeMultipart();
if (!body.isEmpty()) {
// 创建一个表示HTML正文的MimeBodyPart对象,并将它加入到前面的创建的MimeMultipart对象中
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(body, "text/html;charset=UTF-8");
multipart.addBodyPart(htmlBodyPart);
}
if (imagesMap != null && !imagesMap.isEmpty()) {
for (Map.Entry entry: imagesMap.entrySet()) {
/* 创建一个表示图片的MimeBodyPart对象,并将它加入到前面的创建的MimeMultipart对象中 */
MimeBodyPart pictureBodyPart = new MimeBodyPart();
// FileDataSource用于读取文件数据,并返回代表数据的输入输出流和数据的MIME类型
FileDataSource fileDataSource = new FileDataSource(entry.getValue());
// DataHandler类用于封装FileDataSource对象,并为应用程序提供访问数据的接口
pictureBodyPart.setDataHandler(new DataHandler(fileDataSource));
pictureBodyPart.setContentID(entry.getKey());
multipart.addBodyPart(pictureBodyPart);
}
}
// 将MimeMultipart对象保存到MimeBodyPart对象中
content.setContent(multipart);
return content;
}
/**
* 在 JavaMail 中,可以通过 extends Authenticator 抽象类,在子类中覆盖父类中的
* getPasswordAuthentication() 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail
* 中的这种设计是使用了策略模式(Strategy
*/
public static Session getSession(Properties properties, Email email) {
return Session.getInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//设置发送帐号密码
return new PasswordAuthentication(
email.getFrom(), email.getPassword());
}
});
}
/**
* JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.
* @param email
* @return
* @throws GeneralSecurityException
*/
public static Properties getProperties(Email email) throws GeneralSecurityException {
Properties properties = new Properties();
// 设置发送主机
properties.setProperty("mail.host", email.getHost());
// 设置smtp方式
properties.setProperty("mail.transport.protocol", "smtp");
//设置发送端口
properties.setProperty("mail.smtp.port", email.getPort());
// 使用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);
return properties;
}
/**
* 创建保存附件的MimeBodyPart对象,并且加入附件内容和相应的信息
* @param filepath
* @return
* @throws MessagingException
*/
public static MimeBodyPart createAttachment(String filepath) throws Exception{
MimeBodyPart attachmentPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(filepath);
attachmentPart.setDataHandler(new DataHandler(fds));
attachmentPart.setFileName(MimeUtility.encodeText(fds.getName()));
return attachmentPart;
}
}