公司之前在用一套在线的CRM系统,现决定停用了,所以之前的客户邮件都需要从CRM系统导出。问题是导出的机制是用邮件客户端重新收一次,这要就导致所有邮件的接收时间变成此次接收时间,而不是邮件原始的收件时间了,这样不利于用户对历史邮件的查找(foxmail 里只显示一个时间,不能显示发送时间,要不然也可以让他们按发送时间排序),于时就想了个办法,把邮件都导成 .eml文件,然后修改它的接收时间为发送时间,这样再次导入邮件客户端就能很好的按时间排序了。

此次用到了 linux 下的 sed 等shell命令,其中正则表达式的调试颇费时间,特别记录了一下:

.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

GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