PHPMailer 和匿名 TLS 连接

PHPMailer and anonymous TLS connections

我正在使用 phpmailer 在端口 25 上建立 TLS 连接。 我不能使用 username/password,所以它是匿名连接。

服务器响应如下:

250-SIZE
                                      250-PIPELINING
                                      250-DSN
                                      250-ENHANCEDSTATUSCODES
                                      250-XXXXXXXA
                                      250-XXXXXXXXXXXXXB
                                      250-AUTH NTLM
                                      250-XXXXXXXXXXXXXXXXXC
                                      250-8BITMIME
                                      250-BINARYMIME
                                      250-XXXXXXXD
                                      250-XXXXXXE
                                      250-XXXXF
                                      250 XXXXXXG

当 phpmailer 发送 STARTTLS 命令时,服务器响应:

CLIENT -> SERVER: STARTTLS
SERVER -> CLIENT: 500 5.3.3 Unrecognized command
SMTP ERROR: STARTTLS command failed: 500 5.3.3 Unrecognized command

显然服务器不提供匿名 TLS。 奇怪的是,如果我通过 telnet 连接到服务器,它正在工作。

这是 phpmailer 问题吗?或者只是服务器的一些奇怪行为???

如果它不通告 STARTTLS 那么它就不太可能工作 - 您确定您正在使用 telnet 连接到同一台服务器吗?可以通过在发送后调用它来获取 PHPMailer 看到的服务器功能数组:

var_dump($mail->getSMTPInstance()->getServerExtList());

如果要手动测试,应该使用openssl s_client命令而不是telnet:

openssl s_client -connect mail.example.com:25 -starttls smtp

如果可行的话,这将向您显示更多技术细节。

PHPMailer 无论如何都会使用机会性 TLS - 如果它发现服务器通告 STARTTLS,它会自动启用加密,即使您没有设置 SMTPSecure = true

希望以下技巧对您有所帮助:)

这是我的 PHPMailer 对象

$phpmailer

评论行

$phpmailer->SMTPSecure = 'tls';

并添加

$phpmailer->SMTPOptions = array(
    'ssl' => array(
        'verify_peer'       => false,
        'verify_peer_name'  => false,
        'allow_self_signed' => true
    )
);