1

问题

如果没有标准,用作“最大标题行长度”的好值是多少?

是否有某种非正式标准来确定 SMTP 标头行的最大长度应该是多少?


语境

我使用Mime4J来解析 SMTP 消息。

最近,我遇到了与很长的标题行相关的解析失败,这是由Microsoft Forefront显然添加的标题引起的。有问题的标题行如下所示:

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,因为我在堆空间方面有足够的空间,所以这不是问题。

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

这整个问题可能是由于收到的邮件以 Windows 行结尾(即两个字节而不是一个字节)终止这一事实而导致的一个错误。

似乎MS ForefrontMime4j同意彼此的最大长度为 1000,只是有人在行尾的问题上交叉了线。

谷歌搜索给了我这个 SO 答案,这意味着没有标准的最大长度: https ://stackoverflow.com/a/2721849/924597

有“正确”的价值吗?

4

1 回答 1

0

SMTP 定义的最大行长度为 1000个八位字节,包括新的行序列。

似乎最前沿的软件是一个有错误的软件。

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

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

于 2019-07-24T10:51:51.733 回答