Laravel Homestead中的Swift: 无法发送没有发件人地址的消息

54

当我尝试发送密码重置邮件时,在Laravel 5.1 Homestead中使用默认的电子邮件设置出现了这个错误。

Swift_TransportException in AbstractSmtpTransport.php line 162:Cannot send message without a sender address

地址填写在app/config/mail.php中:

'from' => array('address' => 'myusername@gmail.com', 'name' => 'hawle'),
21个回答

99

在你的.env文件中,你需要设置你的电子邮件账户的电子邮件地址和密码。你还需要设置你正在使用的邮件服务器的主机和端口。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=25
MAIL_USERNAME= ***USER NAME***
MAIL_PASSWORD= ***PASSWORD***
MAIL_ENCRYPTION=tls

或者确保你的mail.php文件中的所有内容都是完整的(请参见下面的注释)。

'host' => env('MAIL_HOST', 'smtp.gmail.com'),
/*
|--------------------------------------------------------------------------
| SMTP Host Port
|--------------------------------------------------------------------------
|
| This is the SMTP port used by your application to deliver e-mails to
| users of the application. Like the host we have set this value to
| stay compatible with the Mailgun e-mail application by default.
|
*/
'port' => env('MAIL_PORT', 25),
/*
|--------------------------------------------------------------------------
| Global "From" Address
|--------------------------------------------------------------------------
|
| You may wish for all e-mails sent by your application to be sent from
| the same address. Here, you may specify a name and address that is
| used globally for all e-mails that are sent by your application.
|
*/
'from' => ['address' => 'myusername@gmail.com', 'name' => 'hawle'],
/*
|--------------------------------------------------------------------------
| E-Mail Encryption Protocol
|--------------------------------------------------------------------------
|
| Here you may specify the encryption protocol that should be used when
| the application send e-mail messages. A sensible default using the
| transport layer security protocol should provide great security.
|
*/
'encryption' => env('MAIL_ENCRYPTION', 'tls'),

注意: 最好使用.env文件,因为您的生产环境很可能有不同的配置。

如果一切都完成了,但仍然无法正常工作,可能是缓存问题。您可以通过以下方式清除配置缓存:

php artisan config:cache

还要注意:

  • 端口465是用于Gmail的。 如果不起作用,则可以使用25。
  • mail.php文件位于/app/config/mail.php中(如OP所说)。
  • .env文件位于您的项目根目录中。
  • Mailtrap.io是一项测试SMTP的服务。 它实际上并不发送电子邮件。

正如Viktorminator所提到的: 考虑创建应用程序密码而不是使用您通常的密码来满足此需求。 创建密码的链接myaccount.google.com/apppasswords


我尝试使用mailtrap.io服务进行设置,但是它没有起作用。问题在于我认为您不应更改此行 'from' => ['address' => 'myusername@gmail.com', 'name' => 'hawle'], - Gergely Havlicsek
@GergelyHavlicsek Mailtrap是用于测试目的的,如果你想向其他人发送邮件,你应该使用自己的电子邮件账户,并将配置更改为你的提供商所使用的SMTP服务器,例如谷歌使用smtp.gmail.com。如果你使用真实的SMTP服务器,你还需要使用真实的凭据。 - Szenis
1
关键问题是MAIL_ENCRYPTION=null。请将其替换为MAIL_ENCRYPTION=tls。 - Hashmat Waziri
1
考虑创建应用程序密码而不是使用您通常的密码来满足这种需要。 创建密码链接 https://myaccount.google.com/apppasswords - Viktor Matushevskyi
1
如果您想清除配置缓存,命令是: php artisan config:clear对吗? - Ali_Hr

24

请确保您已在app/config/mail.php中设置了'from'。

'from' => ['address' => 'myname@gmail.com', 'name' => 'myname']

它将解决这个问题。


8
在此之后执行 'php artisan config:cache' 命令。 - Peter
3
@pbwned,你的评论让我避免了拔光头发的危险。 - Alex Lomia

