SMTP header 字段是否有可接受的最大行长度?

Is there an accepted maximum line length for SMTP header fields?

问题

如果没有标准,"max header line length" 什么值比较好?

对于 SMTP header 行的最大长度应该有多少非正式标准?


上下文

我使用 Mime4J 来解析 SMTP 消息。

最近,我遇到了一个与很长的 header 行有关的解析失败,这是由 header 显然是由 Microsoft Forefront 添加引起的。 有问题的 header 行看起来像:

x-forefront-antispam-report: 
    CIP:94.245.94.31;IPV:NLI;CTRY:IE;EFV:NLI;SFV:NSPM;SFS:(10019020)(4636009)(136003)(376002)(396003)(346002)(39850400004)(2980300002)(62414003)(199004)(189003)(11346002)(2501003)(6916009)(5640700003)(8936002)(126002)(76176011)(9326002)(486006)(2476003)(476003)(33656002)(3480700005)(2906002)(99286004)(568964002)(21480400003)(446003)(606006)(6506007)(15974865002)(14454004)(61614004)(229853002)(33964004)(53546011)(71200400001)(71190400001)(26005)(102836004)(66066001)(186003)(5660300002)(5070765005)(6246003)(246002)(235185007)(55016002)(316002)(966005)(7696005)(356004)(3846002)(8676002)(9686003)(86362001)(54896002)(6306002)(790700001)(236005)(6116002)(106002)(7066003)(7636002)(7736002)(70586007)(25786009)(70206006)(7116003)(52536014)(14444005)(74316002)(7596002)(16586007)(336012)(53386004)(5024004)(45080400002)(478600001)(71440200001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB8PR03MB5548;H:eu22-emailsignatures-cloud.codetwo.com;FPR:;SPF:Pass;LANG:en;PTR:eu22-emailsignatures-cloud.codetwo.com;A:1;MX:1;

这导致了 Mime4j 的以下解析错误:

org.apache.james.mime4j.MimeIOException: org.apache.james.mime4j.io.MaxLineLimitException: Maximum line length limit (1000) exceeded

我能够通过配置 Mime4J 接受更长的行来解决这个问题:

    msgFactory.setAttribute(
      "MimeEntityConfig",
      new MimeConfig.Builder().setMaxLineLen(2000).build() );

我将它加倍到 2000,因为就堆 space 而言,我有足够的 head-room,所以这不是问题。

但我实际上可以通过将最大行长度增加到 1001 来解决这个问题。 这 header 行的长度正好是 999 个字符,而默认的 Mime4J 值为 1000,这似乎不仅仅是巧合。

这整个问题可能是一个 off-by-one 错误,原因是收到的邮件以 windows line-endings 终止(即两个字节而不是一个字节)。

似乎 MS ForefrontMime4j 在最大长度为 1000 方面彼此一致,只是有人把他们的电线交叉了大约 line-endings。

谷歌搜索给了我这个 SO 答案,这意味着没有标准的最大长度:

是否有 "correct" 值?

SMTP 定义了一个 maximum line length of 1000 个八位字节,包括新的行序列。

看来最前沿的软件是有bug的。

也就是说,软件不能正确处理任意长的行是愚蠢的。您根本不需要定义最大长度。

在 .NET space 中,我的 MIME 解析器库没有为解析器定义最大行长度,它只为格式化输出定义了最大行长度以符合规范。