0

我为 SMTP 和 IMAP 使用 Postfix 和 Dovecot。它们位于最新的 CentOS 7 可用版本上,并且消息以 Maildir 格式存储。

我们已经与谷歌达成协议,我们的邮箱将很快转移给他们。

自九十年代以来,我们就有这个邮件服务器基础设施。因此,某些消息具有旧的“日期”标题格式,年份字段为“yy”。由于谷歌要求它是“yyyy”,他们告诉我,在将 Imap 导入他们的云之前,我需要在每条需要的消息上转换此信息。这遵循 RFC2060 和 3501。

这是一所大学,这些旧消息包含应该保留的研究数据。

这是一个例子:

日期:17 年 4 月 20 日星期四 15:45:15 +0000

应该:

日期:2017 年 4 月 20 日星期四 15:45:15 +0000

我一直在寻找脚本来执行此修复,方法是保留标题、日期,并且只在每个需要的文件中修复年份,而不更改文件时间戳(一些邮件客户端使用它作为排序方法)。但我还没有找到。

那么,有没有人可以帮助我?

谢谢你。

4

2 回答 2

1

修改后可以使用touch命令恢复文件的时间戳。假设文件名是 input_file。

orinal_time=$(stat -c "%y"input_file)  #store the orignal timestamp

#do yy->yyyy conversion, this is just example. key here is %Y for conversion
date -d"Thu, 20 Apr 17 15:45:15 +0000" "+%a,%d %b %Y %T %z" >input_file.tmp && mv input_file.tmp input_file

#restore the orignal timestamp

 touch -d "$orinal_time" input_file
于 2018-07-16T13:26:47.960 回答
1

您不能在不更改时间戳的情况下修改文件;但是您可以保留原始时间戳并将其应用回来touch,如单独的答案中所示。

找到损坏的Date:标头也不是太难,特别是如果消息是由一小组客户端发送的,这些客户端都以相同的方式统一损坏。但是,您可以在野外发现许多不同的 RFC 违规行为,因此在继续修改之前,可能会执行测试运行以提取所有 Date: 不符合预期格式的标头。

find Maildir -type f -exec sh -c 'for f; do
     sed -n "/^\$/q;/^[Dd][Aa][Tt][Ee]:/p" "$f"; done' _ {} +

-exec ... +是一个 GNU 扩展,它模仿xargs它会将尽可能多的找到的文件作为参数传递给由-exec.

[Dd][Aa][Tt][Ee]:您可以在搜索与特定错误Date:格式匹配的日期标题之后扩充正则表达式。

如果您可以验证所有错误消息都与您的样本相似,

sed -i '1,/^$/!b;s/^\([Dd][Aa][Tt][Ee]: [A-Z][a-z][a-z], [ 0-3][0-9] [A-Z][a-z][a-z] \)\([7-9][0-9] \)/\119\2/;s/^\([Dd][Aa][Tt][Ee]: [A-Z][a-z][a-z], [ 0-3][0-9] [A-Z][a-z][a-z] \)\([01][0-9] \)/\120\2/'

可能至少是修复错误消息的良好开端。

把所有东西放在一起,最终的脚本可能看起来像

find Maildir -type f -exec sh -c 'for f; do
        timestamp=$(stat -c "%y" "$f")
        sed -i "1,/^\$/!b;s/^\(Date: [A-Z][a-z][a-z], [ 0-3][0-9] [A-Z][a-z][a-z] \)\([7-9][0-9] \)/\119\2/;s/^\(Date: [A-Z][a-z][a-z], [ 0-3][0-9] [A-Z][a-z][a-z] \)\([01][0-9] \)/\120\2/" "$f"
        touch -d "$timestamp" "$f"
done' _ {} +

我的预测是,sed如果您需要处理来自 Lotus、Yahoo! 和 Microsoft 等智力创造力据点的数十年错误邮件客户端,您的最终脚本将需要相当复杂。最讨厌的可能是那些本地化不正确的地方——你可能会猜到Märtz是三月,但祝你好运marraskuu或十一月......

于 2018-07-16T14:06:31.797 回答