关于OpenPOP/OpenSMTP/Mail.Net的一些东西……

http://www.blogwind.com/Wuvist/21079.shtml

感谢 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提供的时间做修正,修正时我使用的是类似下面的代码:
ExpandedBlockStart.gif ContractedBlock.gif      Public   Shared   Function fixTimeZone() Function fixTimeZone(ByVal timez As StringByRef dt As DateTime)
InBlock.gif        
Dim lt As TimeSpan
InBlock.gif        
Dim i As Integer
InBlock.gif        
If timez.IndexOf("+"> -1 Then
InBlock.gif            timez 
= timez.Substring(timez.IndexOf("+"+ 1)
InBlock.gif            
If Char.IsDigit(timez.Chars(2)) Then
InBlock.gif                i 
= 2
InBlock.gif            
Else
InBlock.gif                i 
= 3
InBlock.gif            
End If
InBlock.gif            lt 
= TimeSpan.FromHours(Convert.ToDouble(timez.Substring(02)))
InBlock.gif            lt 
= lt.Add(TimeSpan.FromMinutes(Convert.ToDouble(timez.Substring(i, 2))))
InBlock.gif            lt 
= lt.Subtract(System.TimeZone.CurrentTimeZone.GetUtcOffset(New DateTime(199911)))
InBlock.gif            dt 
= dt.Subtract(lt)
InBlock.gif        
ElseIf timez.IndexOf("-"> -1 Then
InBlock.gif            timez 
= timez.Substring(timez.IndexOf("-"+ 1)
InBlock.gif            
If Char.IsDigit(timez.Chars(2)) Then
InBlock.gif                i 
= 2
InBlock.gif            
Else
InBlock.gif                i 
= 3
InBlock.gif            
End If
InBlock.gif            lt 
= TimeSpan.FromHours(Convert.ToDouble(timez.Substring(02)))
InBlock.gif            lt 
= lt.Add(TimeSpan.FromMinutes(Convert.ToDouble(timez.Substring(i, 2))))
InBlock.gif            lt 
= lt.Add(System.TimeZone.CurrentTimeZone.GetUtcOffset(New DateTime(199911)))
InBlock.gif            dt 
= dt.Add(lt)
InBlock.gif        
ElseIf timez.IndexOf("GMT"> -1 Then
InBlock.gif            dt 
= dt.Add(System.TimeZone.CurrentTimeZone.GetUtcOffset(New DateTime(199911)))
InBlock.gif        
End If
ExpandedBlockEnd.gif    
End Function

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

InBlock.gif            String fname;
InBlock.gif            fname
="\"=?UTF-8?Q?" + MailEncoder.ConvertToQP(name,"UTF-8") + "?=\"";
InBlock.gif            fname
=fname.Replace("\r\n","");
InBlock.gif            fname
=fname.Replace("==","=");
InBlock.gif            sb.Append(
"Content-Type: " + mimeType + ";\r\n");
InBlock.gif            sb.Append(
" name=" + fname + "\r\n");
InBlock.gif            sb.Append(
"Content-Transfer-Encoding: " + encoding + "\r\n");
InBlock.gif            sb.Append(
"Content-Disposition: attachment;\r\n");
InBlock.gif            sb.Append(
" filename=" + fname + "\r\n\r\n");
InBlock.gif                    
InBlock.gif            FileStream fin 
= new FileStream(encodedFilePath, FileMode.Open, FileAccess.Read);
InBlock.gif
InBlock.gif            
byte[] bin;
InBlock.gif
InBlock.gif            
while (fin.Position != fin.Length)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                bin 
= new byte[76];
InBlock.gif                
int len = fin.Read(bin, 076);
InBlock.gif                sb.Append(System.Text.Encoding.UTF8.GetString(bin , 
0, len)+"\r\n");
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            fin.Close();
InBlock.gif            
return sb.ToString();
ExpandedBlockEnd.gif        }

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开源邮件组件呢?如果已经有了,请拜托告诉我……

posted on 2008-01-22 09:30 浙林龙哥 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/huqingyu/archive/2008/01/22/1048099.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值