私は発見されたメールをアーカイブするためにPerlスクリプトを使用しています。ここ
スクリプトは ctime を使用して、メールを保存する月のサブフォルダを処理して決定します。ほとんどの場合、ctime = mtimeなので、メッセージは送受信した月に基づいて保持されるので大丈夫です。
しかし、時にはスクリプトを実行するのが悪いこともあります。
たとえば、ユーザーがメッセージを受信トレイに戻したり、メッセージがバックアップから受信トレイに復元されたとします。スクリプトがタッチされたメッセージを処理する場合は、メッセージを送受信した時間ではなく、タッチされた月にメッセージを移動します。
電子メールを処理するには、mtimeを使用する方が優れていませんか?
つまり、どのPOSIX qwをよりよく使うべきですか?
答え1
私はprocmail
maildirとDovecot
maildirを使用していますが、構造はかなり標準化されています。
日付別にアーカイブする場合は、Date
ヘッダーで確認が必要な場合があります。ヘッダーの上部で見つかった最初の日付を読むと、かなり正確になります。私のメッセージには、件名と件名Delivery-Date:
の3つのフィールドを使用できます。受信したメッセージの場合、最初または最初のヘッダーに適切な日付が表示されます。送信メッセージには、メールサーバーの時間ではなく、メッセージを生成したシステムの時間を反映するヘッダーしかありません。ヘッダーに利用可能な日付がないメッセージにフラグを付けることができます。Received:
Date:
Delivery-Date:
Received:
Date:
ctime
これは通常メッセージの日付である必要がありますが、メッセージを移動またはコピーすると、メッセージの新しいコピーが作成されます。通常、これらの操作はファイルを正しいディレクトリに再接続することによって行われます。編集:このスクリプトは、ファイルの最初の日付を含むメッセージのリストを印刷します。 RFC 日付形式と一致します。正規表現は最高ではないかもしれません。
#!/usr/bin/perl
%months = ( 'Jan'=>'01', 'Feb'=>'02', 'Mar'=>'03', 'Apr'=>'04',
'May'=>'05', 'Jun'=>'06', 'Jul'=>'07', 'Aug'=>'08',
'Sep'=>'09', 'Oct'=>'10', 'Nov'=>'11', 'Dec'=>'12' );
foreach $filename (@ARGV) {
open( MESSAGE, $filename);
while (<MESSAGE>) {
if ( m/[A-Z][a-z][a-z], ([1230][0-9]) ([A-Z][a-z][a-z]) ([12][0-9][0-9][0-9])/ ) {
print "$3-$months{$2}-$1 $filename\n";
last
}
if ( m/^$/ ) { # End of header
print "-No--Date- $filename\n";
last
}
}
close MESSAGE;
}
# EOF
答え2
ここで読むと、ctimeとmtimeの違いを以下に説明します。http://cerebro.freeshell.org/log/unix-mtime-vs-ctime/。ちょっとしたアイデアを申し上げます。保存したすべての電子メールにタイムスタンプを追加すると、電子メールを再検索したときに電子メールが送信または受信された正確な日付がわかります。これが私たちがバックアップに使用する方法です。