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
相关产品推荐
相关产品推荐

