一位同事的启发让我从中找到了模式,将我从疯狂的新深度中拯救出来。我希望这里的智囊团现在可以告诉我原因......
现场:我们有几个带有 procmail 设置的通用邮件 ID,用于根据原始收件人重新分发邮件。例如,发送到 generic_ID1 的邮件将发送至 Staff1,staff2;发送至 generic_ID2 的邮件将发送至 Staff3、staff4;等等...
GENERIC_ID1_RECIPIENTS="staff1@domain,staff2@domain"
:0
* ^TO.*generic_ID1
! $GENERIC_ID1_RECIPIENTS
问题:邮件被截断,看起来是随机的。最终发现的模式表明,当一个句子在第 76 列以句点和硬回车结尾时,就会发生这种情况:不在第 75 或 77 列;不在第 75 列或第 77 列;不在第 76 列,同一行有更多文本。该时期之后的所有文本都丢失了。
附录:我们刚刚看到它在第 226 列以句点重新出现(并重现)。我惊呆了。
我可以通过在重新投递之前复制邮件来确认 procmail 已收到完整邮件:
:0c # note: 'c'
* ^TO.*generic_ID1
! $GENERIC_ID1_RECIPIENTS
我相信 sendmail 可能会在重新投递时截断它,但我不确定如何诊断或证明这一点(我不是 sendmail 管理员,只是 procmail 用户)。
该问题是完全可重现的。
问题:为什么会发生这种情况以及如何解决它?
非常感谢。
编辑:更新了标题和标签。解决办法在评论里。
答案1
(由问题评论转换而来)
这个等式实际上包含三个部分:sendmail、procmail 和 Exchange:
交换:在接受一封邮件进行投递时,它似乎会重新格式化纯文本消息,将其行编码并换行为 75 个字符。
发送邮件:在该邮件中遵循了一种古老的(但已知的)行为,该邮件中一行上只有一个句点被解释为消息结束,然后被传递,从而有效地截断了实际的邮件正文。
程序邮件:根据文档,它应该使用强制其忽略裸句点的标志来调用 sendmail。它没有这样做,也没有遵守显式的配置文件指令。短期解决方案:将 -oi -OIgnoreDots=T 传递给所有重新交付配方。长期解决方案:升级我们站点的 procmail 安装,现在支持配置设置并忽略裸露周期(不再需要传递的标志)。
硬换行之所以发挥作用,是因为当 Exchange 对以前的纯文本消息进行编码时,它引入了=20
可能允许句点自行换行并单独留在一行中的功能。