【问题标题】:Using mail() to send an attachment AND text/html in an email in PHP4使用 mail() 在 PHP4 的电子邮件中发送附件和文本/html
【发布时间】:2013-01-06 17:47:31
【问题描述】:

为了让生活变得困难,我工作的客户正在使用一个运行在 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 的电子邮件并添加附件。我确定我在这里遗漏了一些非常简单的东西!

提前致谢。

【问题讨论】:

  • 搜索发送“多部分”电子邮件。 One example is here。此示例包含 text/html 和 text/plain 一部分,但您应该能够根据需要对其进行调整。
  • 如果您能够这样做,请更新 PHP。 PHP4 太旧了,据我所知不再维护 - 所以甚至不会为 PHP4 分支进行安全修复。上一次 PHP4 更新是在 2008 年!
  • 坦率地说,如果客户对我说“我正在使用 PHP 4.0,我不准备升级”,我会告诉他们我不准备在他们的项目。
  • @Hikaru-Shindo:正如我所说,这是一个非常大的系统(大约 15,000 个 PHP 文件)。其中大部分是在 1998/9 年创建的,升级几乎是不可能的,因为它需要的时间太长。编辑:我并不是说我喜欢他们使用 PHP4.0 的事实,但我对此无能为力。
  • 您将遇到的另一个问题是 PHP 4 本身非常不安全,任何仍然支持它的操作系统也是如此。如果他们将其用于面向公众的网站,那么他们就是疯了,而且也疏忽了客户的数据。该系统面临被黑客入侵的直接危险(如果还没有被入侵的话)。 的危险在于,如果你是最后一个工作的人,你最终可能会受到指责。仅出于这个原因,我建议您现在就走开,以免您过多参与。

标签: php php4


【解决方案1】:

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

$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);

【讨论】:

    【解决方案2】:

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

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

    所以我建议不管他们想让你做什么,你都应该下载phpMailer——PHP4 版本仍然可用——看看它是否适合你。 (下载页面甚至还有 really 旧版本,因此您应该能够及时找到适用于 PHP 4.0 的版本。它根本不会花费您任何时间启动并运行一个简单的演示。证明它有效;这很可能会软化他们对第三方库的立场。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      相关资源
      最近更新 更多