公司之前在用一套線上的CRM系統,現決定停用了,所以之前的客戶郵件都需要從CRM系統匯出。問題是匯出的機制是用郵件用戶端重新收一次,這要就導致所有郵件的接收時間變成此次接收時間,而不是郵件原始的收件時間了,這樣不利於使用者對曆史郵件的尋找(foxmail 裡只顯示一個時間,不能顯示發送時間,要不然也可以讓他們按發送時間排序),於時就想了個辦法,把郵件都導成 .eml檔案,然後修改它的接收時間為發送時間,這樣再次匯入郵件用戶端就能很好的按時間排序了。
此次用到了 linux 下的 sed 等shell命令,其中Regex的調試頗費時間,特別記錄了一下:
.eml郵件格式:
Return-Path: <xioh@163.com>
Delivered-To: hog@trade.alisoft.com
Received: (qmail 20460 invoked from network);
Received: from unknown (HELO alswm-rule3.hst.jyl.itbu.alidc.net) (172.26.9.127)
by 0 with SMTP; 23 Jul 2011 16:20:13 -0000
Message-ID: <6935039.1311438013166.JavaMail.admin@alswm-rule3.hst.jyl.itbu.alidc.net>
Date: Wed, 20 Jul 2011 09:57:16 +0800 (CST)
From: =?gbk?B?urJz7Q3Lnwuuo=?= <xionsh@163.com>
Reply-To: =?gbk?B?rJzH7Q3Lnwuuo=?= <xiosh@163.com>
To: =?gbk?Q?xuxiaoyan=28=D0=EC=CF=FE=D1=D2=A3=A9?= <xuxin@hoang.com>
Subject: =?gbk?B?1/TFwcu5tcS/qsax0qrH8w==?=
Cc: =?gbk?B?wu2zrA==?= <step@hog.com>,
=?gbk?B?1tzBwbLFILrqycw=?= <zhouliangcai@hog.com>
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_Part_1375787_30476309.1311438013163"
------=_Part_1375787_30476309.1311438013163
Content-Type: text/html; charset=gbk
Content-Transfer-Encoding: quoted-printable
<DIV></DIV>
<DIV>=D0=EC=D7=DC3=BA</DIV>
shell 指令碼如下: 修改郵件檔案的發送時間為接收時間,並將此時間作為郵件名前輟重新命名郵件。
#!/bin/bash
export IFS=$'\n'
subdir="modified"
filelist=`ls *.eml`
mkdir $subdir
for filename in $filelist
do
d=`sed -n "1,15s/^\(Date: \)\(.* (CST)\r\)/\2/p" $filename` #取出郵件的發出時間
e=`sed -n "1,15s/^\(From: .*<\)\(.*\)\(>\r.*\)/\2/p" $filename` #取出郵件的寄件者
filename2=${filename:0:(${#filename}-4)}
filename2="${filename2:0:64}.eml"
filename2="$subdir/From_$e,`date -d "$d" +%Y-%m-%d_%H:%M`_$filename2"
cp $filename $filename2 #用新檔案名稱copy一份
sed -i "1,15s/\(Received: .*; \)\(.*\)/\1$d/g" $filename2 #修改郵件的接收時間
#echo "cp" "$filename" $filename2
done
參考:
http://sed.sourceforge.net/sed1line_zh-CN.html