试图让 Laravel 5 电子邮件工作


Trying to get Laravel 5 email to work

我正在尝试通过键入URL向指定用户发送电子邮件,但是收到以下错误:

Swift_TransportException 在 AbstractSmtpTransport.php第 383 行: 预期响应代码 250,但收到代码"530",消息为"530 5.7.1 需要身份验证

到目前为止,我只是想让它与Gmail一起工作。 我怎样才能让它工作?

这就是我到目前为止所拥有的:邮件.php

<?php
    return [
        'driver' => env('MAIL_DRIVER',' smtp'),
        'host' => env('MAIL_HOST', 'smtp.gmail.com'),
        'port' => env('MAIL_PORT', 587),
        'from' => ['address' =>"MyUsername@gmail.com" , 'name' => "example"],
        'encryption' => 'tls',
        'username' => env('MyUsername@gmail.com'),
        'password' => env('MyPassword'),
        'sendmail' => '/usr/sbin/sendmail -bs',
        'pretend' => false,
    ];

这是我在路线中拥有的:

Route::get('test', function() {
    Mail::send('Email.test', [], function ($message) {
        $message->to('example@gmail.com', 'HisName')->subject('Welcome!');
    });
});

这是我的控制器中的内容:

class MailController extends Controller
{
    public function Sending_Email()
    {
        $this->call('GET','Email.test');
        return View('Email.test');
    }
}

这是我的 .env 文件中的内容:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=MyUsername@gmail.com
MAIL_PASSWORD=MyPassword

>我知道它现在对你有用@Vantheman6但这是对我有用的,以防万一对其他人也是如此。

我将正在使用的邮件服务的详细信息添加到我的 .env 文件中。因此,请确保以下详细信息

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=MyUsername@gmail.com
MAIL_PASSWORD=MyPassword

在 .env 文件中是准确的。

注意:编辑 .env 文件后不要忘记重新启动服务器,以便它会选择您放入其中的新数据。

使用以下命令清除配置缓存:

php artisan config:cache

如果不重新启动服务器,.env 文件仍会继续向应用显示旧邮件数据,即使您进行了可能导致此错误的更改也是如此。

我的 .env 文件配置对于 laravel 5.1 是这样的

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=example@gmail.com
MAIL_PASSWORD=****************
MAIL_ENCRYPTION=tls

这里最重要的是我创建了Gmail应用程序特定的密码(16位)。

我需要再透露一件事,因为任何配置都没有运气。也就是说,每当我更改.env文件时都需要运行此命令

php artisan config:cache

这是最重要的,因为如果没有这个命令,laravel会从它的缓存中执行以前的设置。这需要我10多个小时才能弄清楚。

您收到身份验证错误,因为配置文件中的用户名和密码设置错误。

更改此设置:

'username' => env('MyUsername@gmail.com'),
'password' => env('MyPassword'),

对此:

'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),

env 方法检查您的 .env 文件。在您的 .env 文件中,您调用这些MAIL_USERNAME,因此这就是您需要传递给 env 方法的内容。

一个故障排除提示:添加dd(Config::get('mail'));以便您可以看到实际生成的配置。这将帮助您发现此类问题,并确切地知道Laravel将尝试使用哪些信息。因此,您可能希望在测试路线中暂时停止它,以检查您拥有的内容:

Route::get('test', function()
{
    dd(Config::get('mail'));
});
问题

将通过清除缓存来解决

php artisan config:cache

终于我得到了!只是为了分享,有更多的配置不仅仅是.env

这是 .env

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=UserName@gmail.com
MAIL_PASSWORD=********
MAIL_ENCRYPTION=tls

config/mail.php还需要输入地址和名称才能工作。

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

如果您遇到同样的麻烦并在线尝试所有内容但不起作用,则可能是配置缓存文件发送了错误的信息。你可以在bootstrap/cache/config.php中找到它。确保凭据就在那里。我花了一周的时间才弄清楚。我希望有一天这会帮助某人。

