关于.NET邮件的收发问题总结

最近因为项目需要,研究了一下邮件的发送和接收,发现现在这方面的问题很多.虽然网上这方面的资料很多,但是真正应用起来
仍然会发现不少问题,而且很多人都抱怨书上或者网上的一些代码应用起来是失败的,并且针对附件方面的处理不太完善,针对这种情况我把最近研究所得做一个小小的总结,希望能对大家有所帮助。
        首先来谈谈发送邮件的问题。

发送邮件现在应用得最多的两种情况就是利用.NET自带的发送邮件和利用jmail组件来发送邮件。 
       .NET自带的邮件发送利用了System.Web.Mail.MailMessage这个类,这是在VS2003的情况下,在VS2005下更多的是利 用System.Net.Mail.MailMessage,下面的例子是在VS2003的情况下写的,请在应用的时候自己替换掉里面的参数。

              string  SendTos = SendTo.Text.Trim();   // 发送人 
              string  CcTos = CcTo.Text.Trim();       // 抄送人 
              string [] Receiver = System.Text.RegularExpressions.Regex.Split(SendTos + CcTos, " , " );   // 总收件人 
              string  FromMail = " [email protected] " ; // 发件人 
              string  Title = " 你好 " ;  // 邮件主题 
              string  Body = " 附件里重要文档,请查收! " ;    // 邮件主体 
              string  ShowName = " ustbwuyi " ; // 显示名字 
 
              if (SendTos != ""   ||  CcTos != "" )
              {
                  // 用户名(取发送邮箱的@前面的部分,即ustbwuyi1 
                  string  MailUserName = FromMail.Substring( 0 ,FromMail.IndexOf( " @ " ));
 
                  // 密码 
                  string  MailPassword = " ustbwuyi " ;
                 System.Web.Mail.MailMessage mailmessage = new  MailMessage();
                 mailmessage.From = FromMail;
                 mailmessage.Subject = Title;
                 mailmessage.Body = Body;
 
                  // 添加附件 
 
                 ArrayList FileNames;
                  // 如果存在附件 
                  if (FileNames.Count >= 1 )
                  {                    
                      // 添加附件 
                          string  Filename;
                          for ( int  k = 0 ;k < FileNames.Count;k ++ )
                          {                            
                             Filename = FileNames[k].ToString();
                             mailmessage.Attachments.Add( new  MailAttachment(Filename));                        
                         }             
                     } 
                 } 
                 mailmessage.Fields.Add( " http://schemas.microsoft.com/cdo/configuration/smtpauthenticate " , 1 );
                 mailmessage.Fields.Add( " http://schemas.microsoft.com/cdo/configuration/sendusername ",MailUserName);
                 mailmessage.Fields.Add( " http://schemas.microsoft.com/cdo/configuration/sendpassword ",MailPassword);                                // 向收件人和抄送人循环发送                   for ( int  j = 0 ;j < Receiver.Length;j ++ )                  {                     mailmessage.To = Receiver[j].ToString();                     System.Web.Mail.SmtpMail.SmtpServer = " smtp.163.com " ;                      try                       {                         System.Web.Mail.SmtpMail.Send(mailmessage);                     }                       catch (Exception ex)                      {                                 Response.Write( " <script language=‘javascript‘>alert(‘邮件发送失败,请您和ustbwuyi联系(QQ:108556024)!‘)</script> " );                     }                  }              }

上面的例子是利用163的SMTP邮件服务器来发送邮件,当然,如果你有自己的邮件服务器更好。

