You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 15:06:02