【问题标题】:PHP library to generate EML email files?生成 EML 电子邮件文件的 PHP 库?
【发布时间】:2012-02-05 06:47:41
【问题描述】:

我正在尝试从 PHP 生成 EML 文件。是否有任何库可以让我轻松创建它们?我可以在 Internet 上找到一些 ActiveX 组件,但我宁愿使用更便携的东西。

【问题讨论】:

  • 您想从头开始创建它,还是在阅读了带有 imap 功能的电子邮件后创建它?也许 imap_savebody() 可以帮助 - csschat.com/archive/index.php/t-3287.html
  • 是的,我需要从头开始创建它。我基本上有一个电子邮件、标题、正文和附件,需要为此创建 EML。

标签: php email eml


【解决方案1】:

我最终使用这种模板自己构建了 MIME 消息,其中每个字段都替换为 TEMPLATE_<name> 变量:

From: TEMPLATE_FROM_ADDRESS
MIME-Version: 1.0
To: TEMPLATE_TO_ADDRESS
Subject: TEMPLATE_SUBJECT
Content-Type: multipart/mixed; boundary="080107000800000609090108"

This is a message with multiple parts in MIME format.
--080107000800000609090108
Content-Type: text/plain

TEMPLATE_BODY
--080107000800000609090108
Content-Type: application/octet-stream;name="TEMPLATE_ATTACH_FILENAME"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="TEMPLATE_ATTACH_FILENAME"

TEMPLATE_ATTACH_CONTENT
--080107000800000609090108

然后使用str_replace 创建最终消息非常简单:

$content = file_get_contents("Template.eml");
$content = str_replace("TEMPLATE_FROM_ADDRESS", $fromEmail, $content);
$content = str_replace("TEMPLATE_TO_ADDRESS", $toEmail, $content);
// etc. for each template parameter
// Also don't forget to base64_encode the attachment content;
$content = str_replace("TEMPLATE_ATTACH_CONTENT", base64_encode($attachContent), $content);

有关此帖子中文件附件的其他信息:Attachment name and file extension not working in email *.eml

编辑(2018 年): 自从写了这个答案后,它似乎到处都被复制和粘贴了,尤其是模板。为避免与其他 MIME 数据发生冲突,您应确保边界“080107000800000609090108”是唯一的 - 它是不超过 70 个字符的随机字符串。

【讨论】:

    【解决方案2】:

    我认为你不需要图书馆。它只是纯文本(例如http://bitdaddys.com/example1.eml

    Date: Sat, 12 Aug 2006 14:25:25 -0400
    From: John Doe <jdoes@someserver.com>
    Subject: BitDaddys Software
    To: sales@bitdaddys.com
    
    Dear BitDaddys Corp.,
    
    We have added your software to our approved list.
    
    Thank you for your efforts.
    
    Sincerely,
    John Doe
    Some Server Company
    

    您可以只输出带有标题的文本并使用 fwrite 保存它。对于附件使用base64_encode(),如here所述

    【讨论】:

    • 重要的是它应该遵循 SMTP 语义 - 即每个标头末尾的 CRLF 和标头和正文之间的空行(由 CRLF 终止)。正文应传输编码为 7 位 ascii(或引用可打印)。
    • 链接已于 2020 年 10 月 4 日断开
    【解决方案3】:

    使用带有 null $part_number 的 imap_savebody(imap 库 http://us1.php.net/manual/en/function.imap-savebody.php 的一部分)。它使用一行代码创建了一个漂亮的 .eml 文件,其中包含整个消息(null $part_number = 所有部分...未记录但有效)。

    其他两种解决方案取决于电子邮件的格式(第一种解决方案只有一个附件,没有 html 部分,第二种解决方案只有文本电子邮件)。

    imap_savebody 创建一个完美的 .eml 文件,无论传入电子邮件的格式是什么(当然,只要它符合 RFC 规范)。

    【讨论】:

    • by section number 表示$part_number 参数
    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2015-12-28
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多