业务背景及需求:
公司需要统一发送同类型的邮件给一批人时,比如发送员工个人薪资表分别至个人邮箱。
此类邮件标题,内容,发送人等基本一致,且需要带附件,而其附件是收件人的隐私性个人信息
若通过上传文件保存到数据库里然后在发邮件的方式,浪费空间和时间。将远程附件写到磁盘在发送则占据磁盘空间,性能不够优。
直接读取远程文件并发送,省掉上传附件的步骤。也不必占用磁盘空间。
/**
* 发送远程文件邮件
*
* @param to 收件人
* @param subject 邮件主题
* @param content 邮件内容
* @param smbFile 远程文件
*/
public void sendRemoteFile2Mail(Mail mail, MailTemplate mailTmpl, SmbFile smbFile) throws Exception {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(mailTmpl.getMessageSender());
helper.setTo(mail.getEmailAddress());
helper.setSubject(mailTmpl.getMessageSubject());
message.setContent(getMultipart(mailTmpl.getMessageBody(), smbFile));
if (null != mail.getMailCC() && !"".equals(mail.getMailCC())) {
helper.setCc(mail.getMailCC());
}
if (null != mail.getMailBCC() && !"".equals(mail.getMailBCC())) {
helper.setBcc(mail.getMailBCC());
}
mailSender.send(message);
}
/**
* 获取Multipart对象,包含正文内容、附件、文件名
*
* @return
*/
private Multipart getMultipart(String content, SmbFile smbFile) throws Exception {
Multipart multipart = new MimeMultipart();
// 向multipart中添加正文
BodyPart contentBody = new MimeBodyPart();
contentBody.setContent(content, "text/html;charset=UTF-8");
multipart.addBodyPart(contentBody);
// 向multipart中添加远程附件
MimeBodyPart fileBody = new MimeBodyPart();
DataSource source = new ByteArrayDataSource(new BufferedInputStream(new SmbFileInputStream(smbFile)),
"application/html");
fileBody.setDataHandler(new DataHandler(source));
fileBody.setFileName(MimeUtility.encodeText(smbFile.getName(), "UTF-8", "B"));
multipart.addBodyPart(fileBody);
return multipart;
}
其中Mail与MailTemplate为自建的Java类,
邮件模板MailTemplate包含邮件的标题,正文,类型,邮件统一发件人等信息;而Mail包含收件人,抄送人,密抄送人等信息。
简化版可以为:(最普通的邮件类型,无抄送人等)
/**
* 发送邮件
*
* @param mail
* @throws UnsupportedEncodingException
* @throws MessagingException
*/
public static void sendMail(Mail mail) throws UnsupportedEncodingException, MessagingException {
/*
* 动态存入mail params: from:发送人账号 fromName:发送人姓名 subject:邮件主题 to:收件人账号 content:邮件内容
*/
// 设置邮件内容
JavaMailSenderImpl mailSender = createMimeMessage();
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
messageHelper.setFrom(mail.getFrom());
messageHelper.setSubject(mail.getSubject());
messageHelper.setText(mail.getContent());
messageHelper.setTo(mail.getTo());
mailSender.send(mimeMessage);
}