在IdMessageClient.pas中有一个错误,在读取消息时会导致崩溃。
如果消息编码是“quoted-printable”,则无法正确读取附件,并调用一个空异常。
请从以下位置修改过程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}也许需要在其他地方添加'quoted-printable‘子句-我不知道。
RAD XE7中出现问题。在以前的版本中,一切都运行良好。
发布于 2015-03-25 12:00:57
首先--这行代码从未出现在IdMessageClient.pas的968行中。根据您在过去一年中查看的SVN版本,它会出现在967、970或946行。
其次- XE7附带的SVN修订版(5177)不是当前可用的最新修订版(撰写本文时为5269)。请确保您使用的是最新版本,因为自XE7发布以来,ReceiveBody()已经收到了几个更新。
第三-如果您使用的是最新版本,但仍然遇到无法解析的电子邮件,请提供实际的电子邮件以供查看。
第四,即使这样,我也不倾向于将quoted-printable添加到那个特定的if语句中,因为它不属于那里。这条特定的if语句正在为multipart/...类型寻找有效的RFC值,而quoted-printable是RFC2045第6.4节严格禁止的(在该行代码的注释中也有详细说明)。如果你有一封使用非法Content-Transfer-Encoding的电子邮件,那么这封电子邮件就是错误的,我不喜欢让Indy解析明显错误的数据,除非绝对必要。我们已经遇到过格式错误的电子邮件,它们使用Content-Transfer-Encoding: quoted-printable而没有对正文文本进行实际的QP编码,因此在这种情况下quoted-printable会被忽略。如果你失败的电子邮件实际上是(但非法的)对multipart/...类型的正文文本进行QP编码,你可能不得不禁用Indy的解码器并自己解码电子邮件。
https://stackoverflow.com/questions/29232729
复制相似问题