我遇到了 NAGIOS 系统向流行的电子邮件到 SMS 服务发送电子邮件的问题。电子邮件到短信服务接收Subject:
行中带有文本的电子邮件,并将它们发送到To:
字段中编码的手机号码。到目前为止,一切都很好。可悲的是,sendmail(和它之前的 postfix)似乎在(必须很长的)行中插入了一个无偿的 CRLF Subject:
,这导致我的 SMS 消息在 CRLF 处被截断,当且仅当该Subject:
行包含一个或多个冒号超过无偿的CRLF。
我相信这些消息是正确创建的,但为了确定,这里是我为自己创建一个完全 noddy 测试消息,有一条长线Subject:
:
echo "foo" | mail -s "1234567 101234567 201234567 301234567 401234567 501234567 601234567 701234567 801234567 90123456789" [email protected]
Subject:
请注意,此行中没有额外的冒号;我在这里所做的只是显示在线路上插入了一个额外的 CRLF。这是结果sudo ngrep -x port 25
:
44 61 74 65 3a 20 46 72 69 2c 20 33 31 20 4d 61 Date: Fri, 31 Ma
79 20 32 30 31 33 20 31 30 3a 34 33 3a 35 35 20 y 2013 10:43:55
2b 30 31 30 30 0d 0a 54 6f 3a 20 72 65 61 70 65 +0100..To: reape
72 40 74 65 61 70 61 72 74 79 2e 6e 65 74 0d 0a [email protected]..
53 75 62 6a 65 63 74 3a 20 31 32 33 34 35 36 37 Subject: 1234567
20 31 30 31 32 33 34 35 36 37 20 32 30 31 32 33 101234567 20123
34 35 36 37 20 33 30 31 32 33 34 35 36 37 20 34 4567 301234567 4
30 31 32 33 34 35 36 37 20 35 30 31 32 33 34 35 01234567 5012345
36 37 0d 0a 20 36 30 31 32 33 34 35 36 37 20 37 67.. 601234567 7
30 31 32 33 34 35 36 37 20 38 30 31 32 33 34 35 01234567 8012345
36 37 20 39 30 31 32 33 34 35 36 37 38 39 0d 0a 67 90123456789..
55 73 65 72 2d 41 67 65 6e 74 3a 20 48 65 69 72 User-Agent: Heir
6c 6f 6f 6d 20 6d 61 69 6c 78 20 31 32 2e 34 20 loom mailx 12.4
37 2f 32 39 2f 30 38 0d 0a 4d 49 4d 45 2d 56 65 7/29/08..MIME-Ve
72 73 69 6f 6e 3a 20 31 2e 30 0d 0a 43 6f 6e 74 rsion: 1.0..Cont
65 6e 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 70 ent-Type: text/p
6c 61 69 6e 3b 20 63 68 61 72 73 65 74 3d 75 73 lain; charset=us
大约一半的地方(以粗体+斜体标记),在原始标题中的501234567
和之间,您可以看到插入了一个 CRLF(,在左侧的十六进制转储中,在右侧的纯文本中)。601234567
Subject:
0x0d 0x0a
..
接收 MTA 似乎很乐意对此进行后处理,当我在接收端查看磁盘上存储的邮件时,我在 Subject: 行中只看到一个 LF (0x0a),并且该行被正确解析并在其完整,例如,alpine
。然而,CRLF 在线路上,在我和(优秀的)电子邮件到 SMS 支持人员之间,我们已经确定这些是问题的原因。
所以我的问题是:MTA 在网络上插入无偿 CRLF 是否合法?
如果是,而且我可以证明,那就是电子邮件到 SMS 机构的问题,因为他们不宽容。如果不是,或者是但我无法证明,那么它就成了我的问题,因此带参考的答案将是最有用的。
编辑:我现在可以清楚地知道,有问题的电子邮件到短信服务是kapow。一旦向他们解释了这个问题,他们就明白了,与我一起开发和测试修复,并部署了修复。我带有冒号的长主题行现在可以正确地转发到 SMS 中。我通常不会吹嘘个别公司,尤其是在 SF 上,但我认为值得一提的是,kapow 做了正确的事。(免责声明:我与 kapow 没有任何关系,只是作为付费客户对他们处理问题的方式感到满意。)
好吧,如果我理解 RFC 822,它们在某些情况下是合法的,我认为这是 24x80 分辨率的小屏幕时代的产物。
这些部分似乎相当清楚主题可以折叠,折叠是一个 CRLF 加上 LWSP(线性空白)字符..它们可能已被取代,如果你愿意,Wietse(在后缀列表上)完全了解他的 RFC一个明确的答案。
发问者编辑:我希望 NickW 能原谅我添加一条注释,说明 RFC822 已被 RFC2822 淘汰,但新的 RFC 在其 2.2.3 节中说了几乎相同的事情,并明确确认这种折叠应该在进行任何进一步处理之前被删除:
这并不是要贬低 NickW 准确无误地向我指出了我需要知道的几乎所有内容这一事实,只是为了帮助这个答案对未来可能偶然发现它的任何人保持相关性。
Sendmail服务器(SendMail) 施加了 SMTP 行长度限制,但它要高得多(对于 smtp 邮件程序,990 字节或更多)。
发送邮件 != 发送电子邮件
据我了解,Nagios 默认使用 SendEmail客户端发送电子邮件。您使用 Nagios 的电子邮件客户端似乎对电子邮件标题/主题行的长度施加了如此“严格”的限制。
commands.cfg
检查并报告配置文件中配置的电子邮件客户端。(
notify-host-by-email
和notify-service-by-email
设置)。