Yii2使用SendGrid发送HTML邮件时图片不显示及视图引用问题
问题1:HTML邮件中的图片无法正常显示的解决方法
出现这个问题的核心原因是邮件客户端无法识别HTML内容里的相对路径图片,可选择以下两种方案解决:
- 方案1:使用公开可访问的绝对URL引用图片
将需要用到的图片放到可公网访问的静态资源服务器,视图中使用完整的HTTPS路径引用图片。Yii2中可以通过Url助手类的to方法生成带域名的绝对URL,第二个参数传true即可自动补全域名:<!-- 视图文件内的图片引用写法 --> <img src="<?= \yii\helpers\Url::to('@web/images/notify_logo.png', true) ?>" alt="通知logo"> - 方案2:将图片作为内嵌附件加入邮件
不需要依赖外部静态资源,直接把图片嵌入邮件内容中,需要调整邮件构造方式,在compose方法中就传入视图,让视图可以获取到$message实例调用embed方法:<!-- 视图文件内的图片引用写法 --> <img src="<?= $message->embed(Yii::getAlias('@webroot/images/notify_logo.png')) ?>" alt="通知logo">
问题2:是否可以通过绝对路径引用视图文件
完全可以,Yii2的邮件compose方法支持传入路径别名或者完整绝对路径加载视图文件,只要对应视图文件有可读权限就能正常渲染:
// 使用路径别名指定视图位置 $mailer->compose('@app/mail_templates/app_launch'); // 直接传入完整绝对路径 $mailer->compose('/var/www/project/mail_templates/app_launch.php');
代码优化提示
你当前的代码调用了两次setHtmlBody,后面的调用会直接覆盖前面的内容,建议删掉冗余的->setHtmlBody('Your package is here')行。调整后的完整参考代码如下:
public function actionApi() { echo Yii::$app->formatter->asTimestamp(date('Y-d-m h:i:s')); $mailer = Yii::$app->mailer; $message = $mailer->compose('@app/views/mail/app_launch') ->setTo('rod@yahoo.mx') ->setFrom(['info@google.mx' => 'Mexico City']) ->setReplyTo('info@google.mx') ->setSubject('Your package is here') ->send(); if ($message === true) { echo 'Success!'; echo '<pre>' . print_r($mailer->getRawResponses(), true) . '</pre>'; } else { echo 'Error!<br>'; echo '<pre>' . print_r($mailer->getErrors(), true) . '</pre>'; } }
内容的提问来源于stack exchange,提问作者Gandalf
相关产品推荐
相关产品推荐

