使用 PHP 到 return base64 编码电子邮件中的图像
using PHP to return an image in a base64 encoded email
我正在开发电子邮件发送和跟踪应用程序,但我 运行 遇到了一个我无法解决的问题。我想在我的电子邮件中向我们发送跟踪图像,但我遇到了一些奇怪的行为。目前,我正在发送以 base64 编码的电子邮件。在 HTML 消息的正文中,我将带有 link 的 HTML 图像标签用于我服务器上的 PHP 文件。该文件使用以下 PHP 代码发回图像:
header("Content-Type: image/png");
readfile("full-server-path-to-image.png");
这就是奇怪的地方。如果我在 Outlook 电子邮件客户端中查看消息,图像将不会显示(仅显示红色 "X" 图像图标)。不过,其他通常 linked 的图像会显示得很好。如果我在 Gmail 中查看同一封邮件,我可以看到所有图片。图像在某些电子邮件客户端但不是所有客户端中都能很好地服务,这真的很奇怪。
当我更改为使用 base64 对消息进行编码时,我注意到这个问题开始了。在我开始对我的消息进行编码之前,我能够在任何电子邮件客户端中查看所有图像。我的直觉告诉我这与内容编码类型有关,但我不知道如何解决它。如有任何帮助,我们将不胜感激!
这是我用来发送消息的 PHP 代码:
$myHTMLmessage = chunk_split(base64_encode('
<html><head></head><body>
<img src="https://www.my-web-site.com/openTrack.php?t={trackerid}"></a>
</body></html>'));
$boundary = uniqid('np');
$to = "somebody-else@another-web-site.com"
$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: somebody@my-web-site.com\r\n";
$headers .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";
$message = "This is a MIME encoded message.";
$message .= "\r\n\r\n--" . $boundary . "\r\n";
$message .= "Content-Type: text/plain;charset=UTF-8\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n\r\n";
//Plain text body
$message .= "some plain text";
$message .= "\r\n\r\n--" . $boundary . "\r\n";
$message .= "Content-Type: text/html;charset=UTF-8\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n\r\n";
//Html body
$message .= $myHTMLmessage;
$message .= "\r\n\r\n--" . $boundary . "--";
mail($to,$subject,$message,$headers);
以防万一有人遇到这样的事情,我发现这一切都归结为电子邮件客户端如何编码 urls。在我的原始代码中,我在图像 src 属性中使用了带有 2 个参数的 url。像这样:
http://www.my-web-site.com/page.php?pram1=something&pram2=something
当 Outlook 处理此 url 时,它会更改为:
http://www.my-web-site.com/page.php?pram1=something&pram2=something
其他电子邮件客户端足够聪明,可以保留 &
符号而不将其转换为 &
在我的实时代码中,我需要 $_GET
两个 url 参数并处理它们。如果我的脚本无法处理这两个参数,那么它甚至不会到达发回图像的行。我能想到的最佳解决方法是在我的 page.php 文件中添加此代码:
$pram1 = $_GET['pram1'];
$pram2 = $_GET['pram2'];
if(!isset($pram2)){
$pram2 = $_GET['amp;pram2'];
}
// now regardless of the email client both parameters contain a value to process
if((isset($pram1)) && (isset($pram2))){
header("Content-Type: image/png");
readfile("full-server-path-to-image.png");
}
我知道这听起来很简单,但我为此挠头太久了。最初,我确信这与消息在发送前的编码方式有关。从没想过 Outlook 会更改我的代码。其次,虽然微软从不喜欢让事情变得简单.....永远不会变老......大声笑
我正在开发电子邮件发送和跟踪应用程序,但我 运行 遇到了一个我无法解决的问题。我想在我的电子邮件中向我们发送跟踪图像,但我遇到了一些奇怪的行为。目前,我正在发送以 base64 编码的电子邮件。在 HTML 消息的正文中,我将带有 link 的 HTML 图像标签用于我服务器上的 PHP 文件。该文件使用以下 PHP 代码发回图像:
header("Content-Type: image/png");
readfile("full-server-path-to-image.png");
这就是奇怪的地方。如果我在 Outlook 电子邮件客户端中查看消息,图像将不会显示(仅显示红色 "X" 图像图标)。不过,其他通常 linked 的图像会显示得很好。如果我在 Gmail 中查看同一封邮件,我可以看到所有图片。图像在某些电子邮件客户端但不是所有客户端中都能很好地服务,这真的很奇怪。
当我更改为使用 base64 对消息进行编码时,我注意到这个问题开始了。在我开始对我的消息进行编码之前,我能够在任何电子邮件客户端中查看所有图像。我的直觉告诉我这与内容编码类型有关,但我不知道如何解决它。如有任何帮助,我们将不胜感激!
这是我用来发送消息的 PHP 代码:
$myHTMLmessage = chunk_split(base64_encode('
<html><head></head><body>
<img src="https://www.my-web-site.com/openTrack.php?t={trackerid}"></a>
</body></html>'));
$boundary = uniqid('np');
$to = "somebody-else@another-web-site.com"
$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: somebody@my-web-site.com\r\n";
$headers .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";
$message = "This is a MIME encoded message.";
$message .= "\r\n\r\n--" . $boundary . "\r\n";
$message .= "Content-Type: text/plain;charset=UTF-8\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n\r\n";
//Plain text body
$message .= "some plain text";
$message .= "\r\n\r\n--" . $boundary . "\r\n";
$message .= "Content-Type: text/html;charset=UTF-8\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n\r\n";
//Html body
$message .= $myHTMLmessage;
$message .= "\r\n\r\n--" . $boundary . "--";
mail($to,$subject,$message,$headers);
以防万一有人遇到这样的事情,我发现这一切都归结为电子邮件客户端如何编码 urls。在我的原始代码中,我在图像 src 属性中使用了带有 2 个参数的 url。像这样:
http://www.my-web-site.com/page.php?pram1=something&pram2=something
当 Outlook 处理此 url 时,它会更改为:
http://www.my-web-site.com/page.php?pram1=something&pram2=something
其他电子邮件客户端足够聪明,可以保留 &
符号而不将其转换为 &
在我的实时代码中,我需要 $_GET
两个 url 参数并处理它们。如果我的脚本无法处理这两个参数,那么它甚至不会到达发回图像的行。我能想到的最佳解决方法是在我的 page.php 文件中添加此代码:
$pram1 = $_GET['pram1'];
$pram2 = $_GET['pram2'];
if(!isset($pram2)){
$pram2 = $_GET['amp;pram2'];
}
// now regardless of the email client both parameters contain a value to process
if((isset($pram1)) && (isset($pram2))){
header("Content-Type: image/png");
readfile("full-server-path-to-image.png");
}
我知道这听起来很简单,但我为此挠头太久了。最初,我确信这与消息在发送前的编码方式有关。从没想过 Outlook 会更改我的代码。其次,虽然微软从不喜欢让事情变得简单.....永远不会变老......大声笑