Laravel 电子邮件配置:我缺少什么?

Laravel email configuration: what am I missing?

我可以通过 PHPMailer 发送电子邮件,但不能通过 Laravel。我假设我的 Laravel 配置是错误的。

我从本地开发环境发送。

Laravel错误

Failed to authenticate on SMTP server with username "name@example.com" using 2 possible authenticators

Laravel 控制器

// ...
Mail::to('anyone@whatever.com')->send(new AnyEmailTemplate());
// ...

Laravel config/mail.php

return [
  'driver' => env('MAIL_DRIVER', 'smtp'),
  'host' => env('MAIL_HOST', 'mail.anyprovider.com'),
  'port' => env('MAIL_PORT', 587),
  'from' => [
        'address' => env('MAIL_FROM_ADDRESS', 'name@example.com'),
        'name' => env('MAIL_FROM_NAME', 'example.com'),
  ],
  'encryption' => env('MAIL_ENCRYPTION', 'tls'),
  'username' => env('MAIL_USERNAME', 'name@example.com'),
  'password' => env('MAIL_PASSWORD', 'supersecretpassword'),
  'sendmail' => '/usr/sbin/sendmail -bs',
  'markdown' => [
    'theme' => 'default',
    'paths' => [
      resource_path('views/vendor/mail'),
    ],
  ],
]

Laravel.env

MAIL_DRIVER=smtp
MAIL_HOST=mail.anyprovider.com
MAIL_PORT=587
MAIL_USERNAME=name@example.com
MAIL_PASSWORD=supersecretpassword
MAIL_ENCRYPTION=tls

PHPMailer 脚本(有效)

$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'mail.anyprovider.com';
$mail->SMTPAuth = true;
$mail->Username = 'name@example.com';
$mail->Password = 'supersecretpassword';
$mail->SMTPAutoTLS = false;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';
$mail->setFrom('name@example.com', 'example.com');
$mail->addAddress('anyone@whatever.com');
$mail->isHTML(true);
$mail->Subject = 'Any subject';
$body = "Any content";
$altBody = "Any alternative content";
$mail->Body = $body;
$mail->AltBody = $altBody;
$mail->send();

知道如何根据 PHPMailer 使用的设置配置 Laravel 吗?

提前致谢!

我遇到了同样的问题。

问题是我们在 MAIL_PASSWORD 中使用混合字符,例如 #,用于 .env 文件中的注释。

将密码更改为一些没有任何符号的简单密码后,我的问题解决了

根据您的 PHPMailer 脚本,您应该清空 MAIL_ENCRYPTION 的值。

请记住,如果您有 .env 文件,它会覆盖您的 config/mail.php 文件。

在您的情况下,您的 .env 文件变为:

MAIL_DRIVER=smtp MAIL_HOST=mail.anyprovider.com 
MAIL_PORT=587 
MAIL_USERNAME=name@example.com 
MAIL_PASSWORD=supersecretpassword 
MAIL_ENCRYPTION=

而您的 config/mail.php 变为:

...
'encryption' => env('MAIL_ENCRYPTION', ''), 
...

注意
编辑文件后,您必须通过以下方式将这些更改告知 laravel:

  • 正在清理缓存
  • 正在执行命令php artisan dump-autoload