出于开发目的 https://mailtrap.io/为您提供了需要在.env文件中添加的所有设置。例如:

Host:   mailtrap.io
Port:   25 or 465 or 2525
Username:   cb1d1475bc6cce
Password:   7a330479c15f99
Auth:   PLAIN, LOGIN and CRAM-MD5
TLS:    Optional

否则,出于实施目的,您可以从邮件中获取要添加到.env文件中的smtp凭据(如gmail n all)

添加后,请确保重新启动服务器

它也发生在我身上。

这是因为当我们编辑.env文件时,我们需要重新启动服务器。只需停止当前php artisan serve并再次启动它。这肯定会起作用。

如果仍然不起作用,请尝试执行php artisan config:cache

供将来来这里的人参考。 在您运行此处第三个答案中给出的命令之后(我现在使用的是 Laravel 5.3)。

php artisan config:cache

您可能会遇到此问题:

[ReflectionException]
Class view does not exist

在这种情况下,您需要手动将其添加回 app.php 文件下的提供商列表。前往: app->config->app.php->'providers[]'并添加它,如下所示:

Illuminate'View'ViewServiceProvider::class,

希望对某人有所帮助。

我遇到了同样的问题;我的MAIL_ENCRYPTION mail.php tls,但它.env文件中null
所以我把null改成了tls,它奏效了!

以上解决方案都不适用于本地主机。我什至允许从安全性较低的应用程序访问,允许通过显示解锁验证码进行访问,并将验证对等体和验证对等体名称设置为 false 以用于 SSL。

最终,我使用了MailHog的开源SMTP测试解决方案。步骤如下:

  1. 下载适用于您的操作系统的最新版本的 MailHog
  2. 在 .env 文件中指定以下设置

MAIL_DRIVER=SMTP

MAIL_HOST=127.0.0.1

MAIL_PORT=1025

MAIL_USERNAME=测试用户

MAIL_PASSWORD=testpwd

MAIL_ENCRYPTION=空

MAIL_FROM_ADDRESS=theaddress@youwant.com

  1. 运行下载的 MailHog 文件
  2. 发送电子邮件
  3. 通过转到本地主机检查已发送的电子邮件:8025

您应该重新启动服务器并运行以下命令:

php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan config:clear
php artisan config:cache

这应该行得通。

这只是意味着您的服务器无法访问SMTP服务器。

您可以通过执行以下操作来测试这一点:

telnet <smtpServer> <smtpPort>

应收到"拒绝访问"错误。

解决方案是仅使用服务器可以访问的另一个SMTP服务器。

如果dd(Config::get('mail'));的结果为空,只需使用命令

php artisan config:clear

我的意见是在您的 .env 文件进行更改后重新启动您的服务器并再次提供应用程序。只是为了确定实际错误。php工匠清除和缓存之后工作得很好。

就我而言,问题是我使用的电子邮件 from('mymail@gmail.com')与我在 .env 文件中配置为MAIL_USERNAME的电子邮件不同。

下面是 .env 中邮件配置的代码片段

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=anothermail@gmail.com
MAIL_PASSWORD=strongpassword
MAIL_ENCRYPTION=tls

在邮件发送方法中,我已设置

->from('mymail@gmail.com')->to('myfriend@gmail.com');

始终确保邮件中使用的

->发件人("mymail@gmail")

.env MAIL_USERNAME中配置的相同。

修改.env请确保在使用laravel 7及更低版本的情况下restart your server,因为在修改.env文件时它们不会自动重新启动。

如果您已完成上述所有操作但尚未解决,请尝试运行以下命令以清除系统中的任何缓存配置:

php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan config:clear

就我而言:重新启动服务器并运行php artisan config:clear命令。

  1. 你去邮件枪
  2. 单击授权收件人
  3. 添加您希望向其发送邮件的电子邮件地址。
  4. 验证发送到邮件的邮件。
  5. 太棒了...你很好去。