使用带有 Laravel / swiftmailer 的自定义 SMTP 服务器失败,相同的设置在 Thunderbird 中有效

Using custom SMTP server with Laravel / swiftmailer fails, same settings work in Thunderbird

我正在尝试使用 SwiftMailer 发送电子邮件(这是 Laravel 默认使用的):

    $transport = (new Swift_SmtpTransport('smtp.my-server.com', 465, "tls"))
        ->setAuthMode('PLAIN')
        ->setUsername('my-username')
        ->setPassword('my-password');
    $mailer    = new Swift_Mailer($transport);

    $message = (new Swift_Message('Wonderful Subject'))
        ->setFrom(['address@my-domain.com' => 'My Name'])
        ->setTo(['my-gmail-address@gmail.com'])
        ->setBody('Here is the message itself');

    $mailer->send($message);

    echo "\nMail sent! \n\n";

并且 运行 这给了我:

Expected response code 220 but got an empty response

在 Thunderbird(电子邮件客户端)中使用相同的设置有效:

我可以在 Thunderbird 中使用这些设置发送电子邮件。 (来自我尝试使用 swiftmailer 的同一个系统)

那我该如何调试呢?是否需要在 swiftmailer 中更改一些默认设置才能使其正常工作?有什么方法可以获得更多调试信息吗?

我的 SMTP 服务器甚至没有记录身份验证尝试。好像 swiftmailer 甚至没有尝试连接到我的 smtp 服务器!

更新:我尝试使用 Swift_Plugins_LoggerPlugin 获取更多调试信息,但没有帮助:

++ Starting Swift_SmtpTransport

!! Expected response code 220 but got an empty response (code: 0)

TLDR; use ssl instead of tls when using a port that forces ssl/tls. Swiftmailer's "tls" actually isn't tls, it's starttls.

似乎 swiftmailer 的 "tls" 加密选项标签错误!我的服务器只接受端口 465 上的 ssl/tls,我可以通过 Thunderbird 连接到它,但 swiftmailer 不能。

当我切换到端口 587 时,它在我的服务器上仅支持 starttls,即使加密设置为 tls(不应与 [=15 相同),它仍然有效=]).

查看源文件证实了我的怀疑:

if ($this->params['tls']) {
    try {
        $this->executeCommand("STARTTLS\r\n", [220]);
            ...

设置为tls时,实际表示starttls。 :P

所以如果你想使用ssl/tls,不要使用swiftmailer加密选项"tls"

当我将加密更改为 ssl 时,它在强制执行 ssl/tls 的端口上工作。所以答案是使用ssl.

编辑:我在 swiftmail github 上打开了一个问题,但是 the issue was already there in "open" status。所以我不是唯一被这个咬伤的人。