附件名称和文件扩展名在电子邮件 *.eml 中不起作用

Posted

技术标签:

【中文标题】附件名称和文件扩展名在电子邮件 *.eml 中不起作用【英文标题】:Attachment name and file extension not working in email *.eml 【发布时间】:2013-04-08 14:27:24 【问题描述】:

我想创建带有多个附件的.eml 格式的电子邮件文件。附件已生成且附件内容正确。但附件始终采用.dat 格式,文件名为“ATT00001”、“ATT0002”.. 等

目前我正在遵循this *** question中给出的解决方案,我的代码如下

php

   foreach($reports as $pdf)
        $attachment = file_get_contents("auto_report_attachments\\Template_Attachment.eml");
        $attachment = str_replace("TEMPLATE_MIME_TYPE", $pdf['type'], $attachment);
        $attachment = str_replace("TEMPLATE_FILE_NAME", $pdf['filename'], $attachment);
        $attachment = str_replace("TEMPLATE_ATTACHMENT_CONTENT", base64_encode($pdf['file']), $attachment);

        $content .= $attachment;
        unset($attachment);
    

模板附件

--080107000800000609090108
Content-Type: "TEMPLATE_MIME_TYPE"
name="TEMPLATE_FILE_NAME"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="TEMPLATE_FILE_NAME"

TEMPLATE_ATTACHMENT_CONTENT

$content 是上面链接中描述的主要电子邮件标题和正文。我的.eml 文件看起来像;

MIME-Version: 1.0
Date: Tue, 16 Apr 2013 09:03:37 +0100
From: sender@emailhost.com
To: recipient@emailhost.com
Subject: Email subject
Content-Type: multipart/mixed; boundary="080107000800000609090108"

This is a message with multiple parts in MIME format.

--080107000800000609090108
Content-Type: text/html

<p><strong>Project Name: Some Project and the body continues...</p>



--080107000800000609090108
Content-Type: "application/pdf"
name="AM22831 -  - Cover Sheet.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="AM22831 -  - Cover Sheet.pdf"

JVBERi0xLjMKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1Jlc291cmNlcyAyIDAgUgovQ29udGVudHMgNCAwICiUlRU9GCg==



--080107000800000609090108
Content-Type: "application/pdf"
name="AM22831 -  - Manufacturing Status.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="AM22831 -  - Manufacturing Status.pdf"

cSAxMTMuMzkgMCAwIDMwLjUzIDE0LjE3IDU1MC41OCBjbSAvSTEgRG8gUQpxIDAuMDAwIDAuMDAwIDEuMDAwIHJnIEJUIDEzMC4zOSRU9GCg==

--080107000800000609090108

当通过选择使用PDF Reader 打开文件时,上述base64 内容在PDF 文件中提供了正确的内容。但文件不是.pdf 格式。 .xls.doc 和所有其他文件类型也是如此。所有文件均采用.dat 格式,采用标准命名而非指定名称。

请帮我解决这个附件进入所需的file type 并指定文件名。

注意:示例 .eml 文件中的 base64 内容被截断

【问题讨论】:

【参考方案1】:

我自己找到了答案..!! Template_Attachment的header应该如下

--080107000800000609090108
Content-Type: TEMPLATE_MIME_TYPE;name="TEMPLATE_FILE_NAME"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="TEMPLATE_FILE_NAME"

TEMPLATE_ATTACHMENT_CONTENT

在这种情况下080107000800000609090108 是边界,在所有附件的末尾,应该有另一个080107000800000609090108 来结束电子邮件。

希望有一天这对某人有所帮助:-)

PS:所以实际的.eml 文件如下所示,它应该可以完美运行

MIME-Version: 1.0
Date: Tue, 16 Apr 2013 09:03:37 +0100
From: sender@emailhost.com
To: recipient@emailhost.com
Subject: Email subject
Content-Type: multipart/mixed; boundary="080107000800000609090108"

This is a message with multiple parts in MIME format.

--080107000800000609090108
Content-Type: text/html

<p><strong>Project Name: Some Project and the body continues...</p>

--080107000800000609090108
Content-Type: application/pdf;name="AM22831 Cover Sheet.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="AM22831 Cover Sheet.pdf"

JVBERi0xLjMKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1Jlc291cmNlcyAyIDAgUgovQ29udGVasdsDFDffjMBakdjKJHBzdHlsZT0iY29=

--080107000800000609090108
Content-Type: application/excel;name="AM22831 Manufacturing Status.xls"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="AM22831 Manufacturing Status.xls"

DQoNCjx0YWJsZSBib3JkZXI9IjAiPg0KPHRyPg0KPHRkIGNvbHNwYW49IjMiIHJvd3NwYW49IjIiIGFsaWduPSJjZW50ZXIiPg0KICAgIDxoMSBzdHlsZT0iY29=

【讨论】:

这不工作.. 请告诉您使用哪个 Outlook 客户端打开此附件? 我在 7 年前开发了这个,我只是检查了这段代码是否仍然有效。它实际上仍在工作,我正在使用 MS Outlook 2010 打开 eml 文件。附件可以是 docx、xlsx、pdf 或任何类似的文件,它们会在各自的应用程序中打开。

以上是关于附件名称和文件扩展名在电子邮件 *.eml 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Java mail发送邮件附件出现.eml文件夹

如何解析带有附件和内联图像的 EML 文件并转换为 HTML

将 MimeMessage 对象消息转发为 EML 文件中附件的常规转发格式

如何使用 Python 从电子邮件内容中获取附加的 eml 文件?

如何在 php 中解析 .eml 文件?

包含扩展字符的 MIME 附件名称失败