7

为了让生活变得困难,我正在为之工作的客户正在使用一个在 PHP4.0 上运行的非常大但又旧的系统,他们不希望添加任何额外的库。

我正在尝试通过 PHP 发送一封带有附件和随附文本/html 内容的电子邮件,但我无法在一封电子邮件中同时发送这两个内容。

这将发送附件:

$headers = "Content-Type: text/csv;\r\n name=\"result.csv\"\r\n Content-Transfer-Encoding: base64\r\n Content-Disposition: attachment\r\n boundary=\"PHP-mixed-".$random_hash."\"";
$output = $attachment;

mail($emailTo, $emailSubject, $output, $headers);

这会发送文本/html:

$headers = "Content-Type: text/html; charset='iso-8859-1'\r\n";
$output = $emailBody; // $emailBody contains the HTML code.

这会发送一个包含 text/html 的附件以及附件内容:

$headers = "Content-Type: text/html; charset='iso-8859-1'\r\n".$emailBody."\r\n";
$headers = "Content-Type: text/csv;\r\n name=\"result.csv\"\r\n Content-Transfer-Encoding: base64\r\n Content-Disposition: attachment\r\n boundary=\"PHP-mixed-".$random_hash."\"";
$output = $attachment;

我需要知道的是如何在电子邮件正文中发送带有 text/html 的电子邮件并添加附件。我确定我在这里遗漏了一些非常简单的东西!

提前致谢。

4

2 回答 2

14

好的,我终于破解了!以供参考:

$emailBody .= "<html><body>Blah</body></html>";
$emailSubject = "Subject";
$emailCSV = "\"Col1\", \"Col2\"\r\n"; // etc.
$attachment = $emailCSV;

$boundary = md5(time());

$header = "From: Name <address@address.com>\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed;boundary=\"" . $boundary . "\"\r\n";

$output = "--".$boundary."\r\n";
$output .= "Content-Type: text/csv; name=\"result.csv\";\r\n";
$output .= "Content-Disposition: attachment;\r\n\r\n";
$output .= $attachment."\r\n\r\n";
$output .= "--".$boundary."\r\n";
$output .= "Content-type: text/html; charset=\"utf-8\"\r\n";
$output .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
$output .= $emailBody."\r\n\r\n";
$output .= "--".$boundary."--\r\n\r\n";

mail($emailTo, $emailSubject, $output, $header);
于 2013-01-23T11:00:52.433 回答
2

尝试使用 PHPmail()函数发送附件是一种挫败感。简而言之,这不值得付出努力。即使在当前的 PHP 版本中,我也永远不会建议尝试它。我总是会使用像 phpMailer 这样的库。

我知道您说过不允许使用第三方库,但在这种情况下,您不使用第三方库会很疯狂。我们谈论的是一天工作和一年之间的区别;这么大的事。PHPmail()函数非常难以使用,并且尝试使用它编写代码以从头开始发送附件会给您留下脆弱、充满错误的代码,这些代码需要永远在所有情况下可靠地工作。这就是存在像 phpMailer 这样的库的原因。

所以我建议不管他们想让你做什么,你都应该下载phpMailer ——PHP4版本仍然可用——看看它是否适合你。(下载页面甚至还有真正的旧版本,所以您应该能够及时找到适用于 PHP 4.0 的版本。完全不需要任何时间来获得一个简单的演示和与它一起运行。证明它有效;这很可能会软化他们对第三方库的立场。

(如果它没有软化他们的立场,那么这个项目在理智的时间内完成的希望并不大。在这种情况下,你能做的最好的就是在项目价格的报价中添加一些额外的零并咬紧牙关)

于 2013-01-23T10:12:22.507 回答