实体类
@Data
public class Email {
/**
*发件人邮箱
*/
private String fromEmail;
/**
*发件人名称,例:"青岛港国际物流有限公司"
*/
private String fromEmailName;
/**
*发件人邮箱密码
*/
private String fromEmailPassword;
/**
*发件人邮箱服务器地址
*/
private String smtp;
/**
* 是否使用ssl连接
*/
private boolean SSLFlag;
/**
* SSL 连接时,需要改为对应邮箱的 SMTP 服务器的端口
*/
private String smtpPort;
/**
*收件人邮箱,多个收件人使用";"分隔
*/
private String toEmail;
/**
*邮件标题
*/
private String emailTitle;
/**
*邮件内容(普通正文,无图片的情况)
*/
private String emailContent;
/**
* 邮件内容是否包含图片
*/
private boolean pictureFlag;
/**
* 包含正文和图片的内容
*/
private MimeBodyPart picContent;
/**
* 是否添加附件
*/
private boolean attachmentFlag;
/**
* 附件
*/
private DataSource attachmentData;
/**
* 附件名称
*/
private String attachmentName;
/**
* 记录错误信息。提前放入关键信息,用于trycatch的时候获取信息,该字段不用于发送邮件
*/
private String errorInfo;
/**
* 记录错误信息。提前放入关键信息,用于trycatch的时候获取信息,该字段不用于发送邮件
*/
private String errorInfo2;
}
工具类
package com.chenay.wms.util;
import com.chenay.bean.entity.wms.Email;
import org.apache.commons.lang3.StringUtils;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.util.Date;
import java.util.Properties;
/**
* 邮件发送方法
*/
public class EmailUtil {
public static void sendEmail(Email email) throws Exception {
String myEmailAccount;
String myEmailPassword;
String myEmailSMTPHost;
// 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
// PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),
// 对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
// 网易126邮箱的 SMTP 服务器地址为: smtp.126.com qq为smtp.qq.com
if (StringUtils.isNotBlank(email.getFromEmail())&&StringUtils.isNotBlank(email.getFromEmailPassword())&&StringUtils.isNotBlank(email.getSmtp())){
myEmailAccount = email.getFromEmail();
myEmailPassword = email.getFromEmailPassword();
myEmailSMTPHost = email.getSmtp();
}else {
throw new RuntimeException("发件人账号信息缺失");
}
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
// 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
// 取消下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
// 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
// QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
if(email.isSSLFlag()){
final String smtpPort = email.getSmtpPort();
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);
}
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getInstance(props);
// 设置为debug模式, 可以查看详细的发送 log
session.setDebug(true);
// 3. 创建一封邮件
MimeMessage message = createMimeMessage(session,email);
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
//
// PS_01: 如果连接服务器失败, 都会在控制台输出相应失败原因的log。
// 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接,
// 根据给出的错误类型到对应邮件服务器的帮助网站上查看具体失败原因。
//
// PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
// (1) 邮箱没有开启 SMTP 服务;
// (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
// (3) 邮箱服务器要求必须要使用 SSL 安全连接;
// (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
// (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
//
transport.connect(myEmailAccount, myEmailPassword);
// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
transport.close();
}
/**
* 创建一封只包含文本的简单邮件
*
* @param session 和服务器交互的会话
* @param email 邮件实体类
* @return message
* @throws Exception
*/
public static MimeMessage createMimeMessage(Session session,Email email) throws Exception {
// 1. 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
message.setFrom(new InternetAddress(email.getFromEmail(),email.getFromEmailName(), "UTF-8"));
// 3. To: 收件人(可以增加多个收件人、抄送、密送)
InternetAddress[] addressesTo = null;
if (email.getToEmail() != null && email.getToEmail().trim().length() > 0) {
String[] receiveList = email.getToEmail().split(";");
int receiveCount = receiveList.length;
if (receiveCount > 0) {
addressesTo = new InternetAddress[receiveCount];
for (int i = 0; i < receiveCount; i++) {
addressesTo[i] = new InternetAddress(receiveList[i]);
}
}
}
//to、cc(carbon copy)和bcc(blind carbon copy),分别是收件人、抄送、密送
message.setRecipients(MimeMessage.RecipientType.TO,addressesTo);
// 4. Subject: 邮件主题
message.setSubject(email.getEmailTitle(), "UTF-8");
// 5.设置邮件内容及附件
MimeMultipart multipart = new MimeMultipart();
MimeBodyPart contentPart = new MimeBodyPart();
//添加邮件内容
if(email.isPictureFlag()){
//包含图片的正文
multipart.addBodyPart(email.getPicContent());
}else{
contentPart.setContent(email.getEmailContent(), "text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
}
//添加附件
if (email.isAttachmentFlag()) {
MimeBodyPart filePart = new MimeBodyPart();
//添加附件的内容
filePart.setDataHandler(new DataHandler(email.getAttachmentData()));
//设置附件名称
filePart.setFileName(MimeUtility.encodeText(email.getAttachmentName()));
multipart.addBodyPart(filePart);
multipart.setSubType("mixed");
}
message.setContent(multipart);
// 6. 设置发件时间
message.setSentDate(new Date());
// 7. 保存设置
message.saveChanges();
return message;
}
/**
* 根据传入的邮件正文body和文件路径创建图文并茂的正文部分
*/
public static MimeBodyPart createContent(String body, String fileName)
throws Exception {
// 用于保存最终正文部分
MimeBodyPart contentBody = new MimeBodyPart();
// 用于组合文本和图片,"related"型的MimeMultipart对象
MimeMultipart contentMulti = new MimeMultipart("related");
// 正文的文本部分
MimeBodyPart textBody = new MimeBodyPart();
textBody.setContent(body, "text/html;charset=gbk");
contentMulti.addBodyPart(textBody);
// 正文的图片部分
MimeBodyPart jpgBody = new MimeBodyPart();
FileDataSource fds = new FileDataSource(fileName);
jpgBody.setDataHandler(new DataHandler(fds));
//正文html中的cid与之对应
jpgBody.setContentID("picture");
contentMulti.addBodyPart(jpgBody);
// 将上面"related"型的 MimeMultipart 对象作为邮件的正文
contentBody.setContent(contentMulti);
return contentBody;
}
}
调用
例一,表格
//在此只对内容进行展示,其它同理
// 空格  一次空半个中文的长度
StringBuilder content = new StringBuilder("尊敬的客户:<p> 您好!贵司XX人员" + signEmailVo.getLdrName() + "于" + contentDate + "列表如下:</p>");
for(String billNo : billNoList){
content.append("<p> ").append(billNo).append(";</p>");
}
content.append("<p> ").append("请查收!").append("</p>");
signEmailVo.setEmailContent(content.toString());
//发送邮件
SignEmailUtil.sendEmail(signEmailVo);
例二 正文包含图片
//组成邮件
Email email = new Email();
content = "<font size=\"4px\" color=\"#000000\">您好:<br/>    "+"“"+title+"”"+" 烦请查收。"+"</font>" + "<p> </P>" +
"<hr width=\"200\" size=\"1\" noshade=\"noshade\" align=\"left\" color=\"#000000\" />" +
"<p>Best regards</P>";
content += "<p>"+createName+"</P>"
+"<p>*******************************************************************************************</P>"
+ "<img src = \"cid:picture\"></a>"
+"<p>"+EmailName+"</P>"
+"<p>"+EmailEnName+"</P>"
+"<p>TEL:"+createPhone+"  FAX:"+EmailFax+"</P>"
+"<p>Email:"+createEmail+"</P>";
email.setFromEmail(EmailAccount);
email.setFromEmailName(EmailName);
email.setFromEmailPassword(EmailPassword);
email.setSmtp(EmailSMTPHost);
content += "<p>*******************************************************************************************</P>";
email.setToEmail(StringUtils.join(receiveEmailList,";"));
email.setEmailTitle(title);
// email.setEmailContent(content);
email.setAttachmentFlag(true);
email.setAttachmentData(pdfSource);
//这里加上后缀
email.setAttachmentName(title+".pdf");
email.setErrorInfo(xxxxxxxx);
email.setErrorInfo2(xxxxxxx);
//获取logo图片的绝对路径
URL url = this.getClass().getClassLoader().getResource("template/logo.png");
MimeBodyPart picContent = EmailUtil.createContent(content, url.getFile());
email.setPictureFlag(true);
email.setPicContent(picContent);