在没有物理图像文件的情况下在邮件中嵌入图像


Embed Image in Mail without having physical Image File

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

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

我目前的工作:

从静态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 width="600" height="300" src="cid:staticMap">";

我也做了一些PHPMailer附件的研究,在没有物理文件的情况下进行,但这里他们只是在讨论如何使用AddAttachment,但我想添加EmbeddedImage。我也试过,邮件发送时没有任何错误,但没有图像。

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

阅读文档总是有帮助的。您正在寻找的函数是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 width="600" height="300" src="cid:staticMap">';

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

由于多种原因,嵌入图像很糟糕。客户的体验各不相同。有些显示图像,有些不显示,有些附加图像,有些同时显示图像。您还可以将图像添加到身体中,并使用base64对图像进行编码。将图像的返回类型设置为64。

下面是base64图像的一个示例。

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