Email

基於 mtime 或 ctime 歸檔/移動郵件更好嗎?

  • April 5, 2019

我一直在使用 perl 腳本來存檔在此處找到的郵件

該腳本使用 ctime 處理並決定放置郵件的月份子文件夾。在大多數情況下,這很好,因為 ctime = mtime,因此郵件按發送或接收的月份存檔。

但是我發現執行腳本不好的情況。

例如,使用者將郵件移回收件箱或郵件已從備份恢復到收件箱。如果腳本處理被觸摸的郵件,它將把郵件移到被觸摸的月份,而不是發送/接收的時間。

通過 mtime 處理郵件不是更好嗎?

換句話說,我應該使用更好的 POSIX qw 是什麼?

我使用procmailand Dovecot,但 maildir 結構相當標準化。

如果您嘗試按日期存檔,則可能需要Date從標題中驗證。從標題頂部讀取您找到的第一個日期應該非常準確。我的消息有三個可以使用Delivery-Date:的欄位,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

引用自:https://unix.stackexchange.com/questions/56558