Email
基於 mtime 或 ctime 歸檔/移動郵件更好嗎?
我一直在使用 perl 腳本來存檔在此處找到的郵件
該腳本使用 ctime 處理並決定放置郵件的月份子文件夾。在大多數情況下,這很好,因為 ctime = mtime,因此郵件按發送或接收的月份存檔。
但是我發現執行腳本不好的情況。
例如,使用者將郵件移回收件箱或郵件已從備份恢復到收件箱。如果腳本處理被觸摸的郵件,它將把郵件移到被觸摸的月份,而不是發送/接收的時間。
通過 mtime 處理郵件不是更好嗎?
換句話說,我應該使用更好的 POSIX qw 是什麼?
我使用
procmail
andDovecot
,但 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