【发布时间】:2019-05-11 12:52:35
【问题描述】:
制作一个包含文本文件作为附件的 PHP 脚本。当我发送到 GMAIL 地址时它工作得很好,但是当我发送到位于另一个网络托管商的地址时,我可以看到文件已附加,但是当我打开它时,文件是空的(没有内容)..什么会导致这个?这是我使用的代码:
$filename = basename($dirfilename);
$body = "File is included in mail";
$path = "downloads/";
$file = $path.$filename;
$file_size = filesize($file);
$handle = fopen($file, "r");
$content = fread($handle, $file_size);
fclose($handle);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);
$eol = PHP_EOL;
// Headers
$header = "From: ".$from_name." <".$from_mail.">".$eol;
$header .= "Reply-To: ".$replyto.$eol;
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"";
// Message
$message = "--".$uid.$eol;
$message .= "Content-Type: text/html; charset=UTF-8".$eol;
$message .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$message .= $body.$eol;
$message .= "--".$uid.$eol;
$message .= "Content-Type: text/plain; name=\"".$filename."\"".$eol;
$message .= "Content-Transfer-Encoding: base64".$eol;
$message .= "Content-Disposition: attachment;\r\n filename*=utf-8''" . rawurlencode($filename).$eol;
$message .= $content.$eol;
$message .= "--".$uid."--";
if (mail($mail_to, $subject, $message, $header))
{
echo "File sent";
} else {
echo "Fail";
}
【问题讨论】:
-
“什么会导致这种情况?” - 天真地使用
mail,而不是像 PHP Mailer 或 Swift Mailer 这样的专用邮件程序类……说真的,不要尝试自己组装这样的邮件,改用经过验证的解决方案。 -
好吧,如果你想保留这个复制粘贴(其中有很多陷阱),那么查看生成的 MIME 消息并与 RFC2822/RFC2387 等进行比较。
-
您没有正确设置内容类型和边界。看看这个问题:stackoverflow.com/questions/3902455/… 虽然正如 cmets 和链接问题中提到的那样,使用PHP Mailer class 几乎肯定会更好,它会为您省去一些麻烦。
标签: php