使用 Procmail/Formail/Regex 更正电子邮件 headers 中的错误

Using Procmail/Formail/Regex correct an error in email headers

我正在尝试删除一些不需要的字符 >,该字符出现在某些旧存档电子邮件(例如 ">From" 的 header 的 "From " 行中,但我无法删除通过使用 Procmail 配方

重写发件人行来做到这一点

重现错误:

>From "xxxx@example.com" Sat Dec  4 11:01:29 2004
Status: RO
From: "xxxxxx" <xxxx@example.com>
Subject: Desktop Alert Utility
To: 'bbbb@example.com'; 'dddd@example.com'
Date: Sat, 04 Dec 2004 05:31:29 +0000
MIME-Version: 1.0
Content-Type: multipart/mixed;
    boundary="--boundary-LibPST-iamunique-1531497257_-_-"

以下无效:

:0 fhw
| formail -I">From " -a"From "

即使是以下也不起作用:

:0 fhw
| formail -I">From "

我做错了什么?很乐意分享任何相关信息。

注意:由于邮件第一行From前不必要的>header,邮件客户端显示邮件为“无发件人”,而不是在摘要视图中显示其他详细信息。它在 body.

中显示了整个消息

我也试过了

LC_ALL=C find . -type f -name ‘*.*’ -exec sed -i '' s/'>From'/'From'/ {} +

但它没有return需要的结果。

我是 运行 macOS Mojave。


新说明:虽然下面回答了我最初的问题,但关于应用 sed 实现结果的扩展讨论在下面的 link 中引发了一个新问题:

Removing unwanted character from the first line of files in a “maildir”

> 在句法上不是有效的 header 字符,因此我怀疑您能否说服 formail 将其视为一个字符。

尝试编写一个简单的 sed 或 Awk 脚本来转义它。

如果>From总是每个文件的第一行,试试

sed -i '' '1s/^>From/From/' *

如果文件不在当前目录中,可能用

包裹
find . -type d -execdir sh -c 'sed -i "" "1s/^>From/From/" *' \;

到运行它在当前目录的所有子目录上。

这假设文件名都适合一个命令行;如果你得到“参数列表太长”,试试

printf '%s\n' * | xargs sed -i '' '1s/^>From/From/'

或使用find,尝试

find . -type f -exec sed -i '' '1s/^>From/From/' {} +

printf 变体有点脆弱;如果你不能让它工作,因为你有不规则的文件名,其中有换行符等,find 解决方案应该不难适应当前目录中的 运行(添加 -maxdepth 1 以防止它遍历子目录)。

简而言之,某些电子邮件服务器会将邮件 body 中行首 的每个 From 更改为 >From ](或者,使用 quoted-printable MIME 编码,=46rom;但是当您使用适当的 MIME 客户端查看邮件时,为了显示目的,这应该被透明地转换回来)——我猜您已经转发了整个邮箱内联到 text/plain 消息中,所以也许最简单的解决方法是从原始来源再次发送它,这次包装到合适的 MIME 容器中,这样它就不会在传输中被损坏(也许将其包装到 .tar.gz 并将其添加为二进制附件)。