我正在使用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).'">';