【问题标题】:Getting exception when sending email发送电子邮件时出现异常
【发布时间】:2018-10-17 16:04:28
【问题描述】:

大家好,我正在尝试在 Laravel 中发送电子邮件,并且在使用了这么多配置并且每次我在这里发布时都得到相同的异常之后,我得到的异常是。

预期的响应代码为 220,但得到代码“”,带有消息“”

我在 Laravel 中配置邮件的步骤如下。

我启用了谷歌两步验证。 使用以下 MAIL 变量更改了 .env 文件。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=email@domain.com
MAIL_PASSWORD=email_password
MAIL_ENCRYPTION=tls

最后在我的 config/mail.php 文件中,我像这样更改设置。

return [
'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'smtp.gmail.com'),
'port' => env('MAIL_PORT', 587),
'from' => ['address' => '<<your email>>', 'name' => '<<any name>>'],
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'sendmail' => '/usr/sbin/sendmail -bs',
'pretend' => false,
];

这是我用来发送电子邮件的功能

$mail = Mail::raw($msg, function ($message) {
   $message->to('email@domain.com');
});

谁能指导我做错了什么

【问题讨论】:

  • 您使用的是真实的 gmail 密码还是来自security.google.com/settings/security/apppasswords 的应用程序密码?
  • 我正在使用我的真实 gmail 密码
  • 然后使用应用密码以避免提示您进行双因素验证,因为您无法在此上下文中提供第二因素。
  • 我刚刚从你给我的链接中生成了应用程序密码,并使用它而不是我的电子邮件密码,但仍然得到同样的异常

标签: laravel email laravel-5 smtp laravel-mail


【解决方案1】:

您实际上不需要修改config/mail.php,它使用来自.env 的值。我的.env 中的此电子邮件配置适用于我的项目:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.googlemail.com
MAIL_PORT=465
MAIL_USERNAME=mymail@gmail.com
MAIL_PASSWORD=mypassword
MAIL_ENCRYPTION=ssl

如果您使用的是 gmail,则需要从您的 google 帐户获取 API 密码。

所以先做以下:

 1. Login to your gmail Account
 2. Go to your preferences
 3. Search for Sign In And Security
 4. Sign In to google -> enable two step verification
 5. There you can generate an app password which you have to use in your `.env` file

此外,请务必在更改 .env 配置后清除配置缓存。

运行以下命令:

php artisan config:cache

在您的控制器中,您可以使用以下 Schema 发送电子邮件:

首先使用以下命令生成mailable 类:

php artisan make:mail InquirySent

这个类看起来像这样:

class InquirySent extends Mailable
{
    use Queueable, SerializesModels;

    public $data;

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function build()
    {
        return $this->view('emails.contacts.inquiry'); // this is the location where you 'style' your view for your mails
    }
}

在您的控制器中,您可以执行以下操作来发送电子邮件。

class ContactController extends Controller
{
    protected $myMail;

    public function __construct() {
        $this->myMail = env('MAIL_USERNAME');
    }

    public function sent(ContactRequest $request)
    {
        $data = $request->all();       
        // new implementation using a mailable class
        Mail::to($this->myMail)->send(new InquirySent($data));
    }
}

如您所见,您正在向.env 文件中设置的邮箱发送一封电子邮件。

【讨论】:

  • 现在我收到了这个异常Connection could not be established with host smtp.gmail.com [ #0]
  • @MohsinAbbas 您是否按照上述所有步骤操作?如果是,您能否告诉我浏览器控制台网络消息说,因此您是在本地测试还是在生产服务器上测试?
  • 先生,我已经按照上面提到的每一个步骤改变了异常,在对这个新异常进行了更多研究之后,我终于得到了解决方案,只需添加这两行 $options['ssl']['verify_peer'] = FALSE; $options['ssl']['verify_peer_name'] = FALSE; 它就可以作为你的答案让我很轻松,所以 +1 谢谢
  • 我知道这些行会放松安全性,但我在我的 FYP 中使用它,所以我不需要安全性
  • @MohsinAbbas 我曾经遇到过问题,电子邮件功能在我的本地 Windows 机器上不起作用,但在我的高效 ubuntu 机器上起作用,所以如果它在你的本地机器上不起作用,你可以尝试运行它在高效的 ubuntu/linux 机器上而不改变安全性(您发布的 2 行)。祝你好运! :)
猜你喜欢
  • 2017-05-03
  • 2012-10-12
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多