【问题标题】:Sending mail using JavaMail - port 25, STARTTLS, authentication使用 JavaMail 发送邮件 - 端口 25、STARTTLS、身份验证
【发布时间】:2014-08-29 14:55:36
【问题描述】:

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

据我了解,客户应该

  • 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 属性会导致服务器拒绝访问,因为除非发出STARTTLS,否则不会出现AUTH 命令

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 与我的设置一起工作的正确咒语是什么?

【问题讨论】:

    标签: java smtp jakarta-mail


    【解决方案1】:

    这里有两个问题

    1. 看来遥控器不支持端口 25 上的 TLS
    2. 它在没有 TLS 的情况下成功连接,但您发送的 IP 地址在 Spamhaus 上被识别为垃圾邮件发件人(或者可能只是一个 ISP DHCP 地址),并且阻止使用该服务器发送邮件。李>

    如果您点击错误中给出的链接 (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 的接收主机(很多,如果不是大多数)都会阻止您这样做。

    【讨论】:

    • 遥控器支持 TLS 端口 25,我可以使用 openssl s_client -starttls smtp -crlf -connect mail.somedomain.com:25 连接。至于 Spamhaus 的拒绝,这是意料之中的。我只是想指出在没有 STARTTLS 的情况下交付是如何失败的。
    【解决方案2】:

    你做得对。您确定它挂起并且没有引发意外异常吗?如果挂起,堆栈跟踪显示什么?

    【讨论】:

    • 抱歉,完全是用户问题。两个主要错误: 1. 我没有检查实际的电子邮件帐户以查看电子邮件是否已送达 - 确实如此。 2. 我使用的线程池没有关闭,因此程序似乎挂起。 OTOH,调试模式让我知道消息的实际发送时间会很好......
    • 好吧,协议跟踪显示服务器接受了消息而没有错误。您是否只是在寻找确认该事实的明确调试消息?
    • 是的,明确的确认调试消息会有所帮助。
    • 好主意,我会在下一个版本中添加它。
    【解决方案3】:

    原来的代码是有效的。我被两个错误送出:

    • 我没有检查实际的电子邮件帐户以查看电子邮件是否已送达 - 确实如此。
    • 我正在使用未关闭的线程池,因此程序似乎挂起

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-17
      • 2019-06-01
      • 2019-10-21
      • 2013-11-17
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      相关资源
      最近更新 更多