电子邮件主题的长度限制是什么?

互联网邮件的主题行允许有多少字符? 我扫描了邮件的RFC,但不能具体看到它被允许多长时间。 我有一个同事想通过编程方式验证它

如果没有正式的限制,那么在实践中建议什么样的长度比较好呢?

230559 次浏览

我不相信这里有一个正式的限制,而且我非常确定在RFC中也没有任何硬性限制,正如你所发现的那样。

我认为一般来说(不仅仅是电子邮件)主题行的一些非常常见的限制是:

  • 80个字符
  • 128个字符
  • 256个字符

显然,你想要想出一些合理的东西。如果您正在编写电子邮件客户端,您可能希望使用256个字符,并且显然要彻底测试大型商业服务器,以确保它们正确地处理您的邮件。

希望这能有所帮助!

请参见RFC 2822,第2.1.1节开始。

这里有两个限制 标准名额上有多少 一行中的字符。每一行 字符不能超过998 字符,并且不应该超过 78个字符,不包括CRLF。

正如RFC后面所说,您可以通过将主题折叠到多行来绕过这个限制(并不是说您应该这样做)。

每个报头字段在逻辑上是a 组成的单行字符 字段名、冒号和 场的身体。为了方便起见, 处理998/78字符 限制每行,字段正文 报头字段的一部分可以被分割 成多线表示; 这叫做“折叠”。一般 规则就是无论这个标准在哪里 允许折叠空白(不是 简单的WSP字符),一个CRLF可能是 插入任何WSP之前。为 例如,报头字段:

       Subject: This is a test

可以表示为:

       Subject: This
is a test

主题标题不超过78个字符的建议听起来很合理。没有人想要滚动查看整个主题行,重要的内容可能会在右侧被切断。

如果你向outlook客户端发送一封电子邮件,主题是>77个字符,它需要在主题内使用"=?ISO"(在我的情况下,因为重音),那么outlook将在它的中间“切割”主题,并将它所有后面的内容,包括正文文本,附件等…全都是网状的!

我有几个类似的例子:

Subject: =?ISO-8859-1?Q?Actas de la obra N=BA.20100154 (Expediente N=BA.20100182) "NUEVA RED FERROVIARIA.=


TRAMO=20BEASAIN=20OESTE(Pedido=20PC10/00123-125),=20BEASAIN".?=

:

正如你所看到的,在主题行中,它在78号字符上用“=”截断,后面跟着2或3行换行,然后糟糕地继续其余的主题。

有几个客户向我报告说,他们都在使用OutLook,其他电子邮件客户端可以处理这些问题。

如果你在它上面没有ISO,这也没什么,但是如果你把它添加到你的主题以更好地满足RFC,那么你会从OutLook中得到这个惊喜。如果你不添加iso,那么iPhone的电子邮件将无法理解它(并且使用此类字符的附加文件将无法在iPhone上运行)。

RFC2322声明主题头“没有长度限制”

但是要产生长标题,你需要把它分成多行,这个过程叫做“折叠”。

在RFC 5322中,subject被定义为“非结构化”

这里有一些引用……指出我遗漏的东西)

3.6.5. Informational Fields
The informational fields are all optional.  The "Subject:" and
"Comments:" fields are unstructured fields as defined in section
2.2.1, [...]


2.2.1. Unstructured Header Field Bodies
Some field bodies in this specification are defined simply as
"unstructured" (which is specified in section 3.2.5 as any printable
US-ASCII characters plus white space characters) with no further
restrictions.  These are referred to as unstructured field bodies.
Semantically, unstructured field bodies are simply to be treated as a
single line of characters with no further processing (except for
"folding" and "unfolding" as described in section 2.2.3).


2.2.3  [...]  An unfolded header field has no length restriction and
therefore may be indeterminately long.

重要的是你使用哪种机制来发送邮件。大多数现代库(例如System.Net.Mail)会对你隐藏折叠。你只是放了一个很长的邮件主题行(CR,LF,HTAB)。如果你开始尝试自己折叠,一切都泡汤了。它将开始报告错误。所以如果你有这个问题,只要过滤掉CR,LF,HTAB,让库为你做的工作。通常还可以将编码文本类型设置为单独的字段。在主题行中不需要iso编码。

Unicode多字节字符功能上下文中的限制

虽然RFC5322定义了1000 (998 + CRLF)个字符的限制,但它是在头信息仅限于ASCII字符的上下文中这样做的。

RFC 6532解释了如何处理多字节Unicode字符。

第3.4节(对线长限制的影响)指出:

[RFC5322]第2.1.1节限制每行不超过998个字符 建议每行限制为78个字符。这 规范将以前的限制更改为998个字节。(请注意,在 ASCII,八字节和字符实际上是相同的,但这是 在UTF-8中不是这样。)78个字符的限制仍然用术语来定义 字符的,而不是八字节的,因为它的目的是处理显示 宽度问题,而不是行长问题

例如,因为你被限制在998个字节,你不能在你的主题行中有998个笑脸,因为每个这种类型的表情符号有4个字节。

使用PHP演示:

为交互式终端运行php -a

// Multi-byte string length:
var_export(mb_strlen("\u{0001F602}",'UTF-8'));
// 1
// ASCII string length:
var_export(strlen("\u{0001F602}"));
// 4
// ASCII substring of four octet character:
var_export(substr("\u{0001F602}",0,4));
// '😂'
// ASCI substring of four octet character truncated to 3 octets, mutating character:
var_export(substr("\u{0001F602}",0,3));
// '▒'