网上很多都是从本地服务目录读取文件进行发送,实际项目中可能需求不一样,可能附件数据是以base64数据或者字节流形式传输给服务端,因此就需要自定义,无法通过本地目录读取,下面介绍如何通过字节流的形式发送附件。
首先要添加依赖包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
重点:将附件以字节流的形式发送。
@Slf4j
@Service
public class MailSendService {
@Resource
private JavaMailSender javaMailSender;
/**
* 发送带附件的邮件
* @param request
*/
public boolean sendAttachmentMail(EmailRequest request) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
// true表示构建一个可以带附件的邮件对象
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("fajianren@qq.com");
helper.setTo("shoujianren@qq.com");
helper.setSubject("标题");
helper.setText("内容");
byte[] byteArray = "字节流内容".getBytes();
if (byteArray != null){
//封装字节流,以数组流的形式作为附件发送。
ByteArrayResource bar = new ByteArrayResource(byteArray);
helper.addAttachment(request.getAttachmentName(), bar);
javaMailSender.send(mimeMessage);
return true;
}else{
log.info("sendAttachmentMail attachment is empty:{}", request.getAttachmentPath());
return false;
}
} catch (Exception e) {
log.error("sendAttachmentMail error:{}", e.getMessage(), e);
return false;
}
}
}
网上查到大部分都是读取本地目录文件形式:
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
helper.addAttachment(fileName, file);
每个人根据自己传输内容不通可以选用不通过的形式,也可以自定义自己的实现方式: