我已将网站升级到Laravel 5.5,突然间我无法再发送邮件了,因为它给了我以下错误:
production.ERROR:预期的响应代码250,但代码为“550”,带有 消息“550-Not authenticated,请启用SMTP身份验证 电子邮件软件和550检查登录凭据
当我在.env
中指定邮件时,我不知道它为什么要尝试使用SMTP,它似乎忽略了:
MAIL_DRIVER=mail
MAIL_HOST=
MAIL_PORT=25
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
这是Laravel 5.5的全新安装。我已经运行composer dumpautoload
和artisan cache:clear
。
帮助?
修改
使用以下代码的简单PHP文件可以正常工作:
$to = 'my_email_address@hotmail.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
exit();
答案 0 :(得分:2)
Swiftmailer 6.0不再支持邮件驱动程序
使用laravel,您还更新了swiftmailer,因此邮件驱动程序不再起作用。
Here is the swiftmailer commit that removed the mail driver in 6.0.
It was deprecated since Swiftmailer 5.4.5 with this commit.
Here is a long discussion about why it was removed,其中 the most useful comment说:
PHP的mail()
函数不安全
可以利用第五个参数在大多数Linux系统上执行任意代码。这主要是因为PHP错误地转义了shell参数。您可以在"Why mail() is dangerous in PHP" by RIPS中阅读完整的说明。
因此,一些应用程序存在安全问题,包括Roundcube Webmailer,MediaWiki,PHPMailer,ZendFramework,SquirrelMail和Swiftmailer。 还有您的应用程序。因此,很高兴将其删除,而改用SMTP。通常,您可以通过以下方式简单地使用本地邮件服务器:
MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=25
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=null
(如果您的服务器不接受本地未加密的邮件,则可能需要使用tls
加密。)
Laravel
Laravel的主要问题是它的文档仍然提到了邮件驱动程序in the Laravel 5.7 documentation,并且只在他们的upgrade notes for 5.5中提到需要swiftmailer 6.0,但这并不意味着您不能使用邮件驱动程序不再。
答案 1 :(得分:0)
最后,几天前我遇到了这个错误,结果证明是身份验证错误的问题。这个错误本身就清除了一个问题,即当凭据无效时会出现错误,在您的情况下,您还没有指定凭据,而您指定的MAIL_DRIVER = mail
mail
使用了php&# 39;邮件功能,而laravel本身附带自己的邮件机制我真的建议你使用它。
邮件的geniune .env
将如下所示(我使用gmail使用了邮件功能)
MAIL_DRIVER=smtp
MAIL_HOST= smtp@gmail.com
MAIL_PORT=25/587/465/2525 (any one)
MAIL_USERNAME=youremail@gmail.com
MAIL_PASSWORD=your app password
MAIL_ENCRYPTION=tls
对于应用密码,请访问here
如果您查看了默认.env
文件,则可以看到类似这样的内容,它会与mailtrap.io一起提供,建议您专门针对本地环境进行测试。
MAIL_DRIVER=smtp
MAIL_HOST= smtp@mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=dfj233ddfk3 // you will get this as you signup for mailtrap
MAIL_PASSWORD=your_mailtrap_password
MAIL_ENCRYPTION=tls
更新1
如果您需要继续使用PHP's mail()
,则需要安装postfix或sendbox才能为此follow these instructions发送邮件,或者我想检查this SO post我认为这可能会对您有所帮助
答案 2 :(得分:0)
2021 年更新
对于 Laravel 7 及更高版本,使用 MAIL_MAILER=sendmail