我正在尝试向侦听端口25的SMTP服务器发送电子邮件,使用STARTTLS并要求身份验证。
据我了解,客户应该
EHLO clientName
STARTTLS
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与我的设置一起工作的正确咒语是什么?
答案 0 :(得分:1)
这里有两件事是错误的
如果您按照错误(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调试模式可以让我知道实际发送消息的时间。