我的云托管 Java 应用程序已成功通过另一台主机(托管 VPS)mail.example.com 上的邮件服务器的身份验证。mail.example.com 上的服务器接受发送给我们用户的电子邮件,地址为[电子邮件保护]。但是中继被拒绝,并尝试将邮件发送到[电子邮件保护]被拒绝。
然而,我的问题不是“我该如何解决这个问题?” 我很确定这与这个问题大致相同: 如何纠正 Postfix 的“中继访问被拒绝”?我将把这留给管理 mail.example.com 的管理员 — — 他们可能会将应用程序主机 IP 添加到 main.cf 文件中的 mynetworks 设置中。
我的问题是:邮件服务器如何知道 Java 应用程序不是我的电子邮件客户端?我使用自己每天用于电子邮件的用户 ID 和密码测试了 Java 应用程序电子邮件设置。我使用笔记本电脑从各个地方连接到电子邮件 - 咖啡店、家里、酒店等。
我的 Java 应用程序与我在星巴克连接的笔记本电脑上应用程序有何不同?
答案1
您在上面的评论中提到了这一点;基本上,建立连接后的第一件事是从客户端向服务器发出 HELO (smtp) 或 EHLO (esmtp) 命令。问题是,现在您不知道 example.com 的邮件配置文件中有什么。
我要做的调试是在某台服务器上设置您自己的 MTA(exim、postfix 等),然后启动日志输出以捕获您的普通客户端和 Java 应用程序发送会话,并比较每个 MUA 发送到服务器的内容,尤其是 HELO/EHLO 字段。或者,如果设置快速邮件服务器对您来说太麻烦,您可以在主机上使用 tcpdump 并捕获传出的原始数据包,然后在 Wireshark 中查看它们以读取有效负载。
举例来说,以下是有关此信息的默认开箱即用的 Exim 配置:
# Hosts are required to say HELO (or EHLO) before sending mail.
# So don't allow them to use the MAIL command if they haven't
# done so.
deny condition = ${if eq{$sender_helo_name}{} {1}}
message = Nice boys say HELO first
# Use the lack of reverse DNS to trigger greylisting. Some people
# even reject for it but that would be a little excessive.
warn condition = ${if eq{$sender_host_name}{} {1}}
set acl_m_greylistreasons = Host $sender_host_address lacks reverse DNS\n$acl_m_greylistreasons
accept
您还可以检查 Java 应用程序是否使用与常规客户端相同的身份验证类型 - 如果使用 PLAIN 或 LOGIN 样式而不是 CRAM-MD5,您的邮件服务器可能会做出不同的反应。这完全取决于 MTA 管理员的配置,因此您再次受他们摆布。