EMAIL发送系统(C#+基于SMTP认证) 2.0

原创]email发送系统(c#+基于smtp认证)
http://www.lionsky.net/MyWebsite/article/list.aspx?id=430

 

的改版
        在为公司写通知服务时,从网上找到了以上地址,非常感谢原作者创造性的劳动。改写的目的是为了适应作为服务运行的要求:
1、适应多线程的要求,发送邮件服务可在后台运行,将与SMTP服务器的连接视为独占资源。
2、适应稳定性的要求,不再以简单地抛出异常来处理错误,在出现异常后等待一定时间间隔后重试,重试一段时间间隔后若还时发不出去,则认为是SMTP出错,返回发送邮件不成功的标识。
3、精简属性、方法,与邮件相关的信息不再作为属性,而是作为send的参数传入;只公布了一个无重载的send方法。以此类为基类,另写通知服务要求的接口方法。
以下是改写后的代码:

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


namespace  Deep.SendEmail
{
 
#region  AspNetPager Server Control

 
///   <summary>
 
///  邮件可以通过 Microsoft Windows 2000 中内置的 SMTP 邮件服务或任意 SMTP 服务器来传送
 
///   </summary>
  public   class  SmtpMail
 {

  
private   const   string   ENTER = " \r\n " ;

  
///   <summary>
  
///  设定语言代码,默认设定为GB2312,如不需要可设置为""
  
///   </summary>
   private   string  m_charset = " GB2312 " ;
  
  
///   <summary>
  
///  服务器交互记录
  
///   </summary>
   private  StringBuilder m_logs  =   new  StringBuilder();

  
private   string  m_ErrCode;

  
///   <summary>
  
///  SMTP错误代码哈希表
  
///   </summary>
   private  Hashtable m_ErrCodeHT  =   new  Hashtable();

  
///   <summary>
  
///  SMTP正确代码哈希表
  
///   </summary>
   private  Hashtable m_RightCodeHT  =   new  Hashtable();

  
  
///   <summary>
  
///  最多收件人数量
  
///   </summary>
   private   int  m_recipientMaxnum  =   2 ;

  
///   <summary>
  
///  重复时间,以秒为单位
  
///   </summary>
   private   int  m_RepeatTime  =   120 ;

  
///   <summary>
  
///  服务器出错或拒绝后的等待时间,以毫秒为单位
  
///   </summary>
   private   int  m_WaitTime  =   20000 ;

  
///   <summary>
  
///  初始化  <see cref="Lion.Web.Mail.SmtpMail"/>  类的新实例
  
///   </summary>
   public  SmtpMail()
  {
   SMTPCodeAdd();
  }

  
#region  Properties 定义属性
  
///   <summary>
  
///  服务器交互记录,如发现本组件不能使用的SMTP服务器,请将出错时的Logs发给我([email protected]),我将尽快查明原因。
  
///   </summary>
   public   string  Logs
  {
   
get
   {
    
return  m_logs.ToString();
   }
  }

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

  
///   <summary>
  
///  设定语言代码,默认设定为GB2312,如不需要可设置为""
  
///   </summary>
   public   string  Charset
  {
   
get
   {
    
return   this .m_charset;
   }
   
set
   {
    
this .m_charset  =  value;
   }
  }

  
  
///   <summary>
  
///  重复时间,以秒为单位
  
///   </summary>
   public   int  RepeatTime
  {
   
get  { return  m_RepeatTime;}
   
set  {m_RepeatTime  =  value;}

  }

  
///   <summary>
  
///  服务器出错或拒绝后的等待时间,以毫秒为单位
  
///   </summary>
   public   int  WaitTime
  {
   
get  { return  m_WaitTime;}
   
set  {m_WaitTime  =  value  >   10000 ? value: 10000 ;}
  }

  
#endregion

  
#region  Methods 定义方法


  
///   <summary>
  
///  邮件服务器域名和验证信息
  
///  形如:"user:[email protected]:25",也可省略次要信息。如"user:[email protected]"或"www.server.com"
  
///   </summary>
  
///   <param name="mailDomain"> 输入用户名、密码、邮件服务器域名、端口号 </param>
  
///   <param name="mailServer"> 返回邮件服务器域名 </param>
  
///   <param name="mailServerUserName"> 返回用户名 </param>
  
///   <param name="password"> 返回密码 </param>
  
///   <param name="mailserverport"> 返回端口号 </param>
  
///   <param name="needSmtp"> 返回是否需要SMTP验证 </param>
  
///   <returns></returns>
   private   bool  SetMailDomain( string  mailDomain, out   string  mailServer, out   string  mailServerUserName, out   string  password,
   
out   int  mailserverport, out   bool  needSmtp)
  {
   
bool  isRight  =   false ;
   
// 为输出变量赋初值
   mailServer  =   string .Empty;
   mailServerUserName 
=  String.Empty;
   password 
=  String.Empty;
   mailserverport 
=   25 ;
   needSmtp 
=   false ;

   mailserver 
=  mailDomain.Trim();
   
int  tempint;
   
if ( mailServer  !=   ""  )
   {
    tempint 
=  mailServer.IndexOf( " @ " );
    isRight 
=   true ;
    
if (tempint !=- 1 )
    {
     
string  str  =  mailServer.Substring( 0 ,tempint);
     mailServerUserName 
=  str.Substring( 0 ,str.IndexOf( " : " ));
     password 
=  str.Substring(str.IndexOf( " : " ) + 1 ,str.Length - str.IndexOf( " : " ) - 1 );
     needSmtp 
=   ! (password == string .Empty);
     mailServer 
=  mailDomain.Substring(tempint + 1 ,mailDomain.Length - tempint - 1 );
    }

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

   
return  isRight;
  }


  
///   <summary>
  
///  添加邮件附件
  
///   </summary>
  
///   <param name="filePath"> 附件绝对路径 </param>
   private   IList AddAttachment( params   string [] filePath)
  {
   
if (filePath  ==   null   ||  filePath.Length  ==   0 )
   {
    
return   null ;
   }
   IList m_Attachments 
=   new  System.Collections.ArrayList(); //  邮件附件列表
    for ( int  i = 0 ;i < filePath.Length;i ++ )
   {
    
if (File.Exists(filePath[i]))
    {
     m_Attachments.Add(filePath[i]);
    }
    
else
    {
     m_logs.Append(
" 错误:没找到文件名为 " + filePath[i] + " 的附件文件! " + ENTER);
    }
   }
   
return  m_Attachments;
  }
  
  
///   <summary>
  
///  添加一组收件人(不超过m_recipientMaxnum个),参数为字符串数组
  
///   </summary>
  
///   <param name="recipients"> 保存有收件人地址的字符串数组(不超过m_recipientMaxnum个) </param>  
   private  Hashtable AddRecipient( params   string [] recipients)
  {
   
if (recipients == null   ||  recipients.Length  ==   0 )
   {
    
return   null ;
   }
   Hashtable recipientList
= new  Hashtable(); //  收件人列表

   
for ( int  i = 0 ;i < recipients.Length;i ++ )
   {
    
string  recipient  =  recipients[i].Trim();
    
if (recipient  != String.Empty  &&  recipient.IndexOf( " @ " !=   - 1 )
    {
     recipientList.Add(recipientList.Count,recipients[i]);
    }
   }
   
return  recipientList;
  }

  
///   <summary>
  
///  发送邮件方法
  
///   </summary>
  
///   <param name="smtpServer"> smtp服务器信息,如"username:[email protected]: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>
  
///    <param name="filePath"> 邮件附件列表 </param>
   public   bool  Send( string  smtpServer, string  from, string  fromName, string [] recipientADD, string  recipientName, bool  isHtml, string  subject,Priority priority,   string  body, string [] filePath)
  {
   
// 如果收件人多于服务器可同时发送的最大值,则分多次发送
    if (recipientADD.Length  >  RecipientMaxNum)
   {
    
string [] recipientADD1   =   new   string [RecipientMaxNum];
    
string [] recipientADD2   =   new   string [recipientADD.Length  -  RecipientMaxNum];
    
for ( int  i  =   0 ;i  <  recipientADD.Length; i ++ )
    {
     
if (i  <  RecipientMaxNum)
     {
      recipientADD1[i] 
=  recipientADD[i];
     }
     
else
     {
      recipientADD2[i 
-  RecipientMaxNum]  =  recipientADD[i];
     }
    }
    
return  Send(smtpServer,from,fromName,recipientADD1,recipientName,isHtml,subject,priority,  body,filePath)
     
&&
     Send(smtpServer,from,fromName,recipientADD2,recipientName,isHtml,subject,priority,  body,filePath);
   }

   
if (m_logs.length  >   2048 )
   {
    m_logs.Remove(
0 ,m_logs.Length);
   }

   
string  mailServer = "" ; //  邮件服务器域名
    int  mailserverport = 25 ; //  邮件服务器端口号
    string  userName = "" ; //  SMTP认证时使用的用户名
    string  password = "" ; //  SMTP认证时使用的密码
    bool  needSmtp = false ; //  是否需要SMTP验证
   SetMailDomain(smtpServer, out  mailServer, out  userName, out  password,
    
out  mailserverport, out  needSmtp);
   
if (mailServer.Trim() == "" )
   {
    m_logs.Append(
" 必须指定SMTP服务器 " + ENTER);
    
return   false ;
   }
   IList attachments 
=  AddAttachment(filePath); //  邮件附件列表
   Hashtable recipients  =  AddRecipient(recipientADD); //  收件人列表
    if (recipients  ==   null   ||  recipients.Count  ==   0  )
   {
    m_logs.Append(
" 必须指定收件人 " + ENTER);
    
return   false ;
   }
   
if (recipients.Count  >  RecipientMaxNum)
   {
    m_logs.Append(
" 一次发送的收件人太多 " + ENTER);
    
return   false ;
   }
   
bool  isSuccessful  =   false ;
   
lock ( this )
   {
    TcpClient tcpClientObject 
=   null ; //  TcpClient对象,用于连接服务器
    NetworkStream networkStreamObject  =   null ; //  NetworkStream对象
    DateTime dateTimeBegin  =  DateTime.Now;
    
int  useTime  =   0 ;
    
while ( !  ( useTime  >  RepeatTime  ||  isSuccessful))
    {
     
try
     {
      tcpClientObject
= new  TcpClient(mailServer,mailserverport);
      networkStreamObject 
=  tcpClientObject.GetStream();
      isSuccessful 
= SendEmail(networkStreamObject,needSmtp,mailServer,userName,password,recipients,from,
       fromName,recipientName,subject,priority.ToString(),attachments, isHtml, body);
     }
     
catch (Exception e)
     {
      m_logs.Append(
" 错误: " + e.Message + ENTER);
     }
     
finally
     {
      
if (networkStreamObject != null )networkStreamObject.Close();
      
if (tcpClientObject != null )tcpClientObject.Close();
      
if ( ! isSuccessful)
      {
       
string  n  =  Thread.CurrentThread.Name;
       Thread.Sleep(WaitTime);
      }
      useTime 
=  ((TimeSpan)(DateTime.Now  -  dateTimeBegin)).Seconds;
     }
    }
   }
   
return  isSuccessful;
  }
 

  
#endregion

  
#region  Private Helper Functions


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

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


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


  
///   <summary>
  
///  将Base64字符串解码为普通字符串
  
///   </summary>
  
///   <param name="str"> 要解码的字符串 </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)
  {
   
byte [] by  =   null ;
   System.IO.FileStream FileStr 
=   null ;
   
string  streamString  =   "" ;
   
try
   {
    
// 建立文件流对象
    FileStr = new  System.IO.FileStream(filePath,System.IO.FileMode.Open);
    by
= new   byte [System.Convert.ToInt32(FileStr.Length)];
    FileStr.Read(by,
0 ,by.Length);
    streamString 
=  System.Convert.ToBase64String(by);
   }
   
catch (Exception ex)
   {
    
// 写错误日志
    m_logs.Append( " 错误: " + ex.Message + ENTER);
   }
   
finally
   {
    
if (FileStr  !=   null )
    {
     FileStr.Close();
    }
   }

   
return  streamString;
  }

  
///   <summary>
  
///  发送SMTP命令
  
///   </summary>  
   private   bool  SendCommand( string  str,NetworkStream _NetworkStreamObject)
  {
   
byte []  WriteBuffer;
   
if (str == null || str.Trim() == String.Empty)
   {
    
return   true ;
   }
   m_logs.Append(str
+ ENTER);
   WriteBuffer 
=  Encoding.Default.GetBytes(str);
   
try
   {
    _NetworkStreamObject.Write(WriteBuffer,
0 ,WriteBuffer.Length);
   }
   
catch (Exception ex)
   {
    
// 写日志
    m_logs.Append( " 错误: " + ex.Message + ENTER);
    
return   false ;
   }
   
return   true ;
  }

  
///   <summary>
  
///  接收SMTP服务器回应
  
///   </summary>
   private   string  RecvResponse(NetworkStream _NetworkStreamObject)
  {
   
int  StreamSize  =   0 ;
   
string  ReturnValue  =  String.Empty;
   
byte []  ReadBuffer  =   new   byte [ 1024 ] ;
   
try
   {
    StreamSize 
=  _NetworkStreamObject.Read(ReadBuffer, 0 ,ReadBuffer.Length);
   }
   
catch (Exception ex)
   {
    
// 写日志
    m_logs.Append( " 错误: " + ex.Message + ENTER);
    m_ErrCode 
=  ex.Message;
    
return   " false " ;
   }

   
if  (StreamSize == 0 )
   {
    
return  ReturnValue ;
   }
   
else
   {
    ReturnValue 
=  Encoding.Default.GetString(ReadBuffer).Substring( 0 ,StreamSize);
    m_logs.Append(ReturnValue
+ ENTER);
    
return   ReturnValue;
   }
  }

  
///   <summary>
  
///  与服务器交互,发送一条命令并接收回应。
  
///   </summary>
  
///   <param name="str"> 一个要发送的命令 </param>
   private   bool  Dialog( string  str,NetworkStream _NetworkStream)
  {
   
if (str == null || str.Trim() == "" )
   {
    
return   true ;
   }
   
if (SendCommand(str,_NetworkStream))
   {
    
string  RR = RecvResponse(_NetworkStream);
    
if (RR == " false " )
    {
     
return   false ;
    }
    
string  RRCode = RR.Substring( 0 , 3 );
    
if (m_RightCodeHT[RRCode] != null )
    {
     
return   true ;
    }
    
else
    {
     m_ErrCode 
=  RRCode;
     
return   false ;
    }
   }
   
else
   {
    
return   false ;
   }

  }


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

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

   
return   true ;
  }

  
  
///   <summary>
  
///  SendEmail
  
///   </summary>
  
///   <returns></returns>
   private   bool  SendEmail(NetworkStream _NetworkStream, bool  needSmtp, string  mailServer, string  userName, string  password,Hashtable recipients, string  from,
   
string  fromName, string  recipientName, string  subject, string  priority,IList attachments, bool  isHtml,
   
string  body)
  {
   
// 验证网络连接是否正确
    if (m_RightCodeHT[RecvResponse(_NetworkStream).Substring( 0 , 3 )] == null )
   {
    
return   false ;
   }


   
string [] SendBuffer;
   
string  SendBufferstr;
   StringBuilder SendBufferstrBuilder 
=   new  StringBuilder();

   
// 进行smtp验证
    if (needSmtp)
   {
    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,_NetworkStream))
    {
     
return   false ;
    }
   }
   
else
   {
    SendBufferstr
= " HELO  "   +  mailServer  +  ENTER;
    
if ( ! Dialog(SendBufferstr,_NetworkStream))
     
return   false ;
   }

   
//
   SendBufferstr = " MAIL FROM:< "   +  from  +   " > "   +  ENTER;
   
if ( ! Dialog(SendBufferstr,_NetworkStream))
    
return   false ;

   
//
   SendBuffer = new   string [m_recipientMaxnum];
   
for ( int  i = 0 ;i < recipients.Count;i ++ )
   {
    SendBuffer[i]
= " RCPT TO:< "   +  recipients[i].ToString()  + " > "   +  ENTER;

   }

   
if ( ! dialog(sendbuffer,_networkstream))
    
return   false ;
   SendBufferstr
= " DATA "   +  ENTER;
   
if ( ! Dialog(SendBufferstr,_NetworkStream))
    
return   false ;

   sendbufferstrbuilder.append(
" from: "   +  fromName  +   " < "   +  from  + " > "   + ENTER);
      
   SendBufferstrBuilder.Append(
" To:=? " + Charset.ToUpper() + " ?B? " + Base64Encode(recipientName) + " ?= " + " < " + recipients[ 0 ] + " > " + ENTER);
   
   SendBufferstrBuilder.Append(
" CC: " );
   
for ( int  i = 0 ;i < recipients.Count;i ++ )
   {
    SendBufferstrBuilder.Append(recipients[i].ToString() 
+   " < "   +  recipients[i].ToString()  + " >, " );
   }
   SendBufferstrBuilder.Append(ENTER);

   sendbufferstrbuilder.append(((subject
== string .empty  ||  subject == null ) ? " Subject: " :((Charset == "" ) ? ( " Subject: "   +  subject):( " Subject: "   +   " =? "   +  Charset.ToUpper()  +   " ?B? "   +  Base64Encode(subject)  + " ?= " )))  +  ENTER);
   SendBufferstrBuilder.Append(
" X-Priority: "   +  priority  +  ENTER);
   SendBufferstrBuilder.Append(
" X-MSMail-Priority: "   +  priority  +  ENTER);
   SendBufferstrBuilder.Append(
" Importance: "   +  priority  +  ENTER);
   SendBufferstrBuilder.Append(
" X-Mailer: Lion.Web.Mail.SmtpMail Pubclass [cn] "   +  ENTER);
   SendBufferstrBuilder.Append(
" MIME-Version: 1.0 "   +  ENTER);

   
if (attachments  !=   null   &&  attachments.Count != 0 )
   {
    SendBufferstrBuilder.Append(
" Content-Type: multipart/mixed; "   +  ENTER);
    SendBufferstrBuilder.Append(
"  boundary=\ " ===== " +(isHtml? " 001_Dragon520636771063_ " : " 001_Dragon303406132050_ " )+ " ===== \ "" + ENTER + ENTER);
   }

   
if (ishtml)
   {
    
if (attachments  !=   null   &&  attachments.Count == 0 )
    {
     SendBufferstrBuilder.Append(
" Content-Type: multipart/alternative; " + ENTER); // 内容格式和分隔符
     SendBufferstrBuilder.Append( "  boundary=\ " ===== 003_Dragon520636771063_ ===== \ "" + ENTER + ENTER);

     sendbufferstrbuilder.append(
" this is a multi-part message in MIME format. " + ENTER + ENTER);
    }
    
else
    {
     SendBufferstrBuilder.Append(
" This is a multi-part message in MIME format. " + ENTER + ENTER);
     SendBufferstrBuilder.Append(
" --=====001_Dragon520636771063_===== " + ENTER);
     SendBufferstrBuilder.Append(
" Content-Type: multipart/alternative; " + ENTER); // 内容格式和分隔符
     SendBufferstrBuilder.Append( "  boundary=\ " ===== 003_Dragon520636771063_ ===== \ "" + ENTER + ENTER);     
    }
    SendBufferstrBuilder.Append(
" --=====003_Dragon520636771063_===== " + ENTER);
    SendBufferstrBuilder.Append(
" Content-Type: text/plain; " +  ENTER);
    SendBufferstrBuilder.Append(((Charset
== "" ) ? ( "  charset=\ " iso - 8859 - 1 \ "" ):( "  charset=\ ""  + Charset.ToLower() +  " \ "" ))  +  ENTER);
    SendBufferstrBuilder.Append(
" Content-Transfer-Encoding: base64 "   +  ENTER  +  ENTER);
    SendBufferstrBuilder.Append(Base64Encode(
" 邮件内容为HTML格式,请选择HTML方式查看 " +  ENTER  +  ENTER);

    sendbufferstrbuilder.append(
" --=====003_dragon520636771063_===== " + enter);

    

    sendbufferstrbuilder.append(
" content-type: text/html; "   +  ENTER);
    SendBufferstrBuilder.Append(((Charset
== "" ) ? ( "  charset=\ " iso - 8859 - 1 \ "" ):( "  charset=\ ""  + Charset.ToLower() +  " \ "" ))  +  ENTER);
    SendBufferstrBuilder.Append(
" Content-Transfer-Encoding: base64 "   +  ENTER  +  ENTER);
    SendBufferstrBuilder.Append(Base64Encode(body) 
+  ENTER  +  ENTER);
    SendBufferstrBuilder.Append(
" --=====003_Dragon520636771063_=====-- " + ENTER);
   }
   
else
   {
    
if (attachments  !=   null   &&  attachments.Count != 0 )
    {
     SendBufferstrBuilder.Append(
" --=====001_Dragon303406132050_===== " + ENTER);
    }
    SendBufferstrBuilder.Append(
" Content-Type: text/plain; "   +  ENTER);
    SendBufferstrBuilder.Append(((Charset
== "" ) ? ( "  charset=\ " iso - 8859 - 1 \ "" ):( "  charset=\ ""  + Charset.ToLower() +  " \ "" ))  +  ENTER);
    SendBufferstrBuilder.Append(
" Content-Transfer-Encoding: base64 "   +  ENTER  +  ENTER);
    SendBufferstrBuilder.Append(Base64Encode(body) 
+  ENTER);
   }
   
   
// SendBufferstr += "Content-Transfer-Encoding: base64"+ENTER;
    if (attachments  !=   null   &&  attachments.Count != 0 )
   {
    
for ( int  i = 0 ;i < attachments.Count;i ++ )
    {
     
string  filepath  =  ( string )attachments[i];
     SendBufferstrBuilder.Append(
" --===== " +  (isHtml ? " 001_Dragon520636771063_ " : " 001_Dragon303406132050_ " + " ===== " + ENTER);
     
// SendBufferstr += "Content-Type: application/octet-stream"+ENTER;
     SendBufferstrBuilder.Append( " Content-Type: text/plain; " + ENTER);
     SendBufferstrBuilder.Append(
"  name=\ " =? " +Charset.ToUpper()+ " ? B ? " +Base64Encode(filepath.Substring(filepath.LastIndexOf( " \\ " )+1))+ " ?= \ "" + ENTER);
     SendBufferstrBuilder.Append(
" Content-Transfer-Encoding: base64 " + ENTER);
     SendBufferstrBuilder.Append(
" Content-Disposition: attachment; " + ENTER);
     SendBufferstrBuilder.Append(
"  filename=\ " =? " +Charset.ToUpper()+ " ? B ? " +Base64Encode(filepath.Substring(filepath.LastIndexOf( " \\ " )+1))+ " ?= \ "" + ENTER + ENTER);
     SendBufferstrBuilder.Append(GetStream(filepath)
+ ENTER + ENTER);
    }
    SendBufferstrBuilder.Append(
" --===== " +  (isHtml ? " 001_Dragon520636771063_ " : " 001_Dragon303406132050_ " + " =====-- " + ENTER + ENTER);
   }
   SendBufferstrBuilder.Append(ENTER 
+   " . "   +  ENTER);
   SendBufferstr 
=  SendBufferstrBuilder.ToString();

   
if ( ! dialog(sendbufferstr,_networkstream))
    
return   false ;


   SendBufferstr
= " QUIT "   +  ENTER;
   
if ( ! Dialog(SendBufferstr,_NetworkStream))
    
return   false ;

   
return   true ;
  }

  
#endregion

  
#region
  
/*
  /// <summary>
  /// 添加一个密件收件人
  /// </summary>
  /// <param name="str">收件人地址</param>
  public bool AddRecipientBCC(string str)
  {
   if(str==null||str.Trim()=="")
    return true;
   if(RecipientBCCNum<10)
   {
    RecipientBCC.Add(RecipientBCCNum,str);
    RecipientBCCNum++;
    return true;
   }
   else
   {
    m_logs.Append("错误:收件人过多");
    return false;
   }
  }


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

  
*/    
  
#endregion  
 }

 
///   <summary>
 
///  邮件发送优先级
 
///   </summary>
  public   enum  Priority
 {
  High,
  Normal,
  Low
 }

 
#endregion

}

 

你可能感兴趣的:(email)