16

也许有人正在使用laravel 6
它的问题是"Cannot send message without a sender address",因此在.env文件中没有电子邮件地址可以发送电子邮件

只需添加发件人电子邮件地址即可

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=example@gmail.com **here**
MAIL_FROM_NAME="${APP_NAME}"

我没有修改mail.php文件,在laravel 6中,它能正常工作,运行之后。

php artisan config:cache

以上所有的操作都不能生效,直到我运行了“php artisan config:cache”命令。 - Mike Thornley
1
在 Laravel 7 中,我必须在 .env 文件中添加 MAIL_FROM_ADDRESS。 - vimuth

9

通过以下方式解决了这个问题

进入.env文件

确保MAIL_FROM_ADDRESS的值已设置。

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=***USERNAME**
MAIL_PASSWORD=***PASSWORD***
MAIL_ENCRYPTION=tls
MAIL_FROM_NAME="${APP_NAME}"
MAIL_FROM_ADDRESS=no-reply@YOURDOMAIN 

6

我刚刚在Laravel 7.9中解决了这个问题。我正在使用mailtrap.io,我认为问题出在缺少MAIL_ENCRYPTION=tls变量上。在mailtrap.io的示例配置或.env.example文件中均未包含此变量。

这是我的.env设置:

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=[found in mailtrap settings]
MAIL_PASSWORD=[found in mailtrap settings]
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=me@mydomain.com
MAIL_FROM_NAME="${APP_NAME}"

4

LARAVEL 7 *无法发送没有发件人地址的消息*


前往您的位于文件夹根目录下的.env文件


如果您也使用smpt.mailtrap.io作为MAIL_HOST,请设置邮件配置如下:

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=******username******
MAIL_PASSWORD=******password******
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=john@example.com
MAIL_FROM_NAME="${APP_NAME}"

现在要设置您的MAIL_USERNAMEMAIL_PASSWORD点击此处进入Mailtrap


现在注册或登录如果您已经有一个账户。


然后点击收件箱,选择演示收件箱,您会找到集成下拉菜单,请选择Laravel,系统将提供您所需的用户名和密码来填写您的.env文件。


然后将信息保存在您的.env文件中,以进行邮件配置。


现在最重要的部分是在终端中运行这两个命令行。


再次运行php artisan serve


运行php artisan config:clear


然后执行您的流程并查看Mailtrap收件箱。 对我而言,就是这样实现的。


3
请检查您的"MAIL_FROM_ADDRESS"是否为空。然后使用"php artisan config:clear"命令清除配置缓存。这个方法对我有用。

3
在进行设置和运行命令后,错误仍然出现。
php artisan view:clear;
php artisan config:cache;
php artisan cache:clear;
php artisan route:cache;

检查代码

\Illuminate\Support\Facades\Mail::send('layouts.mail', [ 'content' => 'testmail'],    function ($m) use ($msg2){
$m->from('abc@gmail.com', 'ABC'); 
// this line was env('MAIL_FROM_ADDRESS') ; cant read from .env
$m->to('xyz@gmail.com', 'XYZ')->subject('TestMailSubject!');
...

3

请确保.env文件中的MAIL_FROM_ADDRESS不为空。

MAIL_FROM_ADDRESS=test@laravel.com

下一步,您需要使用以下命令:

php artisan config:cache
php artisan cache:clear

我希望你觉得这有用。

2

您可能想要在.env文件中这样定义您的邮件配置:

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=***USERNAME**
MAIL_PASSWORD=***PASSWORD***
MAIL_ENCRYPTION=tls
MAIL_FROM_NAME="${APP_NAME}"
MAIL_FROM_ADDRESS=no-reply@YOURDOMAIN 

在对环境文件进行调整后,请确保使用以下命令:

使用

php artisan config:clear

而不是

php artisan config:cache

这对我很有帮助,希望对你也有帮助。祝好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接