使用PHP imap_mail_compose生成邮件后iOS Mail无法查看附件问题
问题描述
我用PHP生成带PDF附件的HTML邮件,通过AWS SES发送,用imap_mail_compose生成MIME代码,但Outlook和iOS Mail无法同时正常显示。测试两种MIME类型的结果:
MULTIPART/alternative:HTML内容在两个客户端都显示正常,但附件仅Outlook可见,iOS Mail显示图标却打不开。MULTIPART/mixed:Outlook只显示纯文本正文,还多出两个附件(ATT00001.htm、ATT00002);iOS Mail则依次显示纯文本、HTML内容和附件。
需要修改下方MIME代码的哪些部分,让两类客户端都正常显示?(Base64字符串已替换为示例文本)
Date: Thu, 09 Nov 2023 08:57:36 +0000 From: Billing <billing@email.com> Subject: New Invoice [Ref No. 123] To: email@email.com MIME-Version: 1.0 Content-Type: MULTIPART/mixed; BOUNDARY="531389465-1681692777-1699520256=:303753" --531389465-1681692777-1699520256=:303753 Content-Type: TEXT/plain; CHARSET=utf-8 Content-Transfer-Encoding: BASE64 CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI --531389465-1681692777-1699520256=:303753 Content-Type: TEXT/html; CHARSET=utf-8 Content-Transfer-Encoding: BASE64 CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI --531389465-1681692777-1699520256=:303753 Content-Type: APPLICATION/pdf; name=Invoice.pdf Content-Transfer-Encoding: BASE64 Content-Description: Invoice.pdf Content-Disposition: attachment; size=217203; filename=Invoice.pdf CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI --531389465-1681692777-1699520256=:303753--
修复方案
核心是采用嵌套MIME结构:外层用multipart/mixed(包含正文和附件),正文部分用multipart/alternative包裹纯文本和HTML内容,这样能兼容两类客户端。具体修改点如下:
1. 重构MIME层级结构
外层保持multipart/mixed,但把原有的纯文本、HTML部分放到一个新的multipart/alternative子块中,附件作为同级单独块,避免客户端把正文识别为附件。
2. 修正附件的Content-Disposition
- 移除非标准的
size参数,iOS Mail对该参数解析易出现异常; - 给
filename添加双引号,确保不同客户端都能正确识别文件名。
3. 使用独立边界符
嵌套结构需要用不同的边界符区分外层和内层,防止内容混淆导致解析错误。
修改后的完整MIME代码示例
Date: Thu, 09 Nov 2023 08:57:36 +0000 From: Billing <billing@email.com> Subject: New Invoice [Ref No. 123] To: email@email.com MIME-Version: 1.0 Content-Type: multipart/mixed; BOUNDARY="outer-boundary-123456" --outer-boundary-123456 Content-Type: multipart/alternative; BOUNDARY="inner-boundary-789012" --inner-boundary-789012 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI --inner-boundary-789012 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI --inner-boundary-789012-- --outer-boundary-123456 Content-Type: application/pdf; name="Invoice.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Invoice.pdf" CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI CkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nI --outer-boundary-123456--
修复原理
- 嵌套结构让客户端明确内容层级:
multipart/mixed说明邮件包含不同类型的内容(正文+附件),内部的multipart/alternative让客户端自主选择显示纯文本或HTML版本,不会把正文识别为附件。 - 移除
size参数避免iOS解析异常,双引号包裹文件名确保跨客户端兼容性。 - 独立边界符防止不同层级内容混淆,解决Outlook把HTML正文识别为附件的问题。
内容的提问来源于stack exchange,提问作者djh123
相关产品推荐
相关产品推荐

