ChatGPT解决这个技术问题 Extra ChatGPT

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

Internet 电子邮件的主题行中允许有多少个字符?我对 The RFC for email 进行了扫描,但无法具体看到它被允许多长时间。我有一位同事想以编程方式对其进行验证。

如果没有正式的限制,那么在实践中建议的好的长度是多少?

255 是某些票务产品(例如 Jira)的限制,并且似乎是 Outlook 的限制,Thunderbird 和 gmail 似乎在 130 之后被截断。
RFC2047 更适合验证,我看到很多批量邮件软件会产生无效的 RFC2047 内容。
在数据库中,将不是特别长或特别短的文本字段的长度定义为 VARCHAR(255) 或类似的等效名称是很常见的(您可以说这是一种传统)。如果出现更长的字符串,它将产生错误或被截断到极限。这就是为什么这里提到的 Jira 和 Outlook 不支持更多字符的原因。出于兼容性原因,我不推荐 255+ 只在 5 岁的蛋糕上添加一些奶油;)

M
Michael Petrotta

请参阅 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 个字符的建议听起来很合理。没有人愿意滚动查看整个主题行,并且某些重要的内容可能会在右侧被截断。


可以在此处找到当前版本的 IMF 规范 RFC 5322:tools.ietf.org/html/rfc5322#section-2.1.1
该答案仅解决行长度限制,而不是总长度限制。
有 RFC 并且有可用性。 Jakob Nielsen article Email Subject Lines: 5 Tips to Attract Readers 总结为:“关注前 40 个字符。描述性和写得好的主题行使收件人能够做出明智的决定,以获取更多详细信息或继续前进。”
澄清一下,主题行没有长度限制,因为标准允许标题长度超过 998 字节,方法是将单个标题包装在任意多的行上。约80个字符的推荐确实是合理的。如果您正在编写一个电子邮件客户端,您必须能够处理长得离谱的主题而不会以可怕的方式中断,最好是在显示为列表的一部分时截断。
...这也适用于任何其他标题字段(例如“From”)。 PS 如果你想知道为什么是 78 而不是 80,或者为什么是 998 而不是 1000,这是因为电子邮件标准将 CRLF (\r\n) 指定为分隔符,即两个字节,使其每行 1000 个字节,其中 998 是标题本身。还要注意标题的名称和冒号后面的任何空格,例如“主题:”也必须适合这个。
J
Jasen

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
这是正确的答案。 “实践中的良好长度”问题的第二部分完全取决于您的应用程序。如果您要保存收到的电子邮件,那么您必须支持无限长度。
T
Techie

经过一些测试:如果您向 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".?=

至:

如您所见,在主题行中,它在 char 78 处用“=”剪切,后跟 2 或 3 个换行符,然后继续处理该主题的其余部分。

几位使用 OutLook 的客户向我报告了这一点,其他电子邮件客户端可以处理这些主题。

如果您没有 ISO,它不会受到伤害,但是如果您将它添加到您的主题以对 RFC 更好,那么您会从 OutLook 中得到这个惊喜。如果您不添加 ISO,那么 iPhone 电子邮件将无法理解它(并且使用此类字符的名称附加文件在 iPhone 上不起作用)。


你设置的主题有很多问题:1.空格应该用'_'编码,2.'encoded-word'(=?charset?Q/B?data?=)不能超过75个字符(RFC2047)。第三你不能在行尾用'='字符转义新行(标题QP编码与正文QP不同)。底线是:这不是 Outlook 的错。
A
ADJenks

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));
// '▒'


E
Ed Altorfer

我不相信这里有正式的限制,而且我很确定 RFC 中也没有指定任何硬限制,正如您发现的那样。

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

80 个字符

128 个字符

256 个字符

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

希望这可以帮助!


256 比 250、300 或 372 更好,没有什么特别的原因。我们早已不再使用字节来表示字符串长度。
255 是某些产品的实际限制(例如 Jira 和 Outlook)
这个答案是错误的。 IMF 规范的当前版本 RFC 5322 明确定义了最大行长度。请参阅@Michael 的回答。
+1 行长限制适用于消息的所有行,但我没有看到任何说您不能让主题跨越多行(这意味着对主题的字符数没有限制)。请参见 2.2.3 和紧随其后的示例。
VARCHAR 255 可能是 MySQL / MariaDB 中最常见(也更有效)的数据列长度。字节肯定仍然相关。如果长度小于 256,MySQL 将使用 1 个字节来存储长度,否则将使用更多。如果您认为字符串长度不是很重要并且以字节为单位,请查看 C++ 如何实现 std::string。
k
kariato

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