使用PHPMailer在电子邮件正文中嵌入图像时出现问题

时间:2017-11-12 12:19:08

标签: php phpmailer html-email

我想使用phpqrcode库生成QR码,并将其作为嵌入电子邮件正文中的图像发送(不将其附加到电子邮件中)。我正在使用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值。

我做错了什么,我该怎么做才能解决它?

3 个答案:

答案 0 :(得分: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;
}

image

答案 1 :(得分:0)

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

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

克里斯&#39;示例有效,因为他还提供了包含扩展名的文件名,如果您在调用addStringEmbeddedImage时没有提供显式MIME类型,PHPMailer会使用它来派生MIME类型(如果可以)。

简而言之,请将您的电话改为:

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

答案 2 :(得分:0)

这将起作用:

$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!";
}