Subject: This is a test
可以表示为:
Subject: This
is a test
主题头部不要超过78个字符的建议听起来很合理。没有人想要滚动查看整个主题行,而且右侧可能会被截断掉一些重要信息。
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"=?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上工作)。
尽管RFC5322将限制在1000(998 + CRLF)个字符,但它只是针对仅限于ASCII字符的标题。
RFC6532解释了如何处理多字节Unicode字符。
第3.4节(对行长度限制的影响)说明:
[RFC5322]的第2.1.1节将行限制为998个字符,并建议将行限制为仅78个字符。 本规范将前一个限制更改为998个八位组。(请注意,在ASCII中,八位组和字符实际上是相同的,但在UTF-8中不是如此。)78个字符的限制仍然是基于字符而非八位组定义的,因为它旨在解决显示宽度问题而非行长问题。
例如,因为您受到998个八位组的限制,所以您不能在主题行中放入998个笑脸表情符号,因为每个这种类型的表情符号占用4个八位组。
运行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));
// '▒'
我不认为在这里有正式的限制,而且我相信在RFC中也没有指定硬性限制,就像你发现的那样。
我认为一般主题行的一些常见限制(不仅仅是电子邮件)是:
显然,您希望提出合理的建议。如果您正在编写电子邮件客户端,您可能希望选择256个字符左右,并且要充分测试大型商业服务器以确保它们正确地处理您的邮件。
希望这可以帮助到您!
重要的是你使用哪种机制来发送电子邮件。大多数现代库(例如System.Net.Mail)将为您隐藏折叠。您只需在没有(CR,LF,HTAB)的情况下放入非常长的电子邮件主题行即可。如果您开始尝试自己折叠,则所有赌注都将关闭。它将开始报告错误。因此,如果您遇到此问题,请过滤掉CR,LF,HTAB,并让库为您完成工作。通常还可以将编码文本类型设置为单独的字段。主题行中不需要iso编码。