首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> C#/CSHARP教程
c#实现smtp服务器,使用tcp命令实现,功能比较完善
作者:网友供稿 点击:80
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

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

namespace SkyDev.Web.Mail
{
 public enum MailFormat{Text,HTML};
 public enum MailPriority{Low=1,Normal=3,High=5};

 #region Class mailAttachments
 public class MailAttachments
 {
  private const int MaxAttachmentNum=10;
  private IList _Attachments;

  public MailAttachments()
  {
   _Attachments=new ArrayList();
  }

  public string this[int index]
  {
   get { return (string)_Attachments[index];}
  }
  /// <summary>
  /// 添加邮件附件
  /// </summary>
  /// <param name="FilePath">附件的绝对路径</param>
  public void Add(params string[] filePath)
  {
   if(filePath==null)
   {
    throw(new ArgumentNullException("非法的附件"));
   }
   else
   {   
    for(int i=0;i<filePath.Length;i++)
    {
     Add(filePath[i]);
    }
   }
  }

  /// <summary>
  /// 添加一个附件,当指定的附件不存在时,忽略该附件,不产生异常。
  /// </summary>
  /// <param name="filePath">附件的绝对路径</param>
  public void Add(string  filePath)
  {
   //当附件存在时才加入,否则忽略
   if (System.IO.File.Exists(filePath))
   {
    if (_Attachments.Count<MaxAttachmentNum)
    {
     _Attachments.Add(filePath);
    }
   }
  }

  public void Clear()//清除所有附件
  {
   _Attachments.Clear();
  }

  public int Count//获取附件个数
  {
   get { return _Attachments.Count;}
  }

 }
 #endregion//end Class mailAttachments

 

 #region Class MailMessage
 /// <summary>
 /// MailMessage 表示SMTP要发送的一封邮件的消息。
 /// </summary>
 public class MailMessage
 {
  private const int MaxRecipientNum=10;
  public MailMessage()
  {  
   _Recipients=new ArrayList();//收件人列表
   _Attachments=new MailAttachments();//附件
   _BodyFormat=MailFormat.Text;//缺省的邮件格式为Text
   _Priority=MailPriority.Normal;
   _Charset="GB2312";
  }

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

  public string From
  {
   get{ return _From;}
   set { _From=value;}
  }

  public string FromName
  {
   get { return _FromName;}
   set { _FromName=value;}
  }
  public string Body
  {
   get { return _Body;}
   set { _Body=value;}
  }

  public string Subject
  {
   get { return _Subject;}
   set { _Subject=value;}
  }

  public MailAttachments Attachments
  {
   get {return _Attachments;}
   set { _Attachments=value;}
  }

  public MailPriority Priority
  {
   get { return _Priority;}
   set { _Priority=value;}
  }

  public IList Recipients
  {
   get { return _Recipients;}
  }
  /// <summary>
  /// 增加一个收件人地址
  /// </summary>
  /// <param name="recipient">收件人的Email地址</param>
  public void AddRecipients(string recipient)
  {
   //先检查邮件地址是否符合规范
   if (_Recipients.Count<MaxRecipientNum)
   {
    _Recipients.Add(recipient);//增加到收件人列表
   }
  }

  public void AddRecipients(params string[] recipient)
  {
   if (recipient==null)
   {
    throw (new ArgumentException("收件人不能为空."));
   }
   else
   {
    for (int i=0;i<recipient.Length;i++)
    {
     AddRecipients(recipient[i]);
    }
   }
  }

  public MailFormat BodyFormat
  {
   set { _BodyFormat=value;}
   get { return _BodyFormat;}
  }

  private string _From;//发件人地址
  private string _FromName;//发件人姓名
  private IList _Recipients;//收件人
  private MailAttachments _Attachments;//附件
  private string _Body;//内容
  private string _Subject;//主题
  private MailFormat _BodyFormat;//邮件格式
  private string _Charset="GB2312";//字符编码格式
  private MailPriority _Priority;//邮件优先级
 }
 #endregion


 #region Class SmtpMail
 public class SmtpServerHelper
 {
  private string CRLF="\r\n";//回车换行

  /// <summary>
  /// 错误消息反馈
  /// </summary>
  private string errmsg;

  /// <summary>
  /// TcpClient对象,用于连接服务器
  /// </summary>
  private TcpClient tcpClient;

  /// <summary>
  /// NetworkStream对象
  /// </summary>
  private NetworkStream networkStream;

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

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

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

