Azure Linux虚拟机Java应用通过O365连接SMTP中继失败求助
已知配置信息
你计划使用的O365 SMTP中继参数如下:
- SMTP主机:
smtp.office365.com - 端口:
587 - 启用TLS:
true - 认证账户UID:
UID-O365 - 认证账户密码:
PWD-O365
遇到的错误
发送测试邮件时触发以下异常:
MailException: com.sun.mail.smtp.SMTPSendFailedException: 501 5.1.7 Invalid address [AM4P190MB0211.EURP190.PROD.OUTLOOK.COM] ; nested exception is: com.sun.mail.smtp.SMTPSenderFailedException: 501 5.1.7 Invalid address [AM4P190MB0211.EURP190.PROD.OUTLOOK.COM]
问题分析与解决办法
这个501 5.1.7错误核心是O365判定发件人地址格式无效,和Azure Linux环境、Java开发语言关系不大,主要是发件人地址的配置不符合O365的要求,下面是具体的排查方向:
发件人地址必须是完整有效的邮箱格式:O365不接受纯UID作为发件人,你需要确保代码中设置的发件人是一个完整的邮箱地址(比如
your-account@your-domain.com),而不是仅用UID-O365。如果你的UID是账户前缀,那对应的完整邮箱就是UID-O365@your-domain.com。发件人地址需与认证账户匹配:O365的SMTP中继默认要求发件人地址必须和你用来认证的
UID-O365对应的邮箱一致。如果代码里设置的发件人是另一个邮箱,需要先在O365后台配置该认证账户有权限发送这个地址的邮件(比如设置发送权限或创建对应的邮件流规则)。检查代码中地址的拼写与格式:排查Java代码里构建发件人地址的逻辑,有没有多余的空格、特殊字符,或者域名缺失的情况。比如是否不小心写成了
UID-O365@(缺少域名部分),或者邮箱地址有大小写拼写错误?用命令行工具验证SMTP连接:可以在Azure Linux虚拟机上用
swaks工具先做测试,排除代码层面的问题。执行以下命令(替换成你的实际邮箱信息):
swaks --to test-recipient@example.com --from your-valid-o365-email@domain.com --server smtp.office365.com --port 587 --auth LOGIN --auth-user UID-O365 --auth-password PWD-O365 --tls
如果命令行能成功发送邮件,说明SMTP配置本身没问题,问题肯定出在Java代码的发件人地址设置上;如果命令行也报错,那需要检查O365账户是否开启了SMTP权限,或者有没有被组织的安全策略限制。
内容的提问来源于stack exchange,提问作者mwo




