自定义的email发送类

using System; 
using System.Text; 
using System.IO; 
using System.Net; 
using System.Net.Sockets; 
using System.Collections; 

namespace lion_office.Data.Library.MailClass 

/*  
Create By lion  
2002-11-20 01:44  
Copyright (C) 2001,2002 www.LionSky.Net. All rights reserved. 
Web:  http://www.Lionsky.net;; 
Email: lion-a@sohu.com 
Support .Net Framework Beta 2  
*/  
   public class ESmtpMail 
   { 
      private string enter="/r/n"; 
      /// <summary> 
      /// 设定语言代码,默认设定为GB2312,如不需要可设置为"" 
      /// </summary> 
      public string Charset="GB2312"; 
      /// <summary> 
      /// 发件人地址 
      /// </summary> 
      public string From=""; 
      /// <summary> 
      /// 发件人姓名 
      /// </summary> 
      public string FromName=""; 
      /// <summary> 
      /// 回复邮件地址 
      /// </summary> 
      //public string ReplyTo=""; 
      /// <summary> 
      /// 收件人姓名 
      /// </summary>    
      public string RecipientName=""; 
      /// <summary> 
      /// 收件人列表 
      /// </summary> 
      private Hashtable Recipient=new Hashtable(); 
      /// <summary> 
      /// 邮件服务器域名 
      /// </summary>    
      private string mailserver=""; 
      /// <summary> 
      /// 邮件服务器端口号 
      /// </summary>    
      private int mailserverport=25; 
      /// <summary> 
      /// SMTP认证时使用的用户名 
      /// </summary> 
      private string username=""; 
      /// <summary> 
      /// SMTP认证时使用的密码 
      /// </summary> 
      private string password=""; 
      /// <summary> 
      /// 是否需要SMTP验证 
      /// </summary>       
      private bool ESmtp=false; 
      /// <summary> 
      /// 是否Html邮件 
      /// </summary>       
      public bool Html=false; 
      /// <summary> 
      /// 邮件附件列表 
      /// </summary> 
      private System.Collections.ArrayList Attachments; 
      /// <summary> 
      /// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5" 
      /// </summary> 
      private string priority="Normal"; 
      /// <summary> 
      /// 邮件主题 
      /// </summary>       
      public string Subject=""; 
      /// <summary> 
      /// 邮件正文 
      /// </summary>       
      public string Body=""; 
      /// <summary> 
      /// 收件人数量 
      /// </summary> 
      private int RecipientNum=0; 
      /// <summary> 
      /// 最多收件人数量 
      /// </summary> 
      private int recipientmaxnum=1; 
      /// <summary> 
      /// 密件收件人数量 
      /// </summary> 
      //private int RecipientBCCNum=0; 
      /// <summary> 
      /// 错误消息反馈 
      /// </summary> 
      private string errmsg; 
      /// <summary> 
      /// TcpClient对象,用于连接服务器 
      /// </summary>    
      private TcpClient tc; 
      /// <summary> 
      /// NetworkStream对象 
      /// </summary>    
      private NetworkStream ns; 
      /// <summary> 
      /// SMTP错误代码哈希表 
      /// </summary> 
      private Hashtable ErrCodeHT = new Hashtable(); 
      /// <summary> 
      /// SMTP正确代码哈希表 
      /// </summary> 
      private Hashtable RightCodeHT = new Hashtable(); 
      public ESmtpMail() 
      { 
         Attachments = new System.Collections.ArrayList(); 
      }       
      /// <summary> 
      /// 邮件服务器域名和验证信息 
      /// 形如:"user:paswww.server.com:25",也可省略次要信息。如"user:paswww.server.com"www.server.com" 
      /// </summary>    
      public string MailDomain 
      { 
         set 
         { 
            string maidomain=value.Trim(); 
            int tempint; 

            if(maidomain!="") 
            { 
               tempint=maidomain.IndexOf("@"); 
               if(tempint!=-1) 
               { 
                  string str=maidomain.Substring(0,tempint); 
                  MailServerUserName=str.Substring(0,str.IndexOf(":")); 
                  MailServerPassWord=str.Substring(str.IndexOf(":")+1,str.Length-str.IndexOf(":")-1); 
                  maidomain=maidomain.Substring(tempint+1,maidomain.Length-tempint-1); 
               } 

               tempint=maidomain.IndexOf(":"); 
               if(tempint!=-1) 
               { 
                  mailserver=maidomain.Substring(0,tempint); 
                  mailserverport=System.Convert.ToInt32(maidomain.Substring(tempint+1,maidomain.Length-tempint-1)); 
               } 
               else 
               { 
                  mailserver=maidomain; 

               } 

                
            } 

         } 
      } 

 

      /// <summary> 
      /// 邮件服务器端口号 
      /// </summary>    
      public int MailDomainPort 
      { 
         set 
         { 
            mailserverport=value; 
         } 
      } 

 

      /// <summary> 
      /// SMTP认证时使用的用户名 
      /// </summary> 
      public string MailServerUserName 
      { 
         set 
         { 
            if(value.Trim()!="") 
            { 
               username=value.Trim(); 
               ESmtp=true; 
            } 
            else 
            { 
               username=""; 
               ESmtp=false; 
            } 
         } 
      } 

      /// <summary> 
      /// SMTP认证时使用的密码 
      /// </summary> 
      public string MailServerPassWord 
      { 
         set 
         { 
            password=value; 
         } 
      }    

      /// <summary> 
      /// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5" 
      /// </summary> 
      public string Priority 
      { 
         set 
         { 
            switch(value.ToLower()) 
            { 
               case "high": 
                  priority="High"; 
                  break; 

               case "1": 
                  priority="High"; 
                  break; 

               case "normal": 
                  priority="Normal"; 
                  break; 

               case "3": 
                  priority="Normal"; 
                  break; 

               case "low": 
                  priority="Low"; 
                  break; 

               case "5": 
                  priority="Low"; 
                  break; 

               default: 
                  priority="Normal"; 
                  break; 
            } 
         } 
      } 


      /// <summary> 
      /// 错误消息反馈 
      /// </summary>       
      public string ErrorMessage 
      { 
         get 
         { 
            return errmsg; 
         } 
      } 

 

      /// <summary> 
      /// 服务器交互记录 
      /// </summary> 
      private string logs=""; 

      /// <summary> 
      /// 服务器交互记录,如发现本组件不能使用的SMTP服务器,请将出错时的Logs发给我(lion-a@sohu.com),我将尽快查明原因。 
      /// </summary> 
      public string Logs 
      { 
         get 
         { 
            return logs; 
         } 
      } 
       

 

      /// <summary> 
      /// SMTP回应代码哈希表 
      /// </summary> 
      private void SMTPCodeAdd() 
      { 
         ErrCodeHT.Add("500","邮箱地址错误"); 
         ErrCodeHT.Add("501","参数格式错误"); 
         ErrCodeHT.Add("502","命令不可实现"); 
         ErrCodeHT.Add("503","服务器需要SMTP验证"); 
         ErrCodeHT.Add("504","命令参数不可实现"); 
         ErrCodeHT.Add("421","服务未就绪,关闭传输信道"); 
         ErrCodeHT.Add("450","要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)"); 
         ErrCodeHT.Add("550","要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)"); 
         ErrCodeHT.Add("451","放弃要求的操作;处理过程中出错"); 
         ErrCodeHT.Add("551","用户非本地,请尝试<forward-path>"); 
         ErrCodeHT.Add("452","系统存储不足,要求的操作未执行"); 
         ErrCodeHT.Add("552","过量的存储分配,要求的操作未执行"); 
         ErrCodeHT.Add("553","邮箱名不可用,要求的操作未执行(例如邮箱格式错误)"); 
         ErrCodeHT.Add("432","需要一个密码转换"); 
         ErrCodeHT.Add("534","认证机制过于简单"); 
         ErrCodeHT.Add("538","当前请求的认证机制需要加密"); 
         ErrCodeHT.Add("454","临时认证失败"); 
         ErrCodeHT.Add("530","需要认证"); 

         RightCodeHT.Add("220","服务就绪"); 
         RightCodeHT.Add("250","要求的邮件操作完成"); 
         RightCodeHT.Add("251","用户非本地,将转发向<forward-path>"); 
         RightCodeHT.Add("354","开始邮件输入,以<enter>.<enter>结束"); 
         RightCodeHT.Add("221","服务关闭传输信道"); 
         RightCodeHT.Add("334","服务器响应验证Base64字符串"); 
         RightCodeHT.Add("235","验证成功"); 
      } 


      /// <summary> 
      /// 将字符串编码为Base64字符串 
      /// </summary> 
      /// <param name="estr">要编码的字符串</param> 
      private string Base64Encode(string str) 
      { 
         byte[] barray; 
         barray=Encoding.Default.GetBytes(str); 
         return Convert.ToBase64String(barray); 
      } 


      /// <summary> 
      /// 将Base64字符串解码为普通字符串 
      /// </summary> 
      /// <param name="dstr">要解码的字符串</param> 
      private string Base64Decode(string str) 
      { 
         byte[] barray; 
         barray=Convert.FromBase64String(str); 
         return Encoding.Default.GetString(barray); 
      } 

/// <summary> 
      /// 得到上传附件的文件流 
      /// </summary> 
      /// <param name="FilePath">附件的绝对路径</param> 
      private string GetStream(string FilePath) 
      { 
         //建立文件流对象 
         System.IO.FileStream FileStr=new System.IO.FileStream(FilePath,System.IO.FileMode.Open); 
         byte[] by=new byte[System.Convert.ToInt32(FileStr.Length)]; 
         FileStr.Read(by,0,by.Length); 
         FileStr.Close(); 
         return(System.Convert.ToBase64String(by)); 
      } 


      /// <summary> 
      /// 添加邮件附件 
      /// </summary> 
      /// <param name="path">附件绝对路径</param> 
      public void AddAttachment(string path) 
      { 
         Attachments.Add(path); 
      } 
       
       

      /// <summary> 
      /// 添加一个收件人 
      /// </summary>    
      /// <param name="str">收件人地址</param> 
      public bool AddRecipient(string str) 
      { 
         str=str.Trim(); 
         if(str==null||str==""||str.IndexOf("@")==-1) 
            return true; 
         if(RecipientNum<recipientmaxnum) 
         { 
            Recipient.Add(RecipientNum,str); 
            RecipientNum++;             
            return true; 
         } 
         else 
         { 
            errmsg+="收件人过多"; 
            return false; 
         } 
      } 


      /// <summary> 
      /// 最多收件人数量 
      /// </summary> 
      public int RecipientMaxNum 
      { 
         set 
         { 
            recipientmaxnum = value; 
         } 
      } 


      /// <summary> 
      /// 添加一组收件人(不超过recipientmaxnum个),参数为字符串数组 
      /// </summary> 
      /// <param name="str">保存有收件人地址的字符串数组(不超过recipientmaxnum个)</param>    
      public bool AddRecipient(string[] str) 
      { 
         for(int i=0;i<str.Length;i++) 
         { 
            if(!AddRecipient(str[i])) 
            { 
               return false; 
            } 
         } 
         return true; 
      } 

      /// <summary> 
      /// 发送SMTP命令 
      /// </summary>    
      private bool SendCommand(string str) 
      { 
         byte[]  WriteBuffer; 
         if(str==null||str.Trim()=="") 
         { 
            return true; 
         } 
         logs+=str; 
         WriteBuffer = Encoding.Default.GetBytes(str); 
         try 
         { 
            ns.Write(WriteBuffer,0,WriteBuffer.Length); 
         } 
         catch 
         { 
            errmsg="网络连接错误"; 
            return false; 
         } 
         return true; 
      } 

      /// <summary> 
      /// 接收SMTP服务器回应 
      /// </summary> 
      private string RecvResponse() 
      { 
         int StreamSize; 
         string Returnvalue = ""; 
         byte[]  ReadBuffer = new byte[1024] ; 
         try 
         { 
            StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length); 
         } 
         catch 
         { 
            errmsg="网络连接错误"; 
            return "false"; 
         } 

         if (StreamSize==0) 
         { 
            return Returnvalue ; 
         } 
         else 
         { 
            Returnvalue = Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize); 
            logs+=Returnvalue; 
            return  Returnvalue; 
         } 
      } 


      /// <summary> 
      /// 与服务器交互,发送一条命令并接收回应。 
      /// </summary> 
      /// <param name="Command">一个要发送的命令</param> 
      /// <param name="errstr">如果错误,要反馈的信息</param> 
      private bool Dialog(string str,string errstr) 
      { 
         if(str==null||str.Trim()=="") 
         { 
            return true; 
         } 
         if(SendCommand(str)) 
         { 
            string RR=RecvResponse(); 
            if(RR=="false") 
            { 
               return false; 
            } 
            string RRCode=RR.Substring(0,3); 
            if(RightCodeHT[RRCode]!=null) 
            { 
               return true; 
            } 
            else 
            { 
               if(ErrCodeHT[RRCode]!=null) 
               { 
                  errmsg+=(RRCode+ErrCodeHT[RRCode].ToString()); 
                  errmsg+=enter; 
               } 
               else 
               { 
                  errmsg+=RR; 
               } 
               errmsg+=errstr; 
               return false; 
            } 
         } 
         else 
         { 
            return false; 
         } 

      } 


      /// <summary> 
      /// 与服务器交互,发送一组命令并接收回应。 
      /// </summary> 

      private bool Dialog(string[] str,string errstr) 
      { 
         for(int i=0;i<str.Length;i++) 
         { 
            if(!Dialog(str[i],"")) 
            { 
               errmsg+=enter; 
               errmsg+=errstr; 
               return false; 
            } 
         } 

         return true; 
      } 

 

      private bool SendEmail() 
      { 
         //连接网络 
         try 
         { 
            tc=new TcpClient(mailserver,mailserverport); 
         } 
         catch(Exception e) 
         { 
            errmsg=e.ToString(); 
            return false; 
         } 

         ns = tc.GetStream(); 
         SMTPCodeAdd(); 

         //验证网络连接是否正确 
         if(RightCodeHT[RecvResponse().Substring(0,3)]==null) 
         { 
            errmsg="网络连接失败"; 
            return false; 
         } 


         string[] SendBuffer; 
         string SendBufferstr; 

         //进行SMTP验证 
         if(ESmtp) 
         { 
            SendBuffer=new String[4]; 
            SendBuffer[0]="EHLO " + mailserver + enter; 
            SendBuffer[1]="AUTH LOGIN" + enter; 
            SendBuffer[2]=Base64Encode(username) + enter; 
            SendBuffer[3]=Base64Encode(password) + enter; 
            if(!Dialog(SendBuffer,"SMTP服务器验证失败,请核对用户名和密码。")) 
               return false; 
         } 
         else 
         { 
            SendBufferstr="HELO " + mailserver + enter; 
            if(!Dialog(SendBufferstr,"")) 
               return false; 
         } 

         // 
         SendBufferstr="MAIL FROM:<" + From + ">" + enter; 
         if(!Dialog(SendBufferstr,"发件人地址错误,或不能为空")) 
            return false; 

         // 
         SendBuffer=new string[recipientmaxnum]; 
         for(int i=0;i<Recipient.Count;i++) 
         { 

            SendBuffer[i]="RCPT TO:<" + Recipient[i].ToString() +">" + enter; 

         } 
         if(!Dialog(SendBuffer,"收件人地址有误")) 
            return false; 

         SendBufferstr="DATA" + enter; 
         if(!Dialog(SendBufferstr,"")) 
            return false; 

         SendBufferstr="From:" + FromName + "<" + From +">" +enter; 

         SendBufferstr += "To:=¡"+Charset.ToUpper()+"¡B¡"+Base64Encode(RecipientName)+"¡="+"<"+Recipient[0]+">"+enter; 
         SendBufferstr+="CC:"; 
         for(int i=0;i<Recipient.Count;i++) 
         { 
            SendBufferstr+=Recipient[i].ToString() + "<" + Recipient[i].ToString() +">,"; 
         } 
         SendBufferstr+=enter; 


         if(Charset=="") 
         { 
            SendBufferstr+="Subject:" + Subject + enter; 
         } 
         else 
         { 
            SendBufferstr+="Subject:" + "=¡" + Charset.ToUpper() + "¡B¡" + Base64Encode(Subject) +"¡=" +enter; 
         } 

         SendBufferstr+="X-Priority:" + priority + enter; 
         SendBufferstr+="X-MSMail-Priority:" + priority + enter; 
         SendBufferstr+="Importance:" + priority + enter; 
         SendBufferstr+="X-Mailer: Huolx.Pubclass" + enter; 
         SendBufferstr+="MIME-Version: 1.0" + enter; 

         SendBufferstr += "Content-Type: multipart/mixed;"+enter;//内容格式和分隔符 
         SendBufferstr += "   boundary=/"----=_NextPart_000_00D6_01C29593.AAB31770/""+enter; 
         SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter; 

         if(Html) 
         { 
            SendBufferstr+="Content-Type: text/html;" + enter; 
         } 
         else 
         { 
            SendBufferstr+="Content-Type: text/plain;" + enter; 
         } 

         if(Charset=="") 
         { 
            SendBufferstr+="   charset=/"iso-8859-1/"" + enter; 
         } 
         else 
         { 
            SendBufferstr+="   charset=/"" + Charset.ToLower() + "/"" + enter; 
         } 
         //SendBufferstr += "Content-Transfer-Encoding: base64"+enter; 

         SendBufferstr+="Content-Transfer-Encoding: base64" + enter + enter; 

         SendBufferstr+= Base64Encode(Body) + enter; 
         if(Attachments.Count!=0) 
         { 
            foreach(string filepath in Attachments) 
            { 
                
               SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter; 
               SendBufferstr += "Content-Type: application/octet-stream"+enter; 
               SendBufferstr += "   name=/"=¡"+Charset.ToUpper()+"¡B¡"+Base64Encode(filepath.Substring(filepath.LastIndexOf("//")+1))+"¡=/""+enter; 
               SendBufferstr += "Content-Transfer-Encoding: base64"+enter; 
               SendBufferstr += "Content-Disposition: attachment;"+enter; 
               SendBufferstr += "   filename=/"=¡"+Charset.ToUpper()+"¡B¡"+Base64Encode(filepath.Substring(filepath.LastIndexOf("//")+1))+"¡=/""+enter+enter; 
               SendBufferstr += GetStream(filepath)+enter+enter; 
            } 
         } 
         SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770--"+enter+enter; 
          
          
         SendBufferstr += enter + "." + enter; 

         if(!Dialog(SendBufferstr,"错误信件信息")) 
            return false; 


         SendBufferstr="QUIT" + enter; 
         if(!Dialog(SendBufferstr,"断开连接时错误")) 
            return false; 


         ns.Close(); 
         tc.Close(); 
         return true; 
      } 


      /// <summary> 
      /// 发送邮件方法,所有参数均通过属性设置。 
      /// </summary> 
      public bool Send() 
      { 
         if(Recipient.Count==0) 
         { 
            errmsg="收件人列表不能为空"; 
            return false; 
         } 

         if(mailserver.Trim()=="") 
         { 
            errmsg="必须指定SMTP服务器"; 
            return false; 
         } 

         return SendEmail(); 
          
      } 


      /// <summary> 
      /// 发送邮件方法 
      /// </summary> 
      /// <param name="smtpserver">smtp服务器信息,如"username:passwordwww.smtpserver.com:25",也可去掉部分次要信息,如www.smtpserver.com"</param> 
      public bool Send(string smtpserver) 
      { 
          
         MailDomain=smtpserver; 
         return Send(); 
      } 


      /// <summary> 
      /// 发送邮件方法 
      /// </summary> 
      /// <param name="smtpserver">smtp服务器信息,如"username:passwordwww.smtpserver.com:25",也可去掉部分次要信息,如www.smtpserver.com"</param> 
      /// <param name="from">发件人mail地址</param> 
      /// <param name="fromname">发件人姓名</param> 
      /// <param name="to">收件人地址</param> 
      /// <param name="toname">收件人姓名</param> 
      /// <param name="html">是否HTML邮件</param> 
      /// <param name="subject">邮件主题</param> 
      /// <param name="body">邮件正文</param> 
      public bool Send(string smtpserver,string from,string fromname,string to,string toname,bool html,string subject,string body) 
      { 
         MailDomain=smtpserver; 
         From=from; 
         FromName=fromname; 
         AddRecipient(to); 
         RecipientName=toname; 
         Html=html; 
         Subject=subject; 
         Body=body; 
         return Send(); 
      } 
       
       
   } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值