JavaMail 报错:554 Sender address not allowed for this authenticated session
项目场景#
本地测试使用JavaMail 发送邮件,输入:
- 发件人信息:
发件人邮箱
,邮箱密码
,smtp地址
- 收件人信息:
收件人邮箱
,邮件主题
,邮件正文
然后完成发送。
问题描述#
当使用A发件人的邮箱和密码成功发出一封邮件后,再改用B发件人的邮箱和密码发送邮件失败。报异常 : com.sun.mail.smtp.SMTPSendFailedException: 554 Sender address not allowed for this authenticated session
。
原因分析#
偶然间发现,当重启应用后,使用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
这个对象是单例的,如果已经存在就不会创建新的。
解决方案#
找到问题就好解决了,只要保证每次的Session对象是新new来的就行,可以使用javax.mail.Session类中的getInstance()
方法。
建议使用 Spring 的 JavaMailSender
+MimeMessageHelper
来发邮件
作者:Charlton
出处:https://www.cnblogs.com/charlton/p/17600131.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!