邮件服务器:在Maildir文件上将“日期:”标题日期年份从“ yy”转换为“ yyyy”

时间:2018-07-16 13:07:20

标签: bash mail-server dovecot maildir

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

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

自90年代以来,我们就已经拥有此邮件服务器基础结构。因此,某些消息具有旧的“日期”标头格式,年份字段为“ yy”。由于Google要求它为“ yyyy”,因此他们告诉我,在将Imap导入其云之前,我需要在每条需要的消息上转换此信息。这遵循RFC2060和3501。

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

这里是一个例子:

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

应为:

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

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

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

谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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' _ {} +

我的预测是,如果您需要处理数十个来自Lotus,Yahoo!和Microsoft等智能创造力堡垒的错误邮件客户端,则最终的sed脚本将需要复杂得多。最讨厌的可能是那些错误地本地化的-您可能会猜到Märtz是3月,但祝您好运 marraskuu 或十一月...