javaMail直接发送附件,无须生成临时文件

以excel附件为例:

先引入依赖:

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>

邮件发送服务:

@Service
public class MailService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    private final JavaMailSender sender;
    
    @Value("${spring.mail.username}")
    private String from;
 
    public MailService(JavaMailSender sender) {
        this.sender = sender;
    }
 
    /**
     * 利用helper设置各种邮件发送相关的信息
     */
    private MimeMessageHelper setInfoByHelper(String to, String subject, String content, MimeMessage message)
            throws MessagingException {
        //true表示需要创建一个multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);
        return helper;
    }



 /**
     * 发送带附件的邮件
     * @param to 收件人列表
     * @param subject 邮件标题
     * @param content 邮件内容
     * @param inputStreamSource 附件streamSource,可以这样获得:new ByteArrayResource(ByteArrayOutputStream.toByteArray());
     * @param fileName 附件的文件名
     */
    public void sendAttachmentsMail(String to, String subject, String content, InputStreamSource inputStreamSource, String fileName){
        MimeMessage message = sender.createMimeMessage();
 
        try {
            MimeMessageHelper helper = setInfoByHelper(to, subject, content, message);
 
            helper.addAttachment(fileName, inputStreamSource);
 
            sender.send(message);
            logger.debug("带附件的邮件已经发送。");
        } catch (MessagingException e) {
            logger.error("发送带附件的邮件时发生异常!", e);
        }
    }
}

方法调用(测试用例): 利用ByteArrayOutputStream把excel文件输出到bytes[]中,然后由ByteArrayResource包装起来传递给邮件服务。

经验分享 程序员 微信小程序 职场和发展