邮件中的电子邮件附件问题()

时间:2010-01-08 01:14:26

标签: php email

我正在尝试通过电子邮件将我的服务器上的图像作为附件发送。为了完成这个任务,我使用了以下PHP脚本,该脚本从我的服务器中获取位于名为“screenshots”的目录中的JPG(称为“php.jpg”)并将其作为附件发送。

<?php

$path = "screenshots/php.jpg";
$fp = fopen($path, 'r');
do //we loop until there is no data left
{
        $data = fread($fp, 8192);
        if (strlen($data) == 0) break;
        $content .= $data;
      } while (true);
$content_encode = chunk_split(base64_encode($content));


$mime_boundary = "<<<--==+X[".md5(time())."]";

$headers .= "From: Automatic <an.e.mail@domain.net>\r\n"; 
$headers .= "To: SomeName <me@gmail.com>\r\n"; 

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"".$mime_boundary."\"";

$message .= "This is a multi-part message in MIME format.\r\n";
$message .= "\r\n";
$message .= "--".$mime_boundary."\r\n";

$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n";
$message .= "\r\n";
$message .= "Email content and what not: \r\n";
$message .= "This is the file you asked for! \r\n";
$message .= "--".$mime_boundary."\r\n";

$message .= "Content-Type: image/jpeg;\r\n";
$message .= " name=\"php.jpg\"\r\n";
$message .= "Content-Transfer-Encoding: quoted-printable\r\n";
$message .= "Content-Disposition: attachment;\r\n";
$message .= " filename=\"php.jpg\"\r\n";
$message .= "\r\n";
$message .= $content_encode;
$message .= "\r\n";
$message .= "--".$mime_boundary."\r\n";

$ok = mail("me@gmail.com", "file by email", $message, $headers);

总的来说,脚本有效。我在收件箱中收到一封电子邮件,其中包含上面指定的邮件文本和JPG附件。 Stack Overflow不允许我发布照片,因为我是新手,但可以在此处找到该消息的屏幕截图:http://i48.tinypic.com/xfuee0.png

当我尝试查看附件时出现问题。单击附件只会打开一个新的浏览器窗口并显示缺少的图像图标。

您是否发现我的脚本存在任何会阻止图像显示的问题?

任何信息都会很棒。谢谢!

3 个答案:

答案 0 :(得分:3)

对于将来遇到这篇文章的人来说,问题来自于“内容传输编码”,它本应设置为base64。

$message .= "Content-Transfer-Encoding: quoted-printable\r\n";

变为:

$message .= "Content-Transfer-Encoding: base64\r\n";

答案 1 :(得分:0)

我可以看到你没有看到你的形象的一个可能原因。 (可能还有更多(!)。)

尝试更改:

$message .= "--".$mime_boundary."\r\n"; 

$message .= "--".$mime_boundary."--\r\n"; 

对于邮件调用之前的最后一行(即“结尾”边界)。

答案 2 :(得分:0)

有三件事情跳出来:

一个是变量$content$message以及$headers的第一个附加内容未明确设置新值。那就是为什么不

$headers = "From: Automatic <an.e.mail@domain.net>\r\n";

而不是像你一样:

$headers .= "From: Automatic <an.e.mail@domain.net>\r\n";

这消除了一些剩余的东西在变量中被遗漏的可能性。

第二个是\r\n而不是普通\n,它应该适用于每个系统,甚至是Windows。我怀疑这是一个问题。

第三是关闭的mime边界与open不同。