在项目中,我们可能遇到使用邮箱导出文件的场景,在构建文件过程中有两种,一种是服务器或者其他地方有路径,可以获取文件流;一种是我们不想构建文件路径,只想使用流直接导出文件的情况,由于第一种相对简单,我这里只处理构建流导出方案。
前期准备
- 新建一个springboot项目
- 在pom文件中引入JavaMail的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- 编写邮件发送的代码
@Autowired
private JavaMailSender mailSender;
/**
* 使用JavaMail导出带附件的字节流邮件
* @param subject 邮件主题
* @param fromEmail 发送的邮箱地址
* @param toEmail 收件的邮箱地址
* @param bodyContent 邮件正文内容
* @param fileName 导出到邮箱的附件名称
* @param attachmentByteArray 导出的文件字节数据
*/
@Override
public void exportAttachment(String subject, String fromEmail, String toEmail, String bodyContent, String fileName, byte[] attachmentByteArray) {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
mimeMessage.setFrom(fromEmail);
mimeMessage.setRecipients(Message.RecipientType.TO, toEmail);
mimeMessage.setSubject(subject);
MimeMultipart contentMultipart = new MimeMultipart("mixed");
// 创建附件
MimeBodyPart excelBodyPart = new MimeBodyPart();
DataSource dataSource = new ByteArrayDataSource(attachmentByteArray, "application/octet-stream");
DataHandler dataHandler = new DataHandler(dataSource);
excelBodyPart.setFileName(fileName);
excelBodyPart.setDataHandler(dataHandler);
// 正文内容
MimeBodyPart textBodyPart = new MimeBodyPart();
textBodyPart.setText(bodyContent);
contentMultipart.addBodyPart(excelBodyPart);
contentMultipart.addBodyPart(textBodyPart);
mimeMessage.setContent(contentMultipart);
mailSender.send(mimeMessage);
} catch (MessagingException e) {
throw new BizException("邮件发送失败");
}
}