【问题标题】:Issue when embedding image in email body with PHPMailer使用 PHPMailer 在电子邮件正文中嵌入图像时出现问题
【发布时间】:2018-04-25 05:04:51
【问题描述】:

我想使用phpqrcode 库生成一个二维码,并将其作为嵌入在电子邮件正文中的图像发送(不附加到电子邮件中)。我正在使用PHPMailer 库来创建和发送电子邮件。

我使用的代码如下

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

include ('../phpqrcode/qrlib.php');
ob_start();
QRcode::png('TextToGenerateTheQRCodeFrom');
$imageString = base64_encode( ob_get_contents() );
ob_end_clean();

$mail = new PHPMailer;
$mail->setFrom( 'testqrsend@testqrsend.sdf', 'Test QR sender');
$mail->addAddress('xxxxxxxxxxx', 'John Doe');
$mail->Subject  = 'QR code';
$mail->isHTML(true);
$mail->addStringEmbeddedImage($imageString,'qrcode');

$mail->Body = "<p> Your QR code </p><img src=\"cid:qrcode\" />";

if(!$mail->send()) {
  echo 'Message was not sent.';
  echo 'Mailer error: ' . $mail->ErrorInfo;
} else {
  echo 'Message has been sent.';
}
?>

这是我收到的电子邮件。

.

如您所见,图像并未嵌入电子邮件正文中。不过附上一个文件。该文件是一个文本文件,包含图像的 base64 值。

我做错了什么,我能做些什么来解决它?

【问题讨论】:

  • 我相信 addStringEmbeddedImage 需要原始图像而不是 base64 编码版本。试试这个,看看它是否有效。
  • @Chris,我将原始图像作为 addStringEmbeddedImage 的第一个参数传递并检查。但是,图像仍然没有显示在电子邮件正文中
  • @Chris,当您说将原始图像传递给 addStringEmbeddedImage 函数时,我所做的是将 QRcode::png() 返回的值分配给变量 $img = QRcode::png ('TextToGenerateTheQRCodeFrom');然后将 $img 作为 addStringEmbeddedImage() 的第一个参数传递。这是你的意思吗?我现在问这个是因为当我再次阅读您的评论时,我觉得我做得不对

标签: php phpmailer html-email


【解决方案1】:

我自己设置了一些东西,可以确认此代码有效。我已向我的 Gmail 帐户发送了一封电子邮件。我会附上截图作为证据;-)

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$image = 'http://cdnqrcgde.s3-eu-west-1.amazonaws.com/wp-content/uploads/2013/11/jpeg.jpg';
$image = file_get_contents($image);

$body = '<p>this is a <strong>test</strong> email</p><p><img src="cid:qrcode" /></p>';

$mail = new PHPMailer(true);
try {
    $mail->isSMTP();
    $mail->Host = 'localhost';
    $mail->SMTPAuth = false;

    $mail->setFrom('chris@me.com', 'Chris');
    $mail->addAddress('me@gmail.com');

    $mail->isHTML(true);
    $mail->Subject = 'This is a PHPMailer Test';
    $mail->Body    = $body;
    $mail->AltBody = $body;

    $mail->addStringEmbeddedImage($image,'qrcode','qrcode.jpg');

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
}

【讨论】:

  • 我在执行此代码时收到了如您的屏幕截图所示的电子邮件。因此,我认为将生成的二维码传递到电子邮件中时会出现问题
  • 如果您仍然卡住并需要快速解决方案,那么您可以随时使用 Google 生成 QR 码 - chart.googleapis.com/… - 然后您可以将 hello 的值更改为要显示的代码.然后您可以调整我的代码以从 Google 获取 QR 码。
  • Chris - 你能解释一下 $mail->AltBody = $body 的作用吗?从文档来看,它适用于无法执行 HTML 的电子邮件客户端,所以由于您的 $body 中有 html 元素,它是否会以某种方式神奇地剥离所有 html 并只留下文本部分?我需要通过 1234567890@vzwpix.com 之类的电子邮件发送无法使用 html 的短信,因此可以将我的 $html_body 添加到 AltBody 并且它会处理它?
  • 我的懒惰例子。我倾向于将 HTML 发送到“正文”,然后将前几段的纯文本版本发送为“AltBody”
【解决方案2】:

如果您阅读the documentation on the function you're using,将会有所帮助。这链接自自述文件,也在 github 上的项目页面上。

如果这不起作用,原因是您向它传递了一些二进制数据而没有告诉它它是什么类型的东西,所以它回退到通用application/octet-stream MIME 类型,它将显示为通用附件,如您所见。

Chris 的示例之所以有效,是因为他还提供了一个包含扩展名的文件名,如果您在对 addStringEmbeddedImage 的调用中没有提供明确的 MIME 类型,PHPMailer 会使用它来派生 MIME 类型(如果可以的话)。

简而言之,把你的电话改成这样:

$mail->addStringEmbeddedImage($imageString, 'qrcode', 'qrcode.png');

【讨论】:

  • 当我按照您的建议进行更改时,我收到了没有附件的电子邮件。但是图像不会显示在电子邮件正文中
  • 检查它的返回值,告诉我们你的 MIME 结构。绝对确定(检查,不要认为它是正确的!)该内容实际上是您所期望的内容在您尝试通过电子邮件发送之前 - 使用file_get_contents 获取外部URL 有很多限制,特别是如果您使用默认的流上下文。
【解决方案3】:

这将起作用:

$imgSrc = str_replace('amp;','', 'https://chart.googleapis.com/chart? 
cht=qr&chs=250x250&choe=UTF-8');    

$mail->setFrom('chris@me.com', 'Chris');
$mail->addAddress('me@gmail.com');

$mail->isHTML(true);
$mail->Subject = 'This is a PHPMailer Test';
$mail->msgHTML("<p>this is a <strong>test</strong> email</p><img src='$imgSrc'>");
if(!$mail->send()){
    echo "Mailer Error: " . $mail->ErrorInfo;
}else{
    echo "Message sent!";
}

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多