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

Java生成二维码嵌入HTML模板发邮件(无需保存至磁盘)

解决方案

当然可以不用将二维码保存到磁盘,直接把它转成Base64编码的Data URI嵌入HTML的<img>标签里,具体实现如下:

核心思路

把生成的二维码BufferedImage写入字节输出流,再将字节数组转换为Base64字符串,最后拼接成data:image/png;base64,xxx格式的Data URI,直接作为<img>标签的src属性值即可。

修改后的代码

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.qrcode.QRCodeWriter;
import javax.imageio.ImageIO;

public String generateQrCodeAsDataUri(String content) {
    try {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        // 生成二维码矩阵
        var bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, 450, 450);
        // 转换为BufferedImage
        var bfi = MatrixToImageWriter.toBufferedImage(bitMatrix);
        
        // 写入字节输出流,避免磁盘存储
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(bfi, "PNG", baos);
        
        // 字节数组转Base64字符串
        byte[] qrBytes = baos.toByteArray();
        String base64Qr = Base64.getEncoder().encodeToString(qrBytes);
        
        // 拼接成Data URI格式,直接用于img的src
        return "data:image/png;base64," + base64Qr;
    } catch (IOException | WriterException e) {
        throw new RuntimeException(e);
    }
}

HTML模板中的使用方式

将上述方法返回的字符串直接赋值给<img>的src属性即可:

<img src="${qrCodeDataUri}" alt="二维码">

注意事项

  • 绝大多数主流邮件客户端都支持Data URI,但极少数老旧客户端可能存在兼容问题;如果需要覆盖所有场景,可考虑邮件附件+CID引用方案,但Data URI是更贴合你需求的无磁盘方案。
  • Base64编码会让数据体积增加约30%,但450x450尺寸的PNG二维码转码后体积不大,完全在邮件内容的合理范围内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:13:20