【问题标题】:Indy TIdMessage MIME part max line length exceeded超过 Indy TIdMessage MIME 部分最大行长
【发布时间】:2014-01-31 01:22:09
【问题描述】:

我们使用的是 Delphi XE5 Architect 及其附带的 Indy 版本。我们有一个应用程序可以与不同的交换伙伴发送和接收消息。其中一些消息的格式类似于电子邮件,在电子邮件正文中具有 MIME 编码部分。我们使用TIdMessage 来处理/解码/重构 MIME 部分,效果非常好。

今天我们在解码 MIME 部分时开始收到来自 TIdMessage 的错误

超过最大行长

我们正在尝试排除故障并查看是否存在字符问题?

在十六进制编辑器中,当我们检查消息时,它们具有文本

\.br\

,后跟一个十六进制 09,显示为 '.'在

之后 \.br\。

这对解析器来说是否会显示为不正确的换行符?

我们还在考虑内容是否过长?

使用适当的换行符,消息范围在 2k - 6.6k 行之间。

【问题讨论】:

  • 只是为了指出 SO 正在剥离我指定的一些反斜杠“\\”。所以正确看待这个中断由“\.br\”表示
  • 谢谢托尼!
  • 请在您的问题中添加delphi indy版本

标签: delphi mime indy


【解决方案1】:

Indy 的 MIME 解析器从数据源逐行读取数据,因此它不必在解析之前将整个电子邮件加载到内存中。 TIdMessage 在内部使用 TIdIOHandlerStreamMsg 作为其数据源。该特定错误意味着TIdIOHandler.ReadLn() 方法(默认情况下在(CR)LF 换行符处停止读取)遇到的行长于允许的长度。
Indy 的默认最大行长度为 16384 个字符,TIdMessage 不会覆盖它。通常,您不会看到带有那么长的单独行的电子邮件,由于历史原因,它们通常被限制为 70 多个字符。如果 MIME 数据在达到 16K 限制之前没有任何 LF 字符,则会出现问题。例如,如果 MIME 数据使用设置为 8bitbinaryContent-Transfer-Encoding 标头,则可能会发生这种情况,因此数据不必以大多数电子邮件传输使用的 7 位安全方式编码.

【讨论】:

  • 太好了,感谢您提供的重要且高度相关的解释!虽然我们在一些预处理代码中发现了问题,但这提出了一个很好的观点。我们现在正在处理比我们预期更大的数据流。这个限制非常很高兴知道!
  • 一般来说,MIME 正文数据应该使用quoted-printable 编码文本或base64 编码二进制数据。 MIME 对两者都施加了行长限制,远低于 Indy 的默认限制。
猜你喜欢
  • 2017-04-23
  • 2017-07-30
  • 2019-10-10
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多