  public SmtpServerHelper()
  {
   SMTPCodeAdd();//初始化SMTPCode
  }

  ~SmtpServerHelper()
  {
   networkStream.Close();
   tcpClient.Close();
  }

  /// <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)
  {
   //建立文件流对象
   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>
  /// SMTP回应代码哈希表
  /// </summary>
  private void SMTPCodeAdd()
  {
   //[RFC 821 4.2.1.]
   /*
     4.2.2.  NUMERIC ORDER LIST OF REPLY CODES

   211 System status, or system help reply
   214 Help message
      [Information on how to use the receiver or the meaning of a
      particular non-standard command; this reply is useful only
      to the human user]
   220 <domain> Service ready
   221 <domain> Service closing transmission channel
   250 Requested mail action okay, completed
   251 User not local; will forward to <forward-path>
         
   354 Start mail input; end with <CRLF>.<CRLF>
         
   421 <domain> Service not available,
    closing transmission channel
      [This may be a reply to any command if the service knows it
      must shut down]
   450 Requested mail action not taken: mailbox unavailable
      [E.g., mailbox busy]
   451 Requested action aborted: local error in processing
   452 Requested action not taken: insufficient system storage
         
   500 Syntax error, command unrecognized
      [This may include errors such as command line too long]
   501 Syntax error in parameters or arguments
   502 Command not implemented
   503 Bad sequence of commands
   504 Command parameter not implemented
   550 Requested action not taken: mailbox unavailable
      [E.g., mailbox not found, no access]
   551 User not local; please try <forward-path>
   552 Requested mail action aborted: exceeded storage allocation
   553 Requested action not taken: mailbox name not allowed
      [E.g., mailbox syntax incorrect]
   554 Transaction failed
  
   */

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

   /*
   211 System status, or system help reply
   214 Help message
      [Information on how to use the receiver or the meaning of a
      particular non-standard command; this reply is useful only
      to the human user]
   220 <domain> Service ready
   221 <domain> Service closing transmission channel
   250 Requested mail action okay, completed
   251 User not local; will forward to <forward-path>
         
   354 Start mail input; end with <CRLF>.<CRLF>
   */

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

  }

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

  /// <summary>
  /// 接收SMTP服务器回应
  /// </summary>
  private string RecvResponse()
  {
   int StreamSize;
   string Returnvalue = String.Empty;
   byte[] ReadBuffer = new byte[1024] ;
   try
   {
    StreamSize=networkStream.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+this.CRLF;
    return Returnvalue;
   }
  }

  /// <summary>
  /// 与服务器交互,发送一条命令并接收回应。
  /// </summary>
  /// <param name="str">一个要发送的命令</param>
  /// <param name="errstr">如果错误,要反馈的信息</param>
  private bool Dialog(string str,string errstr)
  {
   if(str==null||str.Trim()==string.Empty)
   {
    return true;
   }
   if(SendCommand(str))
   {
    string RR=RecvResponse();
    if(RR=="false")
    {
     return false;
    }
    //检查返回的代码,根据[RFC 821]返回代码为3位数字代码如220
    string RRCode=RR.Substring(0,3);
    if(RightCodeHT[RRCode]!=null)
    {
     return true;
    }
    else
    {
     if(ErrCodeHT[RRCode]!=null)
     {
      errmsg+=(RRCode+ErrCodeHT[RRCode].ToString());
      errmsg+=CRLF;
     }
     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+=CRLF;
     errmsg+=errstr;
     return false;
    }
   }

   return true;
  }


  //连接服务器
  private bool Connect(string smtpServer,int port)
  {
   //创建Tcp连接
   try
   {
    tcpClient=new TcpClient(smtpServer,port);
   }
   catch(Exception e)
   {
    errmsg=e.ToString();
    return false;
   }  
   networkStream=tcpClient.GetStream();

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

  private string GetPriorityString(MailPriority mailPriority)
  {
   string priority="Normal";
   if (mailPriority==MailPriority.Low)
   {
    priority="Low";
   }
   else if (mailPriority==MailPriority.High)
   {
    priority="High";
   }
   return priority;
  }

  /// <summary>
  /// 发送电子邮件,SMTP服务器不需要身份验证
  /// </summary>
  /// <param name="smtpServer"></param>
  /// <param name="port"></param>
  /// <param name="mailMessage"></param>
  /// <returns></returns>
  public  bool SendEmail(string smtpServer,int port,MailMessage mailMessage)
  {
   return SendEmail(smtpServer,port,false,"","",mailMessage);
  }

  /// <summary>
  /// 发送电子邮件,SMTP服务器需要身份验证
  /// </summary>
  /// <param name="smtpServer"></param>
  /// <param name="port"></param>
  /// <param name="username"></param>
  /// <param name="password"></param>
  /// <param name="mailMessage"></param>
  /// <returns></returns>
  public bool SendEmail(string smtpServer,int port,string username,string password,MailMessage mailMessage)
  {
   return SendEmail(smtpServer,port,false,username,password,mailMessage);
  }

  private  bool SendEmail(string smtpServer,int port,bool ESmtp,string username,string password,MailMessage mailMessage)
  {
   if (Connect(smtpServer,port)==false)//测试连接服务器是否成功
    return false;

   string priority=GetPriorityString(mailMessage.Priority);
   bool Html=(mailMessage.BodyFormat==MailFormat.HTML);
  
   string[] SendBuffer;
   string SendBufferstr;

   //进行SMTP验证,现在大部分SMTP服务器都要认证
   if(ESmtp)
   {
    SendBuffer=new String[4];
    SendBuffer[0]="EHLO " + smtpServer + CRLF;
    SendBuffer[1]="AUTH LOGIN" + CRLF;
    SendBuffer[2]=Base64Encode(username) + CRLF;
    SendBuffer[3]=Base64Encode(password) + CRLF;
    if(!Dialog(SendBuffer,"SMTP服务器验证失败,请核对用户名和密码。"))
     return false;
   }
   else
   {//不需要身份认证
    SendBufferstr="HELO " + smtpServer + CRLF;
    if(!Dialog(SendBufferstr,""))
     return false;
   }

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

   //收件人地址
   SendBuffer=new string[mailMessage.Recipients.Count];
   for(int i=0;i<mailMessage.Recipients.Count;i++)
   {
    SendBuffer[i]="RCPT TO:<" +(string)mailMessage.Recipients[i] +">" + CRLF;
   }
   if(!Dialog(SendBuffer,"收件人地址有误"))
    return false;

   /*
     SendBuffer=new string[10];
     for(int i=0;i<RecipientBCC.Count;i++)
     {

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

     }

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

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

   //发件人姓名
   SendBufferstr="From:" + mailMessage.FromName + "<" +mailMessage.From +">" +CRLF;

   //if(ReplyTo.Trim()!="")
   //{
   // SendBufferstr+="Reply-To: " + ReplyTo + CRLF;
   //}

   //SendBufferstr+="To:" + ToName + "<" + Recipient[0] +">" +CRLF;
   //至少要有一个收件人
   if (mailMessage.Recipients.Count==0)
   {
    return false;
   }
   else
   {
    SendBufferstr += "To:=?"+mailMessage.Charset.ToUpper()+"?B?"+
     Base64Encode((string)mailMessage.Recipients[0])+"?="+"<"+(string)mailMessage.Recipients[0]+">"+CRLF;
   }
 
   //SendBufferstr+="CC:";
   //for(int i=0;i<Recipient.Count;i++)
   //{
   // SendBufferstr+=Recipient[i].ToString() + "<" + Recipient[i].ToString() +">,";
   //}
   //SendBufferstr+=CRLF;

   SendBufferstr+=
    ((mailMessage.Subject==String.Empty || mailMessage.Subject==null)?"Subject:":((mailMessage.Charset=="")?("Subject:" +
    mailMessage.Subject):("Subject:" + "=?" + mailMessage.Charset.ToUpper() + "?B?" +
    Base64Encode(mailMessage.Subject) +"?="))) + CRLF;
   SendBufferstr+="X-Priority:" + priority + CRLF;
   SendBufferstr+="X-MSMail-Priority:" + priority + CRLF;
   SendBufferstr+="Importance:" + priority + CRLF;
   SendBufferstr+="X-Mailer: Lion.Web.Mail.SmtpMail Pubclass [cn]" + CRLF;
   SendBufferstr+="MIME-Version: 1.0" + CRLF;
   if(mailMessage.Attachments.Count!=0)
   {
    SendBufferstr+="Content-Type: multipart/mixed;" + CRLF;
    SendBufferstr += " boundary=\"====="+
     (Html?"001_Dragon520636771063_":"001_Dragon303406132050_")+"=====\""+CRLF+CRLF;
   }

   if(Html)
   {
    if(mailMessage.Attachments.Count==0)
    {
     SendBufferstr += "Content-Type: multipart/alternative;"+CRLF;//内容格式和分隔符
     SendBufferstr += " boundary=\"=====003_Dragon520636771063_=====\""+CRLF+CRLF;
     SendBufferstr += "This is a multi-part message in MIME format."+CRLF+CRLF;
    }
    else
    {
     SendBufferstr +="This is a multi-part message in MIME format."+CRLF+CRLF;
     SendBufferstr += "--=====001_Dragon520636771063_====="+CRLF;
     SendBufferstr += "Content-Type: multipart/alternative;"+CRLF;//内容格式和分隔符
     SendBufferstr += " boundary=\"=====003_Dragon520636771063_=====\""+CRLF+CRLF;
    }
    SendBufferstr += "--=====003_Dragon520636771063_====="+CRLF;
    SendBufferstr += "Content-Type: text/plain;"+ CRLF;
    SendBufferstr += ((mailMessage.Charset=="")?(" charset=\"iso-8859-1\""):(" charset=\"" +

     mailMessage.Charset.ToLower() + "\"")) + CRLF;
    SendBufferstr+="Content-Transfer-Encoding: base64" + CRLF + CRLF;
    SendBufferstr+= Base64Encode("邮件内容为HTML格式,请选择HTML方式查看") + CRLF + CRLF;

    SendBufferstr += "--=====003_Dragon520636771063_====="+CRLF;


    SendBufferstr+="Content-Type: text/html;" + CRLF;
    SendBufferstr+=((mailMessage.Charset=="")?(" charset=\"iso-8859-1\""):(" charset=\"" +
     mailMessage.Charset.ToLower() + "\"")) + CRLF;
    SendBufferstr+="Content-Transfer-Encoding: base64" + CRLF + CRLF;
    SendBufferstr+= Base64Encode(mailMessage.Body) + CRLF + CRLF;
    SendBufferstr += "--=====003_Dragon520636771063_=====--"+CRLF;
   }
   else
   {
    if(mailMessage.Attachments.Count!=0)
    {
     SendBufferstr += "--=====001_Dragon303406132050_====="+CRLF;
    }
    SendBufferstr+="Content-Type: text/plain;" + CRLF;
    SendBufferstr+=((mailMessage.Charset=="")?(" charset=\"iso-8859-1\""):(" charset=\"" +
     mailMessage.Charset.ToLower() + "\"")) + CRLF;
    SendBufferstr+="Content-Transfer-Encoding: base64" + CRLF + CRLF;
    SendBufferstr+= Base64Encode(mailMessage.Body) + CRLF;
   }
 
   //SendBufferstr += "Content-Transfer-Encoding: base64"+CRLF;

    if(mailMessage.Attachments.Count!=0)
   {
    for(int i=0;i<mailMessage.Attachments.Count;i++)
    {
     string filepath = (string)mailMessage.Attachments[i];
     SendBufferstr += "--====="+
      (Html?"001_Dragon520636771063_":"001_Dragon303406132050_") +"====="+CRLF;
     //SendBufferstr += "Content-Type: application/octet-stream"+CRLF;
     SendBufferstr += "Content-Type: text/plain;"+CRLF;
     SendBufferstr += " name=\"=?"+mailMessage.Charset.ToUpper()+"?B?"+
      Base64Encode(filepath.Substring(filepath.LastIndexOf("\\")+1))+"?=\""+CRLF;
     SendBufferstr += "Content-Transfer-Encoding: base64"+CRLF;
     SendBufferstr += "Content-Disposition: attachment;"+CRLF;
     SendBufferstr += " filename=\"=?"+mailMessage.Charset.ToUpper()+"?B?"+
      Base64Encode(filepath.Substring(filepath.LastIndexOf("\\")+1))+"?=\""+CRLF+CRLF;
     SendBufferstr += GetStream(filepath)+CRLF+CRLF;
    }
    SendBufferstr += "--====="+
     (Html?"001_Dragon520636771063_":"001_Dragon303406132050_")+"=====--"+CRLF+CRLF;
   }
 
   SendBufferstr += CRLF + "." + CRLF;//内容结束

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

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

   networkStream.Close();
   tcpClient.Close();
   return true;
  }
 }

 

 public class SmtpMail
 {
  private static string _SmtpServer;

  /// <summary>
  /// 格式:SmtpAccount:Password@SmtpServerAddress<br>
  /// 或者:SmtpServerAddress<br>
  /// <code>
  /// SmtpMail.SmtpServer="user:12345678@smtp.126.com";
  /// //或者:
  /// SmtpMail.SmtpServer="smtp.126.com";
  /// 或者:
  /// SmtpMail.SmtpServer=SmtpServerHelper.GetSmtpServer("user","12345678","smtp.126.com");
  /// </code>
  /// </summary>
  public static string SmtpServer
  {
   set { _SmtpServer=value;}
   get { return _SmtpServer;}
  }

  public static bool Send(MailMessage mailMessage,string username,string password)
  {
   SmtpServerHelper helper=new SmtpServerHelper();
   return helper.SendEmail(_SmtpServer,25,username,password,mailMessage);
  }

 }

 #endregion
}

 


using System;
using NUnit.Framework;


namespace SkyDev.Web.Mail
{
 /// <summary>
 /// Test 的摘要说明。
 /// </summary>
 [TestFixture]
 public class TestSmtpMail
 {
  //安装测试用例,完成初始化操作
  [SetUp]
  public void SetUp()
  {  
  }

  //测试结束完成清理操作
  [TearDown]  
  public void TearDown()
  {
 
  }
 
      [Test]
  public void TestMailAttachments()
  {
   SkyDev.Web.Mail.MailAttachments attachments=new MailAttachments();
   Assert.AreEqual(0,attachments.Count,"初始化MailAttachments");
   attachments.Add("c:\\autoexec.bat");
   Assert.AreEqual(1,attachments.Count,"增加附件(附件确实存在)");
   attachments.Add("c:\\autoexec.dat.txt");
   Assert.AreEqual(1,attachments.Count,"增加附件(附件不存在)");
   attachments.Clear();
   Assert.AreEqual(0,attachments.Count,"清除附件");
  }

  [Test]
  public void TestMailMessage()
  {
   MailMessage message=new MailMessage();  
   Assert.AreEqual(0,message.Attachments.Count,"初始化MailAttachments");
   Assert.AreEqual(MailFormat.Text,message.BodyFormat,"邮件格式");
   Assert.AreEqual("GB2312",message.Charset,"缺省的字符集");
  }

  [Test]
  public void TestSendMail()
  {
   SmtpMail.SmtpServer="smtp.126.com";
   MailMessage mail=new MailMessage();
   mail.From="qs1976@126.com";
   mail.FromName="曾青松";
   mail.AddRecipients("qs1976@126.com");
   mail.Subject="主题:测试邮件";
   mail.BodyFormat=MailFormat.Text;
   mail.Body="测试的内容.";
   mail.Attachments.Add("c:\\test.txt");
   SmtpMail.Send(mail,"","");//请填写自己的测试邮件帐号
  }
 }
}


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·使用C#编写Windows Forms应用程序(转)-.NET教程,Windows开发
·C#学习杂记-.NET教程,C#语言
·将文本格式的文章转换为html/xml格式文本的功能封装到Javabean-JSP教程,Java技巧及代码
·用java小程序applet实现无限级树结构-JSP教程,Java技巧及代码
·《.net编程先锋C#》第一章 C#简介-.NET教程,C#语言
·企业人事信息管理系统1.0-ASP教程,数据库相关
·《.net编程先锋C#》第三章 第一个C#应用程序-.NET教程,C#语言
·《.net编程先锋C#》第二章 理论基础-公用语言 运行环境-.NET教程,C#语言
·Windows应用程序调试必备的--符号文件(Symbols)-.NET教程,评论及其它
·c#反编译微软msdn2003的帮助文档,并将反编译结果保存到一个sqlserver数据库中
最新文章
·vista的新特性:懒人的安全感_windows vista
·photoshop为情侣照片打造韩式梦幻相框_photoshop教程
·专访seobbs站长乐思蜀_站长访谈
·嘟嘟网络陈艺光:诚信是一种信仰_站长访谈
·俺自己黄修源:只问耕耘,不问收获_站长访谈
·李向华:如何提高论坛用户粘性_站长访谈
·给windows vista系统网络和共享中心“换脸”_windows vista
·胡宪东谈搜索优化的实战_站长心得
·网站快速成功的九个步骤_站长心得
·google pr数字背后的含意_google推广
相关主题
  • c#实现socket传输简单数据_c#应用
  • C#实现Singleton的两种方法的比较-.NET教程,C#语言
  • C#实现SMTP服务器,使用TCP命令实现,功能比较完善-.NET教程,C#语言
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