使用 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
并将其添加为二进制附件)。
我正在尝试删除一些不需要的字符 >
,该字符出现在某些旧存档电子邮件(例如 ">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
并将其添加为二进制附件)。