JavaMail 报错:554 Sender address not allowed for this authenticated session

发布时间 2023-08-02 11:30:21作者: CharltonW

项目场景

本地测试使用JavaMail 发送邮件,输入:

  • 发件人信息:发件人邮箱邮箱密码smtp地址
  • 收件人信息:收件人邮箱邮件主题邮件正文

然后完成发送。

问题描述

当使用A发件人的邮箱和密码成功发出一封邮件后,再改用B发件人的邮箱和密码发送邮件失败。报异常 : com.sun.mail.smtp.SMTPSendFailedException: 554 Sender address not allowed for this authenticated session

image

原因分析

偶然间发现,当重启应用后,使用B邮箱账户发邮件成功,然后再切回A邮箱账户也报错了。查看代码,怀疑可能 javax.mail.Session 这个对象保留了上一个邮箱账户的信息,导致后面切换其他发件人账户都会发送失败。

// 判断是否需要身份认证
SimpleAuthenticator authenticator = null;
Properties props = new Properties();
props.put("mail.smtp.host", "smtp地址");
props.put("mail.smtp.auth", "true");
// 如果需要身份认证,则创建一个密码验证器
authenticator = new SimpleAuthenticator("发件人邮箱", "发件人邮箱密码");

// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session sendMailSession = Session.getDefaultInstance(props, authenticator);

// 根据 sendMailSession 构建MimeMessage对象
MimeMessage mailMessage = xxx;

// 发送邮件
Transport.send(mailMessage);

查看getDefaultInstance()发现:defaultSession这个对象是单例的,如果已经存在就不会创建新的。

image

解决方案

找到问题就好解决了,只要保证每次的Session对象是新new来的就行,可以使用javax.mail.Session类中的getInstance()方法。

image

建议使用 SpringJavaMailSender +MimeMessageHelper来发邮件