犬者
“说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!”

【电脑】关于OpenPOP/OpenSMTP/Mail.Net的一些东西……

感谢hamidsforge, sheda0, unruledboy等牛人的贡献……所以,我们才能够有OpenPOP/OpenSMTP这两个开源.net email组件可以用……以及,由这两个项目合并后成为的Mail.Net

除了这两个(Mail.Net貌似还没有发布)东西,我实在是不知道还有别的什么.Net POP3 client可以用,.Net内置的smtp功能则实在是太弱了……

最近一直在跟email打交道,用了这两个东西很久……有些经验,不敢独享,所以便发表在这里:

1。OpenPOP在处理基于UTF-8 Q编码的中文信件时会出现乱码,包括标题与信的内容

这应该是内置的MIME Parser的QuotedCoding这个类中的bug,如果不想修改OpenPOP的代码,可以使用类似:
If msg.ContentCharset = "UTF-8" Then
    Subject=System.Text.Encoding.UTF8.GetString(System.Text.Encoding.GetEncoding("GB2312").GetBytes(msg.Subject))
End If

的简单代码便可以搞定。

2。OpenPOP的MIME Parser中Message类的Date属性刻意忽略了时区的影响,应该调用DateTimeInfo这个属性获得时区信息,再对Date提供的时间做修正,修正时我使用的是类似下面的代码:
    Public Shared Function fixTimeZone(ByVal timez As StringByRef dt As DateTime)
        
Dim lt As TimeSpan
        
Dim i As Integer
        
