使用JavaMail发送邮件 - 端口25,STARTTLS,身份验证

时间:2014-08-26 21:21:41

标签: java smtp javamail

我正在尝试向侦听端口25的SMTP服务器发送电子邮件,使用STARTTLS并要求身份验证。

据我了解,客户应该

  • 使用EHLO clientName
  • 与服务器打招呼
  • 使用STARTTLS
  • 启动TLS
  • 使用AUTH LOGIN
  • 进行身份验证
  • 继续使用RCPT TO
  • 发送电子邮件

我的简化代码是

String protocol = "smtp";

Properties props = new Properties();
props.put("mail.debug", "true");
props.put("mail." + protocol + ".auth", true);
props.put("mail." + protocol + ".host", smtpHost);
props.put("mail." + protocol + ".starttls.required", true);

Session session = Session.getInstance(props);

InternetAddress[] recipients = InternetAddress.parse(username);

Message message = buildMessage(session, username, recipients);

Transport t = session.getTransport(protocol);
t.connect(username, password);

t.sendMessage(message, recipients);

据我所知,这应该可行,但调试输出显示它挂起

STARTTLS
220 2.0.0 Ready to start TLS

删除starttls.required属性会导致服务器拒绝访问,因为AUTH命令永远不会出现,除非发出STARTTLS

MAIL FROM:<deliverytest@somedomain.com>
250 2.1.0 Ok
RCPT TO:<deliverytest@somedomain.com>
554 5.7.1 Service unavailable; Client host [50.16.63.26] blocked using zen.spamhaus.org; http://www.spamhaus.org/query/bl?ip=50.16.63.26

让Javamail与我的设置一起工作的正确咒语是什么?

3 个答案:

答案 0 :(得分:1)

这里有两件事是错误的

  1. 看来远程端口不支持端口25上的TLS
  2. 它在没有TLS的情况下成功连接,但您发送的IP地址在Spamhaus上被识别为SPAM发送方(或者可能只是ISP DHCP地址),并且阻止使用该服务器发送邮件。
  3. 如果您按照错误(http://www.spamhaus.org/query/bl?ip=50.16.63.26)中给出的链接进行操作,则会转到显示

    的页面
      

    参考:PBL1522093

         

    50.16.0.0/16列在策略阻止列表(PBL)

    上      

    适用于此IP范围的Amazon Web Services EC2的出站电子邮件策略:

         

    Amazon Web Services EC2的政策是,此IP地址发送的未经身份验证的电子邮件应仅通过分配给Amazon Web Services EC2客户的指定出站邮件服务器发送。要查找要使用的正确邮件服务器的主机名,客户应查阅原始注册文档或联系Amazon Web Services EC2技术支持。

    换句话说,您必须通过亚马逊为您提供的SMTP服务器发送所有外发邮件。您不能直接发送电子邮件,任何使用Spamhaus的接收主机(许多,如果不是大多数)将阻止您尝试这样做。

答案 1 :(得分:1)

你做得对。你确定它挂了而且没有抛出意想不到的异常吗?如果它挂起,堆栈跟踪显示的是什么?

答案 2 :(得分:0)

原来,原始代码正常运行。我被两个错误发送出去了:

  • 我没有查看实际的电子邮件帐户,看看是否已发送电子邮件 - 而且确实如此。
  • 我使用的线程池没有关闭,因此程序似乎挂起了

OTOH,Javamail调试模式可以让我知道实际发送消息的时间。