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

时间:2016-04-13 07:25:58

标签: php image google-maps-api-3 phpmailer

我使用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。我也尝试过,邮件发送没有任何错误,但没有任何图像。

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

2 个答案:

答案 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).'">';
相关问题