【问题标题】:Indy10 - Encoded words in email addressIndy10 - 电子邮件地址中的编码单词
【发布时间】:2015-03-24 14:03:38
【问题描述】:

我遇到过一些电子邮件地址中包含编码字词的电子邮件,例如而不是

abc <abc@example.com>

它包含:

abc <=?ISO8859-1?B?YWJjQGV4YW1wbGUuY29t=?=>

我发现许多电子邮件程序都存在问题,但有些没有,这让我认为它可能是某些 RFC 的一部分,尽管我找不到它。

此外,如果电子邮件地址标题采用以下形式:

From: =?ISO8859-1?B?YWJjQGV4YW1wbGUuY29t=?=

它会被许多程序解码,但不会被 Indy 解码。在大多数程序中发生的情况是,他们认为该部分是来自“名称”部分并对其进行解码,但他们将电子邮件地址编码,从而导致:

Name = abc@example.com Email = =?ISO8859-1?B?YWJjQGV4YW1wbGUuY29t=?=

这使其至少部分解码良好。

然而,在 Indy 中,这会导致:

Name = **blank** Email = =?ISO8859-1?B?YWJjQGV4YW1wbGUuY29t=?=

这应该在 Indy 中得到支持(或者相反,它认为 base64 部分是“名称”部分,而不是“电子邮件”部分)还是格式不正确的电子邮件地址?或者它是否应该解释为第一部分的解释问题,因为电子邮件确实可以看起来像 From: abc@example.com 而没有 <> 字符。

【问题讨论】:

  • 看起来像 base64 编码。
  • @Craig 当然它是 base64 但问题在于电子邮件地址是编码的东西,而不是来自“名称”部分。
  • 您使用的是什么版本的 indy10?我也遇到过这个问题,但我相信它已在更新的版本中得到修复。
  • 投反对票有什么理由吗?

标签: delphi c++builder indy email-address


【解决方案1】:

abc

根据RFC 2047 Section 5 Use of encoded-words in message headers,Indy 不支持此类编码地址:

“编码字”可能会根据以下规则出现在邮件标题或正文部分标题中:

(1) 'encoded-word' 可以替换任何 Subject 或 Comments 头字段、任何扩展消息头字段或任何 MIME 正文部分字段中的“text”标记(如 RFC 822 所定义)正文被定义为“*文本”。 'encoded-word' 也可能出现在任何用户定义的(“X-”)消息或正文部分标题字段中。

普通的 ASCII 文本和“编码字”可以一起出现在同一个标​​题字段中。但是,出现在定义为“*text”的标头字段中的“编码字”必须通过“线性空白”与任何相邻的“编码字”或“文本”分开。

(2) 'encoded-word' 可能出现在由 "(" 和 ")" 分隔的 'comment' 中,即在允许使用 'ctext' 的地方。更准确地说,“评论”的 RFC 822 ABNF 定义修改如下:

comment = "(" *(ctext/quoted-pair/comment/encoded-word)")"

出现在“评论”中的“Q”编码的“编码词”不得包含出现在“评论”中的字符“(”、“)”或“编码词”必须分开通过“linear-white-space”从任何相邻的“encoded-word”或“ctext”。

请务必注意,“评论”仅在“结构化”字段主体内被识别。在正文定义为“*text”的字段中,“(”和“)”被视为普通字符而不是注释分隔符,适用本节规则 (1)。 (参见 RFC 822,第 3.1.2 和 3.1.3 节)

(3) 作为“短语”中“单词”实体的替代,例如,在 From、To 或 Cc 标头中的地址之前的实体。因此,RFC 822 中“短语”的 ABNF 定义变为:

短语 = 1*( 编码字 / 字 )

在这种情况下,可以在“Q”编码的“编码字”中使用的字符集仅限于:。出现在“短语”中的“编码词”必须通过“线性空白”与任何相邻的“词”、“文本”或“特殊”分开。

这些是唯一可能出现“编码词”的位置。特别是:

  • “编码字”不得出现在“地址规范”的任何部分

  • “编码字”不得出现在“带引号的字符串”中。

  • 不得在 Received 标头字段中使用“编码字”。

  • “编码字”不得用于 MIME 的参数 Content-Type 或 Content-Disposition 字段,或任何结构化的 字段正文,“评论”或“短语”内除外。

不过,Indy(和 RFC 2047)确实支持编码名称:

From: =?ISO8859-1?B?YWJj?= <abc@example.com>

来自:=?ISO8859-1?B?YWJjQGV4YW1wbGUuY29t=?=

在这种情况下,Indy 将其解释为没有名称的电子邮件地址。和上面一样,编码地址是不允许的。

【讨论】:

  • 那么编码的电子邮件地址(在&lt;&gt;内)是允许的吗?
  • @themihai 在电子邮件地址中使用非 ASCII 字符取决于协议。例如,如果 SMTP 客户端和服务器支持 SMTPUTF8 扩展名(Indy 还不支持),或者如果电子邮件完全使用 UTF-8(标题和正文)编码,则电子邮件地址可以使用 UTF-8 编码 @ 987654324@ MIME 类型。
猜你喜欢
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2013-07-16
  • 2018-08-21
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多