PHP HTML生成的电子邮件缓存图像,从而显示旧图像

时间:2010-01-12 08:04:32

标签: php email sendmail

我正在使用PHP生成一个html电子邮件,以图表的形式向我的客户发送最新的统计信息。 PHP每次发送具有相同图像名称的统计信息时都会生成新映像,以防止占用大量磁盘空间。现在我的问题是图像被缓存,从而将旧图像显示给客户端而不是新图像。

我的html标题如下所示。

"From: Test <test@test.com>\n"
      // . "To: " . $contact . " <" . $email . ">\n"
       . "To: myemail@test.com\n"
       . "X-Confirm-Reading-To: test@test.com\n"
       . "Disposition-Notification-To: test@test.com\n"
       . "MIME-Version: 1.0\n"
       . "Content-Type: multipart/mixed;"
       . ' boundary="PAA08673.1018277622/www.test.com"'
       . "\nSubject: Stats for $name\n\n"
       . "This is a MIME-encapsulated message\n\n"
       . "--PAA08673.1018277622/test@test.com"
       . "\nContent-Type: text/html\n\n";

如何强制邮件从服务器下载最新生成的图像?

2 个答案:

答案 0 :(得分:3)

在网址中加入额外内容,例如图表图片的时间戳

<img src="http://example.com/graphs/graph.png?t=1263283697">

这样,无论何时图像都会改变URL。这不会阻止用户代理缓存它看到的内容,因此即使在服务器更新后它仍然可能显示旧图像。

因此,如果你想阻止用户代理实际缓存图像,那么编写一个脚本,返回带有一些标题的图像以防止缓存....

$file="graph.png";
$size=filesize($file);

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Content-Length: $size");
header("Content-Type: image/png");

readfile($file);

答案 1 :(得分:1)

让文件名本身包含时间戳。因此,不要覆盖旧图像,而是首先将其删除(从而确保它真的消失了),并将其替换为具有较新图像名称的较新图像。