其次,是利用jmail组件来发送,现在jmail组件的版本很多,在这里我个人推荐jmail4.4pro版本,因为如果你 要收邮件的话,必须用pro版本,另外,个人经过测试了其它几个版本,发现只有这个版本不会出现附件丢失的情况,其他几个版本都会出现附件丢失或者损坏的 情况,这个对txt文件来说没有影响,但是对于传送图片或者其他的一些压缩文件,会发现从pop服务器上下过来的附件有一些损坏,从而不能正常打开文件。 下面是jmail发送邮件的代码。

 jmail.MessageClass MyMail  =   new  jmail.MessageClass();
 
              string  SendTos = SendTo.Text.Trim();   // 发送人 
              string  CcTos = CcTo.Text.Trim();       // 抄送人 
              string [] Receiver = System.Text.RegularExpressions.Regex.Split(SendTos + CcTos, " , " );   // 总收件人 
              string  FromMail = " [email protected] " ; // 发件人 
              string  Title = " 你好 " ;  // 邮件主题 
              string  Body = " 附件里是重要文档,请查收! " ;    // 邮件主体 
              string  ShowName = " ustbwuyi " ; // 显示名字
              // 取email的@前面部分为用户名,即ustbwuyi1,当然也可以自己设置. 
              string  MailUserName = FromMail.Substring( 0 ,FromMail.IndexOf( " @ " ));
              string  MailPassword = " ustbwuyi " ;
              if (SendTos != ""   ||  CcTos != "" )
              {
 
                  //  字符集 
                 MyMail.Charset  =   " GB2312 " ;
                  // 附件的编码格式 
                 MyMail.Encoding  =   " BASE64 " ;
                  /// /是否将信头编码成iso-8859-1字符集 
                      MyMail.ISOEncodeHeaders  =   false ;
                  // 发送人邮件地址 
                 MyMail.From  =  FromMail;
                  // 发送人姓名 
                 MyMail.FromName  =  ShowName;
                  //  邮件主题 
                 MyMail.Subject  = Title;
                       // 身份验证的用户名 
                 MyMail.MailServerUserName  =  MailUserName;
                  // 用户密码 
                 MyMail.MailServerPassWord  =  MailPassword;
                       // 邮件内容 
                 MyMail.Body  =  Body;
                 ArrayList FileNames;
                      // 如果存在附件 
                      if (FileNames.Count >= 1 )                      {                          // 添加附件                           string  Filename;                          for ( int  k = 0 ;k < FileNames.Count;k ++ )                          {                             Filename = FileNames[k].ToString();                             MyMail.AddAttachment(Filename, false,HttpUtility.UrlDecode(Filename.Substring(Filename.LastIndexOf( " . " ) + 1 , 3 )));                         }                                  }                    try                   {                      // 循环发送                       for ( int  i = 0 ;i < Receiver.Length;i ++ )                      {                         MyMail.AddRecipient(Receiver[i], "" , "" );                         MyMail.Send( " Mail.rshi.cn " , false );                     }                                                }                   catch (Exception ex)                  {                 Response.Write( " <script language=‘javascript‘>alert(‘邮件发送失败,请您和ustbwuyi联系(QQ:108556024)!‘)</script> " );                  }              }

好了,现在我们来看看接收邮件的问题。一般来说,接收邮件主要分为两部分,一是将接收到的邮件的信息保存到数据库,如邮件的
主题,内容,发送人,发送时间等。其次是对邮件附件的处理,主要将邮件附件从POP服务器上下载下来并保存到数据库,然后将附件
信息保存到数据库,如附件的路径,附件对应的邮件编号等信息。这一点.NET自带的似乎并不太好处理,没有jmail组件处理方便,
当然关于.NET自带的我并没有深入研究,个人经过比较还是推荐jmail,当然前面说过关于jmail几个版本在这方面的差异,所以个人
还是推荐jmail4.4pro版本。下面是收邮件的代码:

      public   void  ReceiveMails( string  Username)
          {
             
             jmail.Message Msg = new  jmail.Message();
             jmail.POP3 jpop  =   new  jmail.POP3();
             jmail.Attachments atts;
             jmail.Attachment att;
             
              // username为用户名,该方法通过用户名获取该用户的pop设置,即用户的POP用户名,密码,POP服务器地址以及端口号这四个参数,这四个参数是连接POP服务器的必用参数. 
                 SqlDataReader dataReader  =   this .ExtGetSetting(Username);
                  if (dataReader.Read())
                  {
                      if (dataReader[ " PopServer " ].ToString() != "" && dataReader[ " PopUsername " ].ToString() != "" )
                      {
                          // 连接POP服务器 
                         jpop.Connect(dataReader[ " PopUsername " ].ToString(),dataReader[ " PopPassword "].ToString(),dataReader[ " PopServer " ].ToString(),Int32.Parse(dataReader[ " PopPort " ].ToString()));
                          // 如果服务器上有邮件 
                          if (jpop.Count >= 1 )
                          {
                           for ( int  i = 1 ;i <= jpop.Count;i ++ )
                              {
                             
                                 Msg  =  jpop.Messages[i];
                                 atts = Msg.Attachments;
 
                               // 取数据库中邮件信息中的最大发送时间,即最近接收到的一封邮件的时间 
                                 Database dbase = new  Database();
                                 DataTable data = dbase.GetDataTable( "select max(MailSendDate) as MailSenderDate from TabMailList where MailTypeFlag=‘1‘ " );
                                 
                               // 对服务器上的邮件的发送时间和数据库最近一封邮件的时间进行比较,如果大那么证明该邮件还未被收取,是一封新邮件,这样避免重复收取邮件入库 
                                  if (Msg.Date > Convert.ToDateTime(data.Rows[ 0 ][ 0 ].ToString()))
 
                                  {
                                      // 将这封新邮件的信息保存到数据库 
                                      this .SaveExtMail(Msg,Username,dataReader[ " Email "].ToString(),jpop.GetMessageUID(i));
                             
                                      // 获取附件上传到服务器并且将信息存入数据库 
                                      if (atts.Count >= 1 )
                                      {
                                          for ( int  k = 0 ;k < atts.Count;k ++ )
                                          {
 
                                             att = atts[k]; // 获得附件 
 
                                              string  attname = att.Name;                                              try                                               {                                                  Random TempNameInt     =   new  Random();                                                   string  NewMailDirName   =  TempNameInt.Next( 100000000 ).ToString();                                                 Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath( " . " )+ " //AttachFiles// " + Username + " // " + NewMailDirName);                                                                   string  mailPath = " //AttachFiles// " + Username + " // " + NewMailDirName + " // "+ attname;                                                              att.SaveToFile(System.Web.HttpContext.Current.Server.MapPath( " . " ) +mailPath);                                                                                                    // 获取该封邮件在数据库的ID,以便和附件信息相对应,取邮件表中的最大ID即可                                                    int  mailID = this .GetMailID();                                                 // 将附件信息存入数据库                                                   this .AttExtSend(mailID,attname,att.Size,mailPath,Msg.From);                                             }                                               catch (Exception ex)                                              {                                                  throw   new  Exception(ex.Message);                                             }                                                                                   }                                      }                                                                          }                                                          }                                                  }                                // 删除服务器上的邮件                          jpop.DeleteMessages();                          // 断开连接                              jpop.Disconnect();                     }                               }          }

至于将邮件信息和附件信息如何存入数据库,就看你自己对表的设计了,我就不多说了,经过上面就可以完全将你POP服务器上的
邮件完全接收到你的本地了。

时间: 2024-11-03 09:44:19

关于.NET邮件的收发问题总结的相关文章

用Delphi实现邮件附件收发功能

很久没有发过博客了,不知道为什么没这个思想来博客上转转.今天把这个前段时间做的试验发上来. 邮件与我们的工作生活息息相关,很多的信息传递都是通过邮件完成的.所以邮件对我们来说很重要,虽然可以每次登录邮箱进行操作,但邮件资料总是要通过网站登录,而且还要一个一个自己下载,这样操作在网速较慢时比较费力.现在有一些很邮件管理工具,如FOXMAIL等,这些工具功能相当完善了,但功能一多也就天花乱缀了,使用起来就不怎么爽心悦目了,么那如果我们能自己打造一个适合自己需要的邮件管理工具是一个挺不错的选择. 经过

命令行中邮件的收发

1.telnet smtp.aliyun.com 25//cmd命令下:使用Telnet工具连上某个邮箱服务的smtp服务器,如阿里云2.helo hi//和smtp服务器打招呼,hi可以随时填其他英文字符3.auth login//开始身份认证4.邮箱的base64编码字符串,发送发的邮箱用echo base64_encode("[email protected]").'<br/>'来获 得;//bWZoZ2psMDcyMTAwOEBhbGl5dW4uY29t5.邮箱密码

上网行为管理如何禁止收发邮件

这里的邮件是指客户端邮件,即用foxmail,outlook thunderbird等这些客户端方式收发邮件.邮件目前还是信息传递的主流工具,企业信息安全管理可以在邮件的内容和行为加强安全意识.这次介绍的是禁止如何禁止这些邮件的收发.第一步,找到协议界面第二步,根据邮件协议做禁止,除了企业有特殊邮件服务器,一般是全部禁止,我们只是将邮件协议更加细化.

Windows Server 2003搭建邮件服务器

由于Windows Server 2003默认是没有安装我们搭建邮件服务器所需要的POP3和SMTP服务的,因此需要我们自己来安装.方法如下: 1. 将Windows Server 2003的系统光盘放入光驱,或者将镜像文件挂载到虚拟光驱.在控制面板中点击“添加或删除程序”,在“添加或删除程序”对话框中,点击“添加/删除Windows组件”.Hn 2. 在“Windows组件向导”中,需要进行如下操作: ① 安装POP3服务. 选中“电子邮件服务”,双击打开,会看到它包括“POP3服务”和“PO

Linux6.5部署Postfix邮件服务器

2-12-部署Postfix邮件服务器实现邮件的收发功能 试验环境: 服务端:xuegod63.cn       IP:192.168.1.63 部署Postfix+Dovecot Postfix:提供邮件发送功能,使用的协议:SMTP,端口:25 Dovecot:提供邮件接收功能,使用的协议:POP3.IMAP,端口:110,143 邮件通信协议 1.SMTP(SimpleMail Transfer Protocol,简单邮件传输协议):主要用于发送和传输邮件.SMTP协议使用的TCP端口为2

第四周作业:java实现邮件发送

如何实现java发送邮件功能 1.首先下载本地发送邮件的软件,以便与测试 1).先安装mailserver后,添加两个本地用户,如下 2).在安装foxmail后,再与前面一样添加两个用户,且用户名要一样,使用foxmail方便邮件的收发.注意:必须在mailserver添加用户后才能进行发送,且用户名要一致.同时如下: 配置时要填入为本地 2.导入相应的包 3.使用java去实现发收邮件 代码如下: import java.util.Properties; import javax.mail.

Linux的postfix邮件服务

一.postfix邮件服务 postfix提供smtp协议用来投递邮件默认端口25/var/log/maillog    服务日志mail [email protected]Subject: hellohello world .                           用"."来结束录入内容并发送mailq                  查看邮件队列postqueue -f      重新处理邮件队列 默认情况下邮件端口只在127.0.0.1上开启 二.环境配置 1.设

exchange系列(三)exchange邮件服务器的邮件传输管理

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 前言:我们前面安装好了exchange2010,但是只能在公司内部发送邮件,如果要给qq邮箱.新浪邮箱,或者其他公司发送电子邮件就要经过internet.但并不是有网就可以,必须要做一系列的设置才能发送internet邮件.主要配置有以下几点: 1)发送连接器和接收连接器: 2)新建权威域: 3)购买域名并新建mx邮件交换记录,实验环境还

邮件服务器 Exchange2010视频教程(精品珍藏版)

邮件服务器Exchange2010视频教程(精品珍藏版,上部分共18章) 原创作者:余天明  技术QQ:1994068583  咨询QQ:406542173 邮件服务器Exchange2010视频教程(精品珍藏版上部分共18章) 第01章:为什么要学习Exchange(共3讲) 第1讲:为什么要学习Exchange 第2讲:怎样学Exchange 第3讲:邮件收发的过程与原理 第02章:搭建Exchange服务器(共9讲) 第1讲:搭建域服务器与准备工作 第2讲:邮件服务器加入到域 第3讲:在m