Laravel的邮件发送,在Controller中Http请求就可以发成功,php artisan命令执行就发不成功
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
try {
Mail::mailer('smtp_2')->send([], [], function ($msg) {
// 从配置中获取发送者的邮箱地址
$fromEmail = config('mail.mailers.smtp_2.username');
$msg->from($fromEmail, $fromEmail)
->to('523833570@qq.com')
->subject('Test Email from Laravel with Custom HTML')
->setBody('<p>阿斯顿发生</p><p>阿萨撒点</p>', 'text/html'); // 设置自定义 HTML 内容
});
Log::info('成功了');
} catch (\Exception $e) {
Log::error('Mail send failed: ' . $e->getMessage());
}
MAIL_MAILER_all=smtp
MAIL_HOST_2="mail.vecelo.com"
MAIL_PORT_2=465
MAIL_USERNAME_2="devcommon@vecelo.com"
MAIL_PASSWORD_2="不告诉你"
MAIL_ENCRYPTION_2="SSL"
环境:php7.4,而且确定命令行php版本和nginx通讯的php-fpm的版本都是7.4
问题:devcommon@vecelo.com是国外的一个邮件服务地址,同样的代码在Controller中http请求可以发成功;在Commands中写一个脚本,通过php artisan命令执行,代码执行到打印日志“成功了”但是QQ邮箱就没收到邮件,检查了垃圾箱也没有,也没有配置什么拒收规则
个人排查结果:尝试了php artisan命令执行中也加载到了env以及config的东西;没有启用laravel相关的缓存;相同的代码能执行成功证明代码应该没错;网上有人说QQ邮箱有什么针对CLI的校验,判断如果是CLI就屏蔽,但是没有方式证实是不是哪个问题。其实我就是想写成异步Job发送,但是就是不成功,后来才发现是在php artisan命令中发不成功
本作品采用《CC 协议》,转载必须注明作者和本文链接
感谢各位大佬的帮忙,问题解决了,原因是CLI中$_SERVER['SERVER_NAME']为127.0.0.1,HTTP请求中的为请求域名。我在本次执行job中加入如下代码就好了
$_SERVER['SERVER_NAME'] = preg_replace('~^https?://~', '', config('app.url')); // 兼容CLI命令行发送邮件问题,不然SERVER_NAME为127.0.0.1
换国外邮箱测试,大概率是被某个环节被拦截了
CLI 的响应日志呢
在job中使用http请求控制器的路由可行吗
抓包看一下二者差异呢
你可以看看 邮箱有没有退信通知,比如:http://129.204.193.183:89/1733190985772.png(站内我传不了图,只能这样了
环境是宝塔?如果是的话CLI和运行项目的是两个php,cli的扩展有的每有
用 tinker 命令调试
可能fpm和cli用的不是同一个版本的php