在IdMessageClient.pas
中有一个错误,在阅读邮件时会导致崩溃。
如果邮件编码是“引用 - 可打印的”#39;然后无法正确读取附件并调用空例外。
请修改程序TIdMessageClient.ReceiveBody,第968行:
if PosInStrArray(LContentTransferEncoding, ['7bit', '8bit', 'binary'], False) = -1 then begin {do not localize}
到
if PosInStrArray(LContentTransferEncoding, ['7bit', 'quoted-printable', '8bit', 'binary'], False) = -1 then begin {do not localize}
可能需要添加引用可打印的'其他地方的条款 - 我不知道。
RAD XE7中出现问题。在之前的版本中,一切正常。
答案 0 :(得分:0)
首先 - 特定的代码行从未出现在IdMessageClient.pas
的第968行。根据您在过去一年中查看的SVN修订版,它将显示在第967,970或946行。
其次 - XE7(5177)附带的SVN修订版不是当前可用的最新修订版(5269,在撰写本文时)。确保您使用的是最新版本,因为ReceiveBody()
自XE7发布以来已经收到了多次更新。
第三 - 如果您使用的是最新版本,并且仍然遇到无法解析的电子邮件,请提供实际的电子邮件以供审核。
第四 - 即便如此,我并不倾向于将quoted-printable
添加到特定的if
语句中,因为它不属于那里。该特定if
语句正在寻找Content-Transfer-Encoding
类型的有效 multipart/...
值,并且RFC 2045第6.4节严格禁止quoted-printable
(并且在上面那段代码中的评论中说明了这一点。如果您的电子邮件使用非法Content-Transfer-Encoding
,则电子邮件格式错误,除非绝对必要,否则我不想让Indy解析明显错误的数据。我们已经遇到格式错误的电子邮件,这些电子邮件使用Content-Transfer-Encoding: quoted-printable
而实际上对正文进行QP编码,因此在此方案中会忽略quoted-printable
。如果您的失败电子邮件实际上(但非法)对multipart/...
类型的正文进行QP编码,您可能必须自行禁用Indy的解码器并自行解码。