当我通过控制器触发通知时,MailMessage发送时没有任何问题,所有映像都包含在内。
但是,当通过调用控制台命令的调度项触发相同的通知时,无法找到图像。
答案 0 :(得分:2)
你没有显示任何代码,但Security through obscurity也是如此,我想我知道你在说什么。
如果您的APP_URL
包含目录(例如http://localhost/myproject
),并且您使用asset()
来引用视图中的图像,则生成的引用在从浏览器请求,但不是来自队列,预定作业或来自CLI。在CLI中,APP_URL
的目录部分在生成的引用中丢失,您的图像将被破坏。
这是来自Symfony的Laravel中的一个已知问题。看起来它刚刚修复,一个月前:I have been bitten by something similar
<强>更新强>
以下是该问题的具体示例。我正在使用Laravel 5.2(虽然根据上面的问题,它在8月底修复了5.4,因此出现在最新版本中)并在用户在网站上执行某些操作时发送交易电子邮件。我更新了我的电子邮件视图以转储一些值。
浏览器请求,包含Mail::send()
和QUEUE_DRIVER=sync
的实时邮件:
env('APP_URL') http://localhost/myproject // OK
config('app.url') http://localhost/myproject // OK
asset('/images/foo.png') http://localhost/myproject/images/foo.png // OK
这些值都是正确的,asset()
生成的网址会正确显示我的电子邮件图片。
CLI请求,排队邮件,Mail::queue()
和QUEUE_DRIVER=database
:
env('APP_URL') http://localhost/myproject // OK
config('app.url') http://localhost/myproject // OK
asset('/images/foo.png') http://localhost/images/foo.png // xxxx
myproject/
生成的网址中缺少注意asset()
。我的电子邮件中的所有图像引用都已损坏,图像未显示。
如果没有升级到修复了Laravel的版本,那么您所能做的就是在从CLI生成的任何视图中不使用asset()
,而是手动指定资产路径:
config('app.url') . '/images/' . $product->image
旁注 - 正如@ Desh901在评论中指出的https://github.com/laravel/framework/issues/14139:
如果在部署过程中执行config:cache命令,则应确保只从配置文件中调用env函数。