Java应用发邮件遇550 Relay access denied错误,附配置求排查
这个错误我之前帮不少开发者排查过,核心问题是SMTP服务器拒绝了你的中继请求——简单说就是服务器不认可你的身份,或者配置不对,不让你通过它发送邮件到外部地址。结合你给出的配置,咱们一步步拆解可能的原因和解决办法:
1. 先把SMTP端口改成正确的!
你当前配置的端口是516,但Pepipost的官方SMTP端口根本不是这个啊😅,标准的是587(用于STARTTLS加密)或者25。先把端口改过来:
props.put("mail.smtp.port", "587");
用错端口大概率会导致服务器无法正确处理你的认证请求,直接拒绝中继。
2. 确认SMTP认证信息是否正确配置
虽然你开了mail.smtp.auth = true,但光开这个没用,必须在创建Session的时候传入Pepipost给你的用户名和API密钥(或者密码)。比如:
Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // 替换成你的Pepipost账户用户名和API密钥 return new PasswordAuthentication("your-pepipost-username", "your-pepipost-api-key"); } });
如果没正确传认证信息,服务器根本不知道你是谁,自然会拒绝你用它发邮件。
3. 检查发件人地址是否符合Pepipost的规则
Pepipost对发件人地址有严格要求:必须是你在账户里验证过的域名下的邮箱,比如你验证了yourdomain.com,那发件人得是support@yourdomain.com这种,不能随便用random@gmail.com这种未授权的地址。如果发件人不符合要求,服务器也会拒绝中继。
4. 排查收件人地址格式是否合法
错误里的Invalid Addresses也可能是因为收件人邮箱格式错了,比如少了@、域名拼写错误(比如example.con)。你可以用JavaMail的InternetAddress.validate()方法提前校验:
InternetAddress toAddress = new InternetAddress("recipient@example.com"); toAddress.validate(); // 如果格式不对会抛出异常
提前排查能避免这类低级错误。
5. 确认SSL/TLS配置没问题
你当前的mail.smtp.starttls.enable = true和mail.smtp.ssl.trust = smtp.pepipost.com配置是对的,改成587端口后,STARTTLS会正常触发加密连接,不用额外改其他SSL相关配置。
总结排查顺序
优先检查端口和认证信息,这两个是最常见的触发原因;如果没问题,再看发件人/收件人地址是否符合要求。
内容的提问来源于stack exchange,提问作者saagar

