【问题标题】:Mail Exception only on server邮件例外仅在服务器上
【发布时间】:2015-10-06 19:16:17
【问题描述】:

舞台

我最近部署了一个 Web 应用程序。应用程序需要发送电子邮件有几个原因。

我正在为我的域使用 yandex 企业电子邮件服务,我的域有许多电子邮件帐户,我可以毫无问题地使用这些电子邮件地址。

我已经编写了一些代码来在我的 Laravel 应用程序上发送电子邮件,使用 Laravel 的 Mail::send。请参阅下面的 #2。你可以在下面的 #1 看到我的config/mail.php 设置。

我正在使用 WAMP 服务器在我的 Windows 计算机上测试我的应用程序。

我的生产服务器是运行 Linux 的 VPS 服务器。 PHP 版本 5.5.29。

问题

一切都在我的本地测试环境中完美运行; 我可以发送邮件,它们可以毫无问题地传递到 hotmail、gmail 或我的域的电子邮件。

但是,在服务器上,当我尝试发送电子邮件时收到错误消息。请参阅 #3 了解错误。

在同一台服务器上,我可以使用 PHPMailer 以相同的电子邮件帐户、电子邮件设置和凭据发送电子邮件,并且没有任何问题。

问题和想法

一切都按预期在我的本地环境中运行,这让我认为这是我的服务器配置、PHP 版本、配置或扩展的问题,但我不知道如何判断。

我尝试过哪些没用的方法

评论了这些行以从默认邮件地址发送电子邮件。 并且还用另一个更改了我的默认电子邮件地址,除了在这个项目的生产服务器上之外,它也可以在任何地方工作;

//$transport = Mail::getSwiftMailer()->getTransport();
//$transport->setUsername($username);
//$transport->setPassword($password);

禁用邮件加密。设置;

'encryption' => '',

尝试了不同的驱动程序;

'driver' => 'mail',

1) 我的配置/mail.php

'driver' => 'smtp',
'host' => 'smtp.yandex.com',
'port' => 587,
'from' => ['address' => 'name@domain.com', 'name' => 'name'],
'encryption' => 'tls',
'username' => 'name@domain.com',
'password' => 'password',
'sendmail' => '/usr/sbin/sendmail -bs',
'pretend' => false,

2) 我使用的代码

Mail::send($message, $data, function ($message) use ($account, $to, $subject) 
{
$acc = config("mail.accounts.$account");
$senderAddress = array_get($acc, 'address');

$username = array_get($acc, 'username', $senderAddress);
$password = array_get($acc, 'password', '');
$senderName = array_get($acc, 'name', $acc['address'], $senderAddress);

$replyToAddress = array_get($acc, 'replyTo.0', $senderAddress);
$replyToName = array_get($acc, 'replyTo.1', $senderName);

$message->from($senderAddress, $senderName)
    ->replyTo($replyToAddress, $replyToName)
    ->subject($subject)
    ->to($to);

$transport = Mail::getSwiftMailer()->getTransport();
$transport->setUsername($username);
$transport->setPassword($password);
});

以上代码说明: 这段代码基本上允许我向任何电子邮件帐户发送电子邮件, 并且来自我拥有的许多电子邮件帐户。就像我说的,这在我的本地测试环境中完美运行。

3) 错误

AuthHandler.php 第 181 行中的 Swift_TransportException: 无法使用用户名在 SMTP 服务器上进行身份验证 "name@domain.com" 使用 2 个可能的身份验证器

4) 工作 PHPMailer 脚本

    $mail = new PHPMailer();
    $mail->IsSMTP();
    $mail->SMTPAuth = true;
    $mail->Host = "smtp.yandex.com";
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;
    $mail->Username = $sender;          // SMTP account username
    $mail->Password = $password;        // SMTP account password
    $mail->SetFrom($sender, 'Name');
    $mail->AddReplyTo($sender, 'Name');
    $mail->Subject = $subject;
    $mail->MsgHTML($message);
    $mail->AddAddress($to, $to);
    $mail->Send();

【问题讨论】:

    标签: email smtp laravel-5 server production-environment


    【解决方案1】:

    很难说是什么问题。或者为什么它适用于您的开发环境。但是快速的谷歌搜索给了我以下 smpt.yandex.com 的设置:

    • 邮件服务器地址——smtp.yandex.com;
    • 连接安全 - SSL;
    • 端口 — 465。

    因此,它不应该在您的开发环境中工作。为什么它起作用对我来说是个谜。

    见:https://yandex.com/support/mail/mail-clients.xml

    【讨论】:

    • 带有 SSL 的端口 465 给了我这个错误; Swift_TransportException in StreamBuffer.php line 265: Connection could not be established with host smtp.yandex.com [Unable to find the socket transport "SSL" - did you forget to enable it when you configured PHP? #19362400] 带有 TLS 的端口 465 给了我超时错误; Swift_TransportException in AbstractSmtpTransport.php line 404: Connection to tcp://smtp.yandex.com:465 Timed Out
    • 我刚刚将我的工作 PHPMailer 代码添加到问题中。请参阅 #4
    猜你喜欢
    • 2022-06-12
    • 2015-07-03
    • 1970-01-01
    • 2015-03-19
    • 2012-04-27
    • 2010-11-08
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多