【发布时间】:2020-10-28 18:10:54
【问题描述】:
我已将现有的电子邮件发送程序从 Indy 9 升级到 Indy 10。这在我们的测试环境中运行良好,但在客户站点上,附件出现在电子邮件正文中。他们的 SMTP 服务器正在向电子邮件添加页脚,并在整个邮件周围添加 <html> ... </html> 标签,这导致了这个问题。 Indy 9 上的先前版本适用于该客户端。
以下是我们发送的电子邮件示例:
Content-Type: multipart/mixed; boundary="gcJJK3Qk5C6XIV9FEwfRcK=_EH4Oq32hqE"
MIME-Version: 1.0
Date: Thu, 1 Oct 2020 00:02:29 +0100
Message-Id: <20201001000278.SM78660@B-P-S0308-APP1>
This is a multi-part message in MIME format
--gcJJK3Qk5C6XIV9FEwfRcK=_EH4Oq32hqE
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Body text appears here.
--gcJJK3Qk5C6XIV9FEwfRcK=_EH4Oq32hqE
Content-Type: application/octet-stream;
name="PDA Audit.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="PDA Audit.pdf"
JVBERi0xLjINCjEgMCBvYmoNCjw8IC9UeXBlIC9DYXRhbG9nIA0KL1BhZ2VzIDMgMCBSIA0KL1Zp
ZXdlclByZWZlcmVuY2VzIDw8IA0KPj4NCj4+IA0KZW5kb2JqDQo1IDAgb2JqDQo8PCAvVHlwZSAv
<more lines here>
--gcJJK3Qk5C6XIV9FEwfRcK=_EH4Oq32hqE--
这有什么问题吗?
我注意到边界不再包含=_NextPart,所以我想知道服务器上的代码是否写得不好并且期待找到它。有没有其他人遇到过类似的问题?
【问题讨论】:
-
我认为这封电子邮件没有任何问题。这是您发送到服务器的电子邮件,对吧?您能否展示您在查看时遇到问题的 server-modified 电子邮件的外观?它解析的电子邮件正文是什么样的?将 MIME 电子邮件加载到
TIdMessage时的注意事项,任何具有Content-Type不是text/...或multipart/...或具有Content-Disposition即attachment的MIME 部分都不应出现在正文中,它应该是TIdMessage.MessageParts中的TIdAttachment对象 -
此外,Indy 9 和 10 都没有创建包含
=_NextPart的 MIME 边界。NextPart文本不是官方 MIME 规范的一部分。边界的实际值是任意的并且是特定于实现的,它们只需要是唯一的并且可以与正文的其余部分区分开来。尽管规范确实 suggest 在边界中包括=_(以避免与quoted-printable编码的正文冲突)。一些 MIME 库使用=_NextPart(或其变体),Indy 仅使用=_,其余的都是随机的。 -
server-modified 消息太大,无法完整发布,但这里有一个摘要
Content-Type: text/html; charset="us-ascii"; boundary="PaZhQrP6jw7biezBU1O3mklOfBHSWxH=_1" MIME-Version: 1.0 Date: Thu, 8 Oct 2020 13:01:22 +0100 Message-ID: <69dc89fb-5873-4f92-938f-4db82c6f541a@EXCH-HUB01.cc.xxxx.local> Return-Path: Test-MaintenanceServices@xxxx.ac.uk X-Headers here <html> <head> <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dus-ascii"= > </head> <body> Original email here including content types <p>Footer appears here</p> <p></p> </body> </html> -
因此服务器已将整个电子邮件转换为 html 而不仅仅是文本部分。
-
Delphi 7 附带的 Indy 9 副本肯定包含
=_NextPart。声明三个不同 MIME 边界的常量出现在 IdMessageCodeMIME.pas 中,并且都以=_NextPart开头。然后在 IdMessageClient.pas 中使用常量
标签: indy