Java Mail SMTP硬反弹问题



我们使用Java Mail 1.5 API发送邮件。我们用于开发的SMTP主机没有任何抑制列表,因此,如果任何电子邮件无效,如"xyz@xyz.com"将被发送,尽管它被硬反弹,我们在异常的getInvalidAddresses()中得到它,

但是如果我们尝试一个prod SMTP服务器,它有一个抑制列表,相同的电子邮件"xyz@xyz.com"导致其他电子邮件不被发送,如果他们是同一个to列表的一部分,如"valid@domain.com;xyz@xyz.com",我们的期望至少"valid@domain.com"应该收到电子邮件,但即使没有发送,getInvalidAddresses()为空

com.sun.mail.smtp.SMTPAddressFailedException: 254 4.7.1 - xyz@xyz.com is suppressed for sender smtp.xxx.xxx

public class SendMail {
public static void main(String[] args) {
final String username = "username@domain.com";
final String password = "xxxxxxxxxxxx";
Properties prop = new Properties();
prop.put("mail.smtp.host", "mysmtp.domain.com");
prop.put("mail.smtp.port", "25");
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.sendpartial", "true");
prop.put("mail.smtp.socketFactory.port", "25");
prop.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
Session session = Session.getInstance(prop,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("from@domain.com"));
message.setRecipients(
Message.RecipientType.TO,
InternetAddress.parse("valid@domain.com, xyz@xyz.com")
);
message.setSubject("Test Mail");
message.setText("Test Mail");
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}

如何处理Java Mail API中的抑制列表错误?

您遇到的问题是由电子邮件服务器使用的返回代码254引起的。根据RFC 5321 (RFC 821的最新实施例),没有这样的代码。这个返回码似乎是Oracle的Email Delivery的一个发明。

Java Mail(及其继任者Jakarta Mail)解释(参考源代码)未知:

  • 4xx返回代码为validUnsentAddresses
  • 5xx返回代码为invalidAddresses
  • 2xx返回代码为完全交付失败,因为无法对代码的含义进行有根据的猜测。

在这种情况下,服务器应该可能返回一个550代码,表示"命令因策略原因被拒绝">

最新更新