【问题标题】:Alternative to swiftmailer in laravel在 laravel 中替代 swiftmailer
【发布时间】:2017-06-01 04:00:39
【问题描述】:

我对@9​​87654321@ 有疑问。

为了解决问题,我正在考虑用其他东西更换 swiftmailer。

我的整个设置都在内部网络上。所以根本没有 mailgun 或 sendgrid。

如何在 Laravel 中使用 swiftmailer 的替代库来排除故障?

这也是我在 Laravel 上尝试使用 swiftmailer 时得到的日志

<< 250-xxx.internal.abc.com Hello [xxx.xx.xxx.xx]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-AUTH
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250-XEXCH50
250 XSHADOW

>> STARTTLS

<< 500 5.3.3 Unrecognized command

!! Expected response code 220 but got code "500", with message "500 5.3.3 Unrecognized command

我尝试过的部分 (I)

有人让我尝试 MAIL_ENCRYPTION 为 null 和 dd(config('mail.encryption')),所以下面是答案:

代码:

    try { 
        Mail::send('emails.test', [], function ($m) {
        $m->from('xxx@client.com', 'Your Application')->to('me@me.com');
        dd(config('mail.encryption'));
        var_dump('executed');
    });
     } catch (Exception $e) {
        var_dump($e->getMessage()); 
        var_dump($e->getTraceAsString());
    }  

结果: null 打印出来了字符串 executed 没有打印出来。

我尝试过的部分(II):

明确使用加密设置为 null 的 swiftmailer 传输

  try {
    // Create the Transport
    $transport = \Swift_SmtpTransport::newInstance();

    $transport->setUsername('xxx@client.com')
    ->setPort(25)
    ->setHost('smtp.internal.client.com')
    ->setEncryption(null);

    // Create the Mailer using your created Transport
    $mailer = \Swift_Mailer::newInstance($transport);

    $logger = new \Swift_Plugins_Loggers_ArrayLogger();
    $mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));


    $message = new \Swift_Message('Wonderful Subject');
    $message->setFrom(['xxx@client.com' => 'John Doe']);
    $message->setTo(['me@me.com'])->setBody('Here is the message itself');

    // // Send the message
    $numSent = $mailer->send($message);
    } catch(\Swift_TransportException $e) {
        var_dump('test');
        var_dump($e->getMessage()); 
        var_dump($e->getTraceAsString());
    }

结果:

www-data@server:~/html/laravel-app$ php artisan email:send
string(4) "test"
string(127) "Failed to authenticate on SMTP server with username "xxx@client.com" using 0 possible authenticators"
string(2503) "#0 /var/www/html/a3qp/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php(332): Swift_Transport_Esmtp_AuthHandler->afterEhlo(Object(Swift_SmtpTransport))

我尝试了第(III)部分:

与第二部分相同,但将加密明确设置为“tls”。我收到与最顶部的原始错误消息相同的错误消息。

我尝试了第(IV)部分:

有人让我把第一部分中的 dd 线取出来这是我得到的

string(8) "executed"
[Swift_TransportException]
Failed to authenticate on SMTP server with username "xxx@client.com" using 0 possible authenticators

更新

  1. 我正在使用 SMTP 连接到我的客户端基础结构中的 MS Exchange 服务器。我无法访问该服务器的 SMTP 日志,因此很难进行故障排除。代码完全是Intranet。无法访问外部互联网服务,我不应该使用 mailgun 或任何其他 smtp 云服务来发送客户用于内部消费的交易电子邮件。
  2. 我有另一个代码使用旧的 cakephp 2 系统,可以毫无问题地与同一个 SMTP 邮件服务器一起工作。
  3. 我已经在谷歌邮件上测试了我的 laravel SMTP 设置。它工作正常。
  4. 我的下一步故障排除是查看问题所在是 swiftmailer 还是 laravel 的其他部分。因此这篇文章。
  5. 是的,我正试图联系负责 Exchange 服务器的 IT 团队,但他们在另一个国家/地区。不过我仍在尝试。
  6. 我知道我在重复第 2 点,但 cmets 认为这点不够清楚。我在旧的 cakephp 2 系统上使用 完全相同的 SMTP 设置 来发送电子邮件,没有问题。因为我无法联系到负责交换服务器的 IT 团队,加上另一个 cakephp 2 系统的 SMTP 设置 do work,我觉得我应该尝试在 laravel 系统上进行故障排除以找出当然。
  7. 我通过更改 .env 文件尝试了 PHP 邮件和 sendmail。我没有触发任何错误消息,但我似乎也没有收到任何电子邮件。
  8. 有关用于测试 SMTP 的代码的详细信息,请参阅我尝试过的第 I 部分、第 II 部分、第 III 部分、第 IV 部分

【问题讨论】:

  • 你可以使用Mailgun:mailgun.com
  • @DovBenyominSohacheski 请参阅上文以了解为什么我不能。以及为什么以前我在同一个 smtp 设置上使用不同的框架(cakephp 2)而没有问题
  • SMTP 是行业标准协议。如果您能够通过 SMTP 连接到 Google,但不能连接到 Exchange 服务器,这表明它更有可能与 Exchange 服务器配置有关,而不是 SwiftMailer。您是否与客户的 IT 团队或管理 Exchange 邮件服务器的人员交谈过?
  • 我正试图找到负责的 IT 团队,但这很困难,因为他们位于另一个国家。其次,完全相同的 SMTP 设置在旧的 cakephp 2 系统中是可以的。所以我很难感觉到问题出在 Exchange 服务器上。这有助于澄清问题吗?

标签: php laravel swiftmailer


【解决方案1】:

您尝试连接的 SMTP 服务器不理解 STARTTLS 命令。为防止尝试使用STARTTLS 命令,您必须通过在.env 文件中将MAIL_ENCRYPTION 环境变量设置为null 来禁用加密。

下一个问题是,根据EHLO 响应,SMTP 服务器不接受任何身份验证方法。如果是这样,250-AUTH 行也将包含它接受的方法(例如250-AUTH PLAIN DIGEST-MD5)。

为防止身份验证尝试,您必须在 .env 文件中将 MAIL_USERNAME 环境变量设置为 null

总而言之,您的.env 文件应该包含以下几行:

MAIL_ENCRYPTION=null
MAIL_USERNAME=null

这将禁用 tls 加密并禁用身份验证。

【讨论】:

  • 这解决了我的 //Swift_TransportException Failed to authenticate on SMTP server with username "abc@abc.com" using 2 possible authentication// 问题。但是当我重置密码时,我的电子邮件帐户没有收到任何电子邮件。为什么?(页面上没有错误)
  • 使用 Swift 在本地发送到 Mailhog(一个本地 SMTP,带有类似于 MailTrap 的 Web UI),这解决了我的问题!谢谢!
猜你喜欢
  • 2016-07-03
  • 2018-07-05
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2016-02-13
  • 2018-01-30
相关资源
最近更新 更多