首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >maildir标头问题

maildir标头问题
EN

Stack Overflow用户
提问于 2009-01-22 11:10:09
回答 3查看 732关注 0票数 1

我有以下bash脚本来更新maildir文件的mtime:

代码语言:javascript
复制
#!/bin/bash

for i in /test/emailfile

do
    date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i")
    newdate=$(date -d "$date" +'%Y%m%d%H%M.%S')
    touch -t "$newdate" "$i"
done

这个脚本一直运行得很好,标准的头文件如下:

代码语言:javascript
复制
Delivery-date: Sun, 22 Apr 2007 00:15:13 -0600
Received: from an-out-0708.google.com ([209.85.132.243])
    by x.xxxx.com with esmtp (Exim 4.63)
    (envelope-from <xxxxxx@gmail.com>)
    id 1HfVLs-0002Io-RQ
    for x@xxxxx.com; Sun, 22 Apr 2007 00:15:13 -0600

它的交付日期是2007年。如果我触摸该文件,因此文件日期是今天的日期,然后运行我的脚本,则文件日期将恢复为接收自日期。

但是,当尝试在具有以下标题的电子邮件上运行我的脚本时:

代码语言:javascript
复制
Delivery-date: Mon, 15 Dec 2008 17:26:37 -0800
Received: from xxxxxx ([130.194.13.165])
    by xxxxxxx with esmtp (Exim 4.69)
    (envelope-from <xxxxxi@xxxxx.xxx.xx>)
    id 1LCOhp-0006fm-2g
    for xxxxx@xxxxxx.com; Mon, 15 Dec 2008 17:26:37 -0800

日期显然没有恢复。我看不出头部有任何明显的不同。我需要重置mtime,因为许多邮件客户端使用filetime将其显示为接收自时间。我的脚本已经在3000多封电子邮件上工作,确保所有客户端在移动服务器和所有具有相同日期的文件后以正确的顺序显示电子邮件,但由于某些原因,它不会在特定的电子邮件上工作。我是否在脚本中遗漏了一些显而易见的东西?

编辑:日期显然是从脚本恢复的,但是,无论脚本将日期设置为什么,依赖mtime的客户端都不会显示此消息。权限是相同的,就像布局和文件名格式一样。以下是ls -la的帖子

代码语言:javascript
复制
-rw-rw----   1 username username    11769 Dec 14 21:25 1229318728.H329820P11297.xxxxx.serverxxxxx.com:2,S
-rw-rw----   1 username username     3366 Dec 15 17:26 1229390797.H476913P25671.xxxxx.serverxxxxx.com:2,S
-rw-rw----   1 username username     1149 Dec 22 05:39 1229953142.H901034P11016.xxxxx.serverxxxxx.com:2,S
-rw-rw----   1 username username     7557 Dec 23 15:43 1230075791.H700954P8392.xxxxx.serverxxxxx.com:2,S

无法正确显示的文件是从顶部开始的第二个文件。有没有办法调试为什么会发生这种情况?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-22 11:47:13

它似乎对我来说很好,试试这个小曲子,看看你会得到什么。

代码语言:javascript
复制
#!/bin/bash
echo 'Delivery-date: Sun, 22 Apr 2007 00:15:13 -0600
Received: from an-out-0708.google.com ([209.85.132.243])
    by x.xxxx.com with esmtp (Exim 4.63)
    (envelope-from <xxxxxx@gmail.com>)
    id 1HfVLs-0002Io-RQ
    for x@xxxxx.com; Sun, 22 Apr 2007 00:15:13 -0600' | sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }'
date -d "Sun, 22 Apr 2007 00:15:13 -0600" +'%Y%m%d%H%M.%S'
echo 'Delivery-date: Mon, 15 Dec 2008 17:26:37 -0800
Received: from xxxxxx ([130.194.13.165])
    by xxxxxxx with esmtp (Exim 4.69)
    (envelope-from <xxxxxi@xxxxx.xxx.xx>)
    id 1LCOhp-0006fm-2g
    for xxxxx@xxxxxx.com; Mon, 15 Dec 2008 17:26:37 -0800' | sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }'
date -d "Mon, 15 Dec 2008 17:26:37 -0800" +'%Y%m%d%H%M.%S'

我得到(不出所料):

代码语言:javascript
复制
Sun, 22 Apr 2007 00:15:13 -0600
200704221415.13
Mon, 15 Dec 2008 17:26:37 -0800
200812161026.37

因此,我不确定为什么您的脚本不能工作,尽管该脚本的输出应该是一个很好的起点。

您可以做的另一件事是临时修改您的脚本,如下所示:

代码语言:javascript
复制
: : : : :
echo touch -t "$newdate" "$i"
touch -t "$newdate" "$i"
: : : : :

这将输出您正在尝试的实际命令。

还要检查目录和单个文件的文件权限。

"ls -l“(mtime)和"ls -lc”(ctime)对实际可疑邮件文件有什么帮助?可能是您的脚本运行正常,但用户的电子邮件客户端没有使用mtime/ctime。

编辑后:

引用“然而,无论脚本将日期设置为什么,依赖mtime的客户端都不会显示此消息”,我的回答是客户端不是依赖mtime的。

套用夏洛克本人的话说,一旦你排除了所有其他可能性,剩下的一切,无论多么不可能,都肯定是这种情况。我注意到一件事:你刚才是不是说消息根本没有显示出来(或者我以为我们说的日期是错的)?

如果是后者,您需要查看邮件客户端,以查看它实际从何处获取日期。出于兴趣,客户端认为它是什么日期(它是否与标题中的任何日期匹配?

如果是前者,那就是我们可以讨论的另一个问题。

我认为这就是你需要从这里开始的(客户端),由于我的专业知识更多的是脚本而不是电子邮件客户端,我可能无法提供进一步的帮助。尽管如此,我还是很有兴趣看看结果如何,所以我最喜欢这个问题。

票数 1
EN

Stack Overflow用户

发布于 2011-02-25 03:34:18

以下脚本使用邮件消息的日期而不是接收日期属性。这会将日期设置为与某些邮件应用程序使用的日期相匹配,并简化sed语句。它还包括在遇到错误/无效日期时改进的错误处理。

代码语言:javascript
复制
#!/bin/bash
echo "Process folder : $@"
for i in $( ls -1 $@ )
do
#    date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i") 
#    date=$(sed -n -f ~/scripts/fix.sed "$i")
    date=$(sed  -n '/^Date: / {s/^Date: //p;q}' "$i")
    newdate=$(date -d "$date" +'%Y%m%d%H%M.%S')
    returnCode=$?
    if [ "$returnCode" != "0" ]
    then
      echo "Date Return Code : $returnCode"
      echo "Message file : $i received at : $date"
    fi
touch -c -t "$newdate" "$i"
done
票数 1
EN

Stack Overflow用户

发布于 2009-01-22 11:45:45

你确定吗--它对我很有效。

我所做的唯一更改是:

代码语言:javascript
复制
#!/bin/bash

for i in "$@"

do
    date=$(sed -n '/Received: from/ { :a; n; /;/ {s/.*; //p;q}; b a }' "$i")
    newdate=$(date -d "$date" +'%Y%m%d%H%M.%S')
    touch -c -t "$newdate" "$i"
done

touch -c,这样文件就不会通过触摸来创建。

for i in "$@",以便它在命令行参数上运行,而不是在固定文件上运行。

代码语言:javascript
复制
$ touch data2 ; ls -l data2
-rw-r--r-- 1 leeder leeder 250 2009-01-22 11:43 data2
$ bash test.sh data data2 ; ls -l data2
-rw-r--r-- 1 leeder leeder 250 2008-12-16 01:26 data2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/468704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档