【发布时间】: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