试图使Laravel 5电子邮件正常工作


154

我正在尝试通过输入URL向指定用户发送电子邮件,但出现以下错误:

第383行的AbstractSmtpTransport.php中的Swift_TransportException:预期的响应代码为250,但代码为“ 530”,消息为“ 530 5.7.1要求身份验证”

到目前为止,我只是试图使其与Gmail一起使用。我怎样才能使它工作?

这是我到目前为止的内容:mail.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

4
使用mailtrap.io用于测试

关于mailtrap.io @roll的一个很好的提示
Ben Everard

使用mailtrap.io时出现完全相同的错误
luisfer

Answers:


243

我知道它现在对您有效@ Vantheman6,但这对我有用,以防其他人也一样。

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

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

.env文件中的值是正确的。

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

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


59
哇,那个“笔记”救了我。我不知道在启动时会缓存ENV变量!
Gerben Jacobs

您能否更新答案-并突出显示重新启动服务器,而不是配置文件?
mrwaim

2
@mrwaim,我认为服务器的重新启动完全是我在注释中指定的,除非我没有明白您的意思。
Osei-Bonsu Christian

1
我建议删除“注释:”之前的所有内容-有用的是注释,而不是之前的内容。我建议,如果要保留其他部分,请将其放在注释后面。3人们赞成“注释”评论,因此注释可能也对他们有所帮助。
mrwaim

22
如果以前使用来缓存配置, php artisan config:cache然后重新启动服务器将不会获取更新的配置。尝试php artisan config:cache再次运行
darronz

53

我的.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将从缓存中执行以前的设置。我需要十多个小时才能弄清楚。


1
我一直使用php artisan cache:clearwhen php artisan config:cache是什么为我解决了。谢谢!
timgavin

4
因您的留言而被投票php artisan config:cache
darronz

35

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

更改此:

'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'));以使您可以看到实际生成的config。这将帮助您发现类似的问题,并确切了解Laravel将尝试和使用的信息。因此,您可能希望暂时在测试路线中停止该操作,以检查您拥有什么:

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

因此,我更改了mail.php文件以反映您的建议`'username'=> env('MAIL_USERNAME')','password' => env('MAIL_PASSWORD'), 我觉得这很有趣,因为到处都告诉我为此输入您的电子邮件地址和密码。我仍然遇到错误Swift_TransportException in AbstractSmtpTransport.php line 383: Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required. I'm sorry but where do i actually place the " dd(Config::get('mail'));。Config目录中包含很多文件
Vantheman6

请参阅我的最新答案,并提供有关如何检查配置的示例。
jszobody 2015年

太棒了,我仍然出现错误,但是我实际上可以看到它在做什么。由于某种原因,它试图将`“ host” =>“ mailtrap.io”`传递给环境,即使在邮件php中我'host' => env('MAIL_HOST', 'smtp.gmail.com'),
也要

仔细检查MAIL_HOST您的.env文件中的内容
jszobody 2015年

没错 MAIL_HOST=smtp.gmail.com 因此,我最终要做的是从mail.php文件的每个部分中删除所有环境。现在,正确的信息正在传递。OMG谢谢你的工作。你是男人
Vantheman6 2015年


13

终于我明白了!只是共享,还有更多的配置。

这是.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,

11

如果您遇到相同的麻烦并在线尝试所有操作,但它不起作用,则可能是配置缓存文件发送了错误的信息。您可以在bootstrap / cache / config.php中找到它。确保凭据就在其中。我花了一个星期才弄清楚。希望有一天能对某人有所帮助。


主席先生,当之无愧的波尔多葡萄酒,非常感谢!我注意到该文件中的用户名和密码是空的,即使我将它们填充到两个适当的文件中也是如此,从那里我知道该怎么办!谢谢!
Gregordy '16

谢谢!认真地说,我已经调试了一个小时,没有任何线索,但是这!!!这
艾哈迈德·阿尔菲

11

出于开发目的,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)

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


添加完之后,请确保重新启动服务器..这句话解决了我的问题。
Hos Mercury

8

这也发生在我身上。

这是因为在编辑.env文件时,我们需要重新启动服务器。只需停止电流php artisan serve,然后再次启动即可。这肯定可以工作。

如果仍然无法正常工作,请尝试执行 php artisan config:cache


5

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

php artisan config:cache

您可能会遇到此问题:

[ReflectionException]
Class view does not exist

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

Illuminate\View\ViewServiceProvider::class,

希望能帮助到某人。


4

我遇到了同样的问题;我MAIL_ENCRYPTIONtlsmail.php,但它是null.env文件中。
因此,我更改nulltls并成功了!


就是这种情况!
夏期剧场

3

以上解决方案均不适用于localhost。我什至允许来自不太安全的应用程序的访问,允许通过显示解锁验证码访问,以及将SSL的验证对等方和验证对等方名称设置为false。

最终,我使用了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. 通过转到localhost:8025检查发送的电子邮件

3

这仅表示您的服务器无权访问SMTP服务器。

您可以通过以下方法进行测试:

telnet <smtpServer> <smtpPort>

您应该收到访问被拒绝的错误。

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


2

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

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

那应该工作。


0

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

php artisan config:clear

0

在对.env文件进行更改后,我的意见是重新启动服务器并再次提供该应用程序。只是为了确保实际错误。php artisan清除并随后进行缓存非常好。


-1

我遇到了与您相同的问题,只是让它起作用。

首先,您需要仔细检查.env设置是否正确。这是我的设置:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=yourusername
MAIL_PASSWORD=yourpassword
MAIL_ENCRYPTION=tls

请确保您的密码不在引号之间:)。

并且在config / mail.php中,它具有以下内容,而没有注释。

<?php

return [

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

'pretend' => false,

];

希望对你有帮助 :)


-1

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


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

2
请原谅我的无知。上面的答案如何解决问题中的Laravel5电子邮件问题?
jww
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.