If timez.IndexOf("+"> -1 Then
            timez 
= timez.Substring(timez.IndexOf("+"+ 1)
            
If Char.IsDigit(timez.Chars(2)) Then
                i 
= 2
            
Else
                i 
= 3
            
End If
            lt 
= TimeSpan.FromHours(Convert.ToDouble(timez.Substring(02)))
            lt 
= lt.Add(TimeSpan.FromMinutes(Convert.ToDouble(timez.Substring(i, 2))))
            lt 
= lt.Subtract(System.TimeZone.CurrentTimeZone.GetUtcOffset(New DateTime(199911)))
            dt 
= dt.Subtract(lt)
        
ElseIf timez.IndexOf("-"> -1 Then
            timez 
= timez.Substring(timez.IndexOf("-"+ 1)
            
If Char.IsDigit(timez.Chars(2)) Then
                i 
= 2
            
Else
                i 
= 3
            
End If
            lt 
= TimeSpan.FromHours(Convert.ToDouble(timez.Substring(02)))
            lt 
= lt.Add(TimeSpan.FromMinutes(Convert.ToDouble(timez.Substring(i, 2))))
            lt 
= lt.Add(System.TimeZone.CurrentTimeZone.GetUtcOffset(New DateTime(199911)))
            dt 
= dt.Add(lt)
        
ElseIf timez.IndexOf("GMT"> -1 Then
            dt 
= dt.Add(System.TimeZone.CurrentTimeZone.GetUtcOffset(New DateTime(199911)))
        
End If
    
End Function

3。OpenSMTP在发送文件名为中文的附件时候,没有设置文件名的编码信息,造成乱码。
因为添加、发送附件的时候,都是OpenSMTP内部完成的,所以必须修改它的代码,重新compile……需要修改的是Attachment.cs中ToMime这个函数,下面是我修改后的函数内容:
public String ToMime() 
        
{
            StringBuilder sb
=new StringBuilder();
            
if (ContentId!=null
            
{
                sb.Append(
"Content-ID: <" + ContentId + ">\r\n");
            }

            String fname;
            fname
="\"=?UTF-8?Q?" + MailEncoder.ConvertToQP(name,"UTF-8") + "?=\"";
            fname
=fname.Replace("\r\n","");
            fname
=fname.Replace("==","=");
            sb.Append(
"Content-Type: " + mimeType + ";\r\n");
            sb.Append(
" name=" + fname + "\r\n");
            sb.Append(
"Content-Transfer-Encoding: " + encoding + "\r\n");
            sb.Append(
"Content-Disposition: attachment;\r\n");
            sb.Append(
" filename=" + fname + "\r\n\r\n");
                    
            FileStream fin 
= new FileStream(encodedFilePath, FileMode.Open, FileAccess.Read);

            
byte[] bin;

            
while (fin.Position != fin.Length)
            
{
                bin 
= new byte[76];
                
int len = fin.Read(bin, 076);
                sb.Append(System.Text.Encoding.UTF8.GetString(bin , 
0, len)+"\r\n");
            }


            fin.Close();
            
return sb.ToString();
        }

OpenPOP跟OpenSMTP分别使用了两个用途一致的Email Parser,不仅是在重复发明轮子,也阻碍了两者的整合,Mail.Net的出现是很应该了……Well……其实,我觉得,Email Parser本身也应该可以做为一个独立的.Net控件,其中对于Email发送时间的时区问题以及各种五花八门的编码,其实都还是有完善的空间的。

而说到完善,即使Mail.Net顺利诞生,它其实也还不足以称为最强……因为它完全没有支持IMAP……大家可以去Google一下IMAP .Net,N多公司在靠这样的组件赚钱,而且还很贵……连php/perl等都有提供对IMAP的支持库,相比之下,.Net的程序员貌似太可怜了……不过,也不是没有人提供开源的.Net IMAP Client,CodeProject上便有一个由Rohit Joshi提供的C# IMAP Client library,虽然这个组件很粗糙,但是,我稍微封装一下便可以使用OpenPOP的Email Parser完成最基本的到不同目录查取新信等功能。

不知道,什么时候,才有一个真正的最强.Net开源邮件组件呢?如果已经有了,请拜托告诉我……

21079
问天 @12/2/2005 3:11:48 PM
View blogs in this category:电脑


问天 在 4/8/2008 6:31:22 PM 说:

OpenPop其实基本没法用……
偶已经给它fix了无数bug……
勉强能用……
豆浆 在 4/8/2008 6:14:33 PM 说:

不仅是这样。

如果你用MDaemon的World Client发邮件。用OPENPOP解析的话。会硬生生的将正文丢掉。正文内容只有一个 "-"
rex 在 12/4/2005 1:13:20 AM 说:

这东西不错。
Wuvist 在 12/3/2005 9:08:37 PM 说:

是啊是啊……可是……要真正解决这个问题……就得修改OpenPOP的代码……太麻烦了……
Livecn 在 12/3/2005 7:50:33 PM 说:

第一个例子里面,GB2312的使用限制了你的程序只能把GB2312变成UTF-8,如果msg.Subject碰巧是其它语言,转换出来的结果就不对鸟。

Please leave your comment here

 
  名字:
  主页:
  内容:
 

   


Navigation
Blogwind
犬者首页
Contact


个人档案


“说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!”



Categories
死结(27)
电脑(188)
心情(190)
天影(25)
乱弹(221)
博客(82)
音乐(18)
饕餮(32)
读书(24)
电影(35)
网摘(5)
希望(60)
汕头(10)
经济(12)
苹果(20)
跋涉(17)
玩意(1)



Archive
2009年6月
2009年5月
2009年4月
2009年3月
2009年2月
2009年1月
2008年12月
2008年11月
2008年10月
2008年9月
2008年8月
2008年7月
2008年6月
2008年5月
2008年4月
2008年3月
2008年2月
2008年1月
2007年12月
2007年11月
2007年10月
2007年9月
2007年8月
2007年7月
2007年6月
2007年5月
2007年4月
2007年3月
2007年2月
2007年1月
2006年12月
2006年11月
2006年10月
2006年9月
2006年8月
2006年7月
2006年6月
2006年5月
2006年4月
2006年3月
2006年2月
2006年1月
2005年12月
2005年11月
2005年10月
2005年9月
2005年8月
2005年7月
2005年6月
2005年5月
2005年4月
2005年3月
2005年2月
2005年1月
2004年12月
2004年11月
2004年10月
2004年9月
2004年8月
2004年7月
2004年6月
2004年5月
2004年4月
2004年3月
2004年2月
2004年1月
2003年12月



My Links
5G
bloglines
时尚摄影师奇科的博客
颜如玉
最爱卫斯理

RSS 2.0

Username:
Password:
 Remember me