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

Yii2 PHP中如何在邮件中显示动态生成的二维码(无需存储)

解决Yii2中tc-lib-barcode二维码嵌入邮件的问题

一、修复现有tc-lib-barcode的嵌入问题

邮件客户端对动态图片的解析逻辑和浏览器/Postman不同,试试以下两种可靠方案:

1. Base64直接嵌入(最简单)

用getPng()获取二维码二进制内容,转成Base64后通过data URI嵌入<img>标签:

// 生成二维码对象并获取PNG二进制数据
$barcode = new \Com\Tecnick\Barcode\Barcode();
$qrBinary = $barcode->getBarcodeObj('QRCODE,H', '你的二维码内容', -4, -4, 'black', array(-2, -2, -2, -2))->getPng();

// 转Base64编码
$base64Qr = base64_encode($qrBinary);

// 邮件HTML中的图片标签
$imgTag = '<img src="data:image/png;base64,' . $base64Qr . '" alt="二维码">';

把$imgTag直接插入邮件HTML内容即可,主流邮件客户端基本都支持这种方式。

2. 内嵌附件关联CID(兼容性更好)

如果Base64方式有兼容性问题,用Yii2邮件组件的内嵌附件功能,通过CID关联图片:

// 生成二维码PNG二进制数据
$barcode = new \Com\Tecnick\Barcode\Barcode();
$qrBinary = $barcode->getBarcodeObj('QRCODE,H', '你的二维码内容', -4, -4, 'black', array(-2, -2, -2, -2))->getPng();

// 构建并发送邮件
$mail = Yii::$app->mailer->compose()
    ->setTo('收件人邮箱')
    ->setSubject('带二维码的邮件')
    // 添加内嵌附件,指定唯一CID标识
    ->attachContent($qrBinary, [
        'fileName' => 'qrcode.png',
        'contentType' => 'image/png',
        'inline' => true,
        'cid' => 'qrcode_unique_id'
    ])
    // HTML内容中通过CID引用图片
    ->setHtmlBody('<p>请扫描下方二维码:</p><img src="cid:qrcode_unique_id" alt="二维码">');

$mail->send();

这种方式会把二维码作为邮件内嵌附件,邮件客户端会自动关联CID显示图片,兼容性比Base64更稳定。

二、推荐替代扩展

如果tc-lib-barcode用着不顺手,可以试试endroid/qr-code,Yii2生态中使用率很高,集成简单、功能完善:

安装(Composer)

composer require endroid/qr-code

生成Base64嵌入邮件示例

use Endroid\QrCode\QrCode;

$qrCode = QrCode::create('你的二维码内容')
    ->setSize(300)
    ->setMargin(10);

// 直接生成data URI格式的Base64字符串
$qrDataUri = $qrCode->toDataUri();

// 邮件中直接使用
$imgTag = '<img src="' . $qrDataUri . '" alt="二维码">';

它还支持自定义颜色、添加logo、生成文件或直接输出到浏览器等功能,文档直观,嵌入邮件场景下基本不会有兼容性问题。

内容的提问来源于stack exchange,提问作者Krishna Ramchandani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:47:22