电子邮件主题长度的限制是多少?

265

互联网电子邮件主题行允许有多少个字符?

我查看了email的RFC文档,但没有找到具体允许的长度。

如果没有正式的限制,实践中建议使用多长的长度比较好呢?

我有一个同事想要通过编程对其进行验证。


21
在某些票务产品(例如Jira)中,255是限制值,而且似乎在Outlook上也是限制值,但Thunderbird和Gmail似乎会在130之后对字符进行截断。 - reconbot
1
RFC2047更适合于验证,我看到很多批量邮件软件生成的RFC2047内容无效。 - Jasen
3
在数据库中,定义长度不是特别长或短的文本字段为VARCHAR(255)或类似等效名称非常常见(可以说是一种传统)。如果出现更长的字符串,它将生成一个错误或简单地被截断到限制长度。这就是为什么Jira和Outlook等软件不支持更多字符的原因。出于兼容性考虑,我建议不要超过255个字符。只是给5岁生日蛋糕上加了一点奶油 ;) - Slava
6个回答

221
请查看RFC 2822第2.1.1节开始。根据标准,每行字符的长度有两个限制。每行字符不得超过998个字符,并且应不超过78个字符(不包括CRLF)。正如RFC后面所述,您可以通过将主题折叠成多行来解决此限制(尽管不应该这样做)。
每个标头字段在逻辑上都是由字段名称、冒号和字段正文组成的单行字符。但是,为了方便处理每行字符998/78的限制,标头字段的字段正文部分可以被分成多行表示; 这称为“折叠”。一般规则是,在标准允许折叠空格(而不仅仅是WSP字符)的任何地方,都可以在任何WSP之前插入CRLF。例如,标头字段:
       Subject: This is a test

可以表示为:

       Subject: This
        is a test

主题头部不要超过78个字符的建议听起来很合理。没有人想要滚动查看整个主题行,而且右侧可能会被截断掉一些重要信息。


8
IMF规范的当前版本是RFC 5322,可在此处找到:http://tools.ietf.org/html/rfc5322#section-2.1.1。 - james.garriss
随机更新... Gmail 根据屏幕宽度和可用空间自动换行,而不是限制在 78 个字符。 - CasualT
8
此答案仅涉及行长限制,而不涉及整体长度限制。 - Chalky
1
有RFC,也有可用性。雅各布·尼尔森在文章《电子邮件主题行:吸引读者的5个技巧》中总结道:“关注前40个字符。描述性和写作良好的主题行让收件人能够做出明智的决定,是要获取更多详细信息还是放弃。” - Édouard Lopez
3
为了澄清,邮件主题行没有长度限制。标准允许将单个标题分成多行,并超过998字节的长度。建议使用约80个字符是合理的。如果您正在编写电子邮件客户端,则必须能够处理非常长的主题行,而不会以可怕的方式中断,最好通过在列表中显示时进行截断。 - thomasrutter
1
这也适用于任何其他标题字段(例如“From”)。PS如果你想知道为什么是78而不是80,或者为什么是998而不是1000,那是因为电子邮件标准指定CRLF(\r\n)作为分隔符,它是两个字节,使每行的长度为1000字节,其中998是头本身。请注意,标题的名称和冒号后面的任何空格(例如“Subject: ”)也必须适合其中。 - thomasrutter

25

RFC2322规定主题头“没有长度限制”,但为了生成长的标题,需要将其跨多个行进行拆分,这个过程称为“折叠”。

在RFC 5322中,主题被定义为“非结构化”。

以下是一些引用([…]表示我省略的内容)

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.

任何写得好的电子邮件库都可以做到这一点。我最喜欢的是c-client - Jasen
2
这是正确的答案。问题的第二部分“实际上的良好长度”完全取决于您的应用程序。如果您正在保存接收到的电子邮件,则必须支持无限长度。 - Rob

6
在一些测试之后得出结论:如果您给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上工作)。


7
您设置的主题存在许多问题:1.空格应使用“_”进行编码;2.“编码单词”(=?charset?Q/B?data?=)不得超过75个字符长(rfc2047);3.您不能使用“=”字符在行尾转义换行符(标题QP编码与正文QP编码不同)。总之,这不是Outlook的错。 - Pawel Lesnikowski

3

Unicode多字节字符能力的限制

尽管RFC5322将限制在1000(998 + CRLF)个字符,但它只是针对仅限于ASCII字符的标题。

RFC6532解释了如何处理多字节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));
// '▒'


1

我不认为在这里有正式的限制,而且我相信在RFC中也没有指定硬性限制,就像你发现的那样。

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

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

显然,您希望提出合理的建议。如果您正在编写电子邮件客户端,您可能希望选择256个字符左右,并且要充分测试大型商业服务器以确保它们正确地处理您的邮件。

希望这可以帮助到您!


14
256比250、300或372更好的特别原因并不存在。我们早就不再使用字节来表示字符串长度了。 - Greg Hewgill
5
有些产品(例如Jira和Outlook)的实际限制是255。 - reconbot
5
这个回答是错误的。RFC 5322是IMF规范的当前版本,明确定义了最大行长度。请参考@Michael的答案。 - james.garriss
2
+1 行长限制适用于消息的所有行,但我没有看到任何关于主题不能跨越多行的规定(暗示主题字符数没有限制)。请参见2.2.3和紧随其后的示例。 - Cypher
1
VARCHAR 255 可能是 MySQL / MariaDB 中最常见(并且更高效)的数据列长度。 字节仍然非常重要。如果长度小于256,则MySQL将使用1字节来存储长度,否则使用更多字节。如果你认为字符串长度不是非常重要且按字节计算,请看一下C ++如何实现std::string. - ebyrob
显示剩余2条评论

0

重要的是你使用哪种机制来发送电子邮件。大多数现代库(例如System.Net.Mail)将为您隐藏折叠。您只需在没有(CR,LF,HTAB)的情况下放入非常长的电子邮件主题行即可。如果您开始尝试自己折叠,则所有赌注都将关闭。它将开始报告错误。因此,如果您遇到此问题,请过滤掉CR,LF,HTAB,并让库为您完成工作。通常还可以将编码文本类型设置为单独的字段。主题行中不需要iso编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接