2009年6月10日

最近做OCS与短信平台整合过程中,要对收到的邮件进行解析,发现现在的解析器都有这几个问题:

1 当邮件是传真邮件,语音邮件时 解析器不能识别Header部分的某一些字段(除了FROM.TO.SUBJECT.DATE...等),所以header部分应该是Hashtable

2 在对头部或者邮件正文进行解析是编码不能正确转换。比如邮件头中的subject有简体或者繁体就乱码

发现最好的解析器应该属于LumiSoft.Net.Mime了,但是这个解析器存在的问题是不能识别Header部分的某一些字段(除了FROM.TO.SUBJECT.DATE...等),

因此本人将它改进,对原文件进行分析后发现:如果将该源文件的 ParseHeaderField(headerfileds,headers)方法公开后还是能得到一些其他字段的Mime 。ParseHeaderField,这样柑橘不好的事你必须首先传输你要得到的字段,

string st = mimeparser.ParseHeaderField("Content-Class:", mimeparser.Headers).ToString().Trim();

为添加正则匹配header字段的到header的hashtable

 


        internal static Hashtable parseHeaders(string partData)
        {
            Hashtable headerFields = new Hashtable();

            string[] parts = Regex.Split(partData, DOUBLE_NEWLINE);
            string headerString = parts[0] + DOUBLE_NEWLINE;

            MatchCollection headerKeyCollectionMatch = Regex.Matches(headerString, @"^(?<key>\S*):", RegexOptions.Multiline);
            string headerKey = null;
            foreach (Match headerKeyMatch in headerKeyCollectionMatch)
            {
                headerKey = headerKeyMatch.Result("${key}");
                Match valueMatch = Regex.Match(headerString, headerKey + @":(?<value>.*?)\r\n[\S\r]", RegexOptions.Singleline);
                if (valueMatch.Success)
                {
                    string headerValue = valueMatch.Result("${value}").Trim();
                    headerValue = Regex.Replace(headerValue, "\r\n", "");
                    headerValue = Regex.Replace(headerValue, @"\s+", " ");
                    // TODO: Duplicate headers (like Received) will be overwritten by the 'last' value.     
                    headerFields[headerKey] =CDecode(headerValue);
                }
            }

            return headerFields;
        }

 

这样真个DLL编译为:

常用的一些字段可以使用  MimeParser mimeparser = new MimeParser(Encoding.Default.GetBytes(message.Data));

mimeparser.From/To/Subject/Date/MessageID/BCC/Cc...等得到 mimeparser.Headers 是头文件的string.

还可以使用Hashtable ht = mimeparser.headers; ht["Subject"] ht["Content-Class"]等来得到某一些字段

注意ht["To"]字段格式为 :XXX  《XXX@XXXX.COM》等,所以取地址的话进行字符串处理

int length1 = message.Headers["To"].ToString().IndexOf("<");
 int length2 = message.Headers["To"].ToString().IndexOf(">");
 string Toaddress = message.Headers["To"].ToString().Substring(length1 + 1, length2 - length1 - 1);  

字段乱码的问题已解决了。

附上DLL和源文件:

大家有什么需要修改的欢迎给我反馈 。QQ476074295

 

posted @ 2009-06-10 10:14 peter.deng 阅读(743) 评论(2) 编辑

导航

公告

统计