1

maildir ファイルの mtimes を更新する次の bash スクリプトがあります。

#!/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

このスクリプトは、次のような標準ヘッダーで常に正常に機能します。

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年の配達日があります。ファイルの日付が今日からになるようにそのファイルに触れてからスクリプトを実行すると、ファイルの日付は受信した日付に復元されます。

ただし、次のヘッダーを持つ電子メールでスクリプトを実行しようとすると:

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

日付は明らかに復元されていません。ヘッダーが明らかに異なっていることはわかりません。多くのメール クライアントが filetime を使用して受信した時刻として表示するため、mtimes をリセットする必要があります。私のスクリプトは 3000 通以上の電子メールで機能し、サーバーを移動した後、すべてのクライアントが正しい順序で電子メールを表示し、すべてのファイルが同じ日付で表示されるようにしましたが、何らかの理由で特定の電子メールでは機能しません。スクリプトから明らかなことを残しましたか?

編集: 日付は明らかにスクリプトから復元されますが、mtimes に依存するクライアントは、スクリプトが日付を設定したものに関係なく、このメッセージを表示しません。権限は同じで、レイアウトやファイル名の形式も同じです。以下は ls -la からの投稿です

-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

正しく表示されないのは上から2番目のファイルです。なぜこれが起こっているのかをデバッグする方法はありますか?

4

3 に答える 3

1

私にとってはうまくいくようです。この小さなことを試してみて、何が得られるか見てください。

#!/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'

私は(予想通り)得ます:

Sun, 22 Apr 2007 00:15:13 -0600
200704221415.13
Mon, 15 Dec 2008 17:26:37 -0800
200812161026.37

したがって、そのスクリプトの出力は良い出発点になるはずですが、なぜあなたのスクリプトが機能しないのかわかりません。

他にできることは、次のようにスクリプトを一時的に変更することです。

: : : : :
echo touch -t "$newdate" "$i"
touch -t "$newdate" "$i"
: : : : :

これにより、試している実際のコマンドが出力されます。

また、ディレクトリと個々のファイルのファイル権限も確認してください。

"ls -l" (mtime) および "ls -lc" (ctime) は、実際の疑わしいメール ファイルについて何を示しますか? ユーザーの電子メール クライアントが mtime/ctime を使用していない場合でも、スクリプトは正常に動作している可能性があります。

編集後:

「ただし、mtimes に依存するクライアントは、スクリプトが日付を設定する内容に関係なく、このメッセージを表示しません」と引用すると、クライアントはmtimes に依存していないというのが私の回答です。

Sherlock 自身を言い換えると、他のすべての可能性を排除した後、残ったものは、たとえ可能性が低いとしても、そうでなければなりません。そして、私が気づいたことの 1 つは、メッセージがまったく表示されないということでしたか (または、私が話していると思っていた日付が間違っていたということでしたか)。

後者の場合は、メール クライアントを調べて、実際の日付がどこから取得されているかを確認する必要があります。興味深いことに、クライアントはそれが何日だと考えていますか (そして、ヘッダー内の日付と一致しますか?

前者の場合、それは私たちが議論できる別の問題です.

ここから先に進む必要があるのは (クライアント) だと思います。私の専門は電子メール クライアントよりもスクリプト作成の方が多いため、これ以上の支援はできないかもしれません。それでも、どうなるか興味があるので、この質問をお気に入りに入れておきます。

于 2009-01-22T11:47:13.497 に答える
1

次のスクリプトは、メール メッセージの受信日属性ではなく日付を使用していました。これにより、一部のメール アプリケーションで使用される日付と一致する日付が設定され、sed ステートメントも簡素化されます。また、正しくない/無効な日付が検出された場合のエラー処理も改善されています。

#!/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
于 2011-02-24T19:34:17.660 に答える
0

よろしいですか-それは私にとってはうまくいきます。

私が行った唯一の変更は次のとおりです。

#!/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 "$@"固定ファイルではなくコマンドライン引数で実行されるようにします。

$ 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
于 2009-01-22T11:45:44.577 に答える