RAD XE7中的IdMessageClient.pas出错

时间:2015-03-24 12:31:58

标签: indy

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中出现问题。在之前的版本中,一切正常。

1 个答案:

答案 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的解码器并自行解码。