我使用Google Maps Static API将图片请求为PNG。目前我正在将此图像保存到文件系统,然后我将此图像与PHPMailer一起发送给我的客户端。发送完所有邮件后,图像将从文件系统中删除。
我的目的是为了节省将图像保存到文件系统的步骤,只需使用内存中的图像对象并通过Mail发送。但似乎PHPMailer必须在文件系统上有一个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 width="600" height="300" src="cid:staticMap">";
我也做了一些研究PHPMailer attachment, doing it without a physical file,但这里他们只是在谈论如何用AddAttachment来做,但我想要AddEmbeddedImage。我也尝试过,邮件发送没有任何错误,但没有任何图像。
这甚至可能吗?如果是,我该如何存档?
答案 0 :(得分:4)
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 width="600" height="300" src="cid:staticMap">';
使用嵌入式图像确实有利有弊,但数据网址的客户端兼容性特别差,因此通常是最糟糕的选择。使用谷歌地图动态链接到图像可能不可靠,因此您可能希望代理和缓存直接地图查找。这也比每次点击API快得多,而且如果API没有响应或速度慢,你可以提供更老的版本,这也会更快。
答案 1 :(得分:0)
嵌入图片有很多原因。从客户到客户的体验各不相同。一些显示图像,一些不显示,一些显示图像,一些显示图像。您也可以将图像添加到正文并使用base64对图像进行编码。将图像的返回类型设置为base 64。
以下是base64图像的示例。
$mail->Body = '<img src="data:image/gif;base64,'.base64_encode($file).'">';