【问题标题】:Unable to embed base64 image URI in mail using PHPMailer无法使用 PHPMailer 在邮件中嵌入 base64 图像 URI
【发布时间】:2022-01-11 15:59:13
【问题描述】:

我正在使用https://github.com/endroid/qr-code 生成二维码,并使用 PHPMailer (https://github.com/PHPMailer/PHPMailer) 获取它们的 URI 以将它们嵌入到邮件中。

构建邮件对象:

$mail = new PHPMailer();
$mail->CharSet = "utf-8";
$mail->isSMTP();
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->SMTPDebug = 1; 
$mail->Host = "smtp.gmail.com";
$mail->Port = "587";
$mail->Username = "something@somewhere.com";
$mail->Password = "password";
$mail->setFrom("somewhere");
$mail->isHTML(true);
$mail->Subject = "QR";

然后生成URI并嵌入到邮件中

$qrURI = generateQR($requestId)
$mail->addStringEmbeddedImage($qrURI,"qr","qr.png",'base64','image/png');
$mail->Body = 'QR code: <img src="cid:qr" alt="QR code">'

发送的邮件中的结果是这样的:

我有 SMTPDebug=1,它没有给我任何错误

这是我生成的一个 URI 作为示例:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAFACAIAAABC8jL9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFEUlEQVR4nO3dQY7bQBAEQdPw/78sP2HHBhutJCPOC61EKTGnwlyfz+cX0PR7+w0A/0/AECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCE/Tn8u+u6Rt/HM5wvQ573PN/82SccPk8nMIQJGMIEDGEChjABQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFD2Oka6dzz7mqZWM9MbHd2X3OC39KPnMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMIEDGH3r5HO7d6R8+aly5s/+4TF5+kEhjABQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAI21wjseXNu6WHcQJDmIAhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIRZI3278z3QxMbIbunLOYEhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMI210j2K/ea2BhVvPa35ASGMAFDmIAhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAi7f430vKXLhMo9Rrvfpt/Sj5zAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjCBAxh12svldn1vJ2NH9IKJzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMIEDGEChjABQ9jp3UgT65ndG3p27xx63mc/N/E8K27/7E5gCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjCBAxhAoaw0zXShMoqZeK/Vz57xcTzTHxHTmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMIEDGEChrD710i7251dE3cj7dq9RWnC7vu8/Xt3AkOYgCFMwBAmYAgTMIQJGMIEDGEChjABQ5iAIUzAECZgCBMwhF23zyN2b6k5V7nxqPKaFbu/pdufvBMYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCHs9G6kiQ3H7i01D1ulDL3mhMr7THACQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCEna6R7EK+X+Wuqcq+KvGbdwJDmIAhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIRdh5OL3XuMKib2K5U7nCoe9h05gSFMwBAmYAgTMIQJGMIEDGEChjABQ5iAIUzAECZgCBMwhAkYwk7vRjqXuFHmn1QWOZWN0e77nLhvafETOYEhTMAQJmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMLuXyOdq2xiJkxsYnbtbowm/nviO3ICQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCEba6ROFG5mencxHan8pRu/+xOYAgTMIQJGMIEDGEChjABQ5iAIUzAECZgCBMwhAkYwgQMYQKGMGukHbuLnOfdC7X7PBdve3ICQ5iAIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCEba6RdjcxuyrLoXO7txPtPs/z17z9KTmBIUzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjCrsMhxe7WpGJxlTKksoU6t/vkb3+eTmAIEzCECRjCBAxhAoYwAUOYgCFMwBAmYAgTMIQJGMIEDGEChrDTNRLwhZzAECZgCBMwhAkYwgQMYQKGMAFDmIAhTMAQJmAIEzCECRjC/gIsHA2FiBfxDQAAAABJRU5ErkJggg==

编辑: 好像数据格式不对,怎么输出二维码嵌入到邮件中?

这是我在尝试@Synchro 所说的之后的 generateQR 函数:

function generateQR($requestId){
    try {
        $writer = new PngWriter();
        $qrCode = QrCode::create($requestId)
        ->setEncoding(new Encoding('UTF-8'))
        ->setErrorCorrectionLevel(new ErrorCorrectionLevelLow())
        ->setSize(300)
        ->setMargin(10)
        ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())
        ->setForegroundColor(new Color(0, 0, 0))
        ->setBackgroundColor(new Color(255, 255, 255));

        $result = $writer->write($qrCode);
        echo $result->getString()
        } 
    catch (\Throwable $th) {
            echo $th;
        }
}

【问题讨论】:

    标签: php email uri phpmailer embed


    【解决方案1】:

    PHPMailer 不支持数据 URI,主要是因为使用它们不是一个好主意,因为它们在电子邮件客户端之间存在很多兼容性问题。最好使用常规的嵌入图像。为此,您需要做的就是将二进制 PNG 数据传递到对 addStringEmbeddedImage 的调用的第一个参数中,而不是 URI 编码的数据。我假设您需要修改 generateQR 函数以提供该格式的数据。

    【讨论】:

    • 检查您的答案后,我尝试以不同的方式输出数据。它应该被创建为 png,然后我将它作为字符串传递给 addStringEmbeddedImage() 但它仍然不起作用。你知道我怎样才能得到正确的数据吗?
    • 看不到你的二维码生成代码,我无事可做。您还需要定义“不起作用”。
    • 我编辑了我的帖子以显示我的 generateQR 功能。当我说“不起作用”时,我的意思是邮件中的结果是一样的。唯一的区别是开发人员工具中的输出似乎输出某种以 PNG 开头的原始数据。我真的不知道如何进一步解决问题
    • 你需要返回数据,而不是回显它。
    • 这行得通。我已经习惯了回显而不是使用返回,所以我没有考虑过。非常感谢。
    猜你喜欢
    • 2011-04-12
    • 2013-03-09
    • 2014-02-16
    • 2020-09-21
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2018-04-25
    相关资源
    最近更新 更多