在邮件中嵌入图像而无需物理图像文件

Posted

技术标签:

【中文标题】在邮件中嵌入图像而无需物理图像文件【英文标题】:Embed Image in Mail without having physical Image File 【发布时间】:2016-08-04 03:15:12 【问题描述】:

我正在使用 Google Maps Static API 以 PNG 格式请求图像。目前我正在将此图像保存到文件系统,然后我将使用 phpMailer 将此图像发送给我的客户。发送完所有邮件后,图像将从文件系统中删除。

我现在的意图是省去将图像保存到文件系统的步骤,只需使用内存中的图像对象并通过邮件发送它。但是似乎PHPMailer必须在Filesystem上有一个Image才能使用它。

我目前在做什么:

从静态 API 请求图片

 $URL = "http://maps.googleapis.com/maps/api/staticmap?center=Albany,+NY&zoom=13&scale=false&size=600x300&maptype=roadmap&format=png&visual_refresh=true";
 $image = file_get_contents($URL);

将图像保存到文件系统并将其发送到我的邮件功能

 $fp  = fopen('../../img/staticMap/staticMap.png', 'w+');

 fputs($fp, $image);
 fclose($fp);
 unset($image);

 $file = "../../img/staticMap/staticMap.png";
 $notifications->notifySingleUser($file); //Call my Mail Function

在邮件中嵌入图片

$mail = new PHPMailer();
$mail->CharSet = 'UTF-8';
$mail->Ishtml(true);
$mail->AddEmbeddedImage($file, "staticMap");
$mail->Body = "<img   src="cid:staticMap">";

我也做了一些研究PHPMailer attachment, doing it without a physical file,但在这里他们只是在谈论如何使用 AddAttachment 来做,但我想使用 AddEmbeddedImage。我也试过了,邮件发送没有任何错误,但没有图像。

这甚至可能吗?如果是,我该如何存档?

【问题讨论】:

【参考方案1】:

由于许多原因,嵌入图像不好。不同客户的体验各不相同。有些显示图像,有些不显示,有些附上它,有些两者都做。您也可以将图像添加到正文并使用 base64 对图像进行编码。设置图片的返回类型为base 64。

这是 base64 图像的示例。

$mail->Body = '<img src="data:image/gif;base64,'.base64_encode($file).'">';

【讨论】:

【参考方案2】:

read the docs 总是有帮助。您正在寻找的功能是 addStringEmbeddedImage,它完全符合您的要求:

$URL = "http://maps.googleapis.com/maps/api/staticmap?center=Albany,+NY&zoom=13&scale=false&size=600x300&maptype=roadmap&format=png&visual_refresh=true";
$image = file_get_contents($URL);
$mail->addStringEmbeddedImage($image, 'staticMap', 'map.png', 'base64', 'image/png');
$mail->Body = '<img   src="cid:staticMap">';

使用嵌入图像确实有利有弊,但数据 url 的客户端兼容性特别差,因此通常是最差的选择。使用谷歌地图动态链接到图像可能不可靠,因此您可能需要代理和缓存直接地图查找。这也将比每次都访问 API 快得多,而且更可靠,因为如果 API 没有响应或速度很慢,您可以交付旧版本。

【讨论】:

以上是关于在邮件中嵌入图像而无需物理图像文件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:如何将图像作为内容而不是附件嵌入电子邮件中

是否可以像 Outlook RTF/TNEF 那样在 html 电子邮件中嵌入非图像附件?

在 Thunderbird 中使用 Content-ID 和 cid 嵌入电子邮件图像

如何将图像保存和读取为文本,嵌入在代码中

电子邮件中的图像:链接还是嵌入?

Python,MIME,在电子邮件中嵌入图像