向广大C#爱好者推荐一个很好使的MAIL CLASS

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: [email protected]
Support .Net Framework Beta 2
*/
public class ESmtpMail
{
private string enter="\r\n";
///

1<summary>   
2/// 设定语言代码,默认设定为GB2312,如不需要可设置为""   
3/// </summary>

public string Charset="GB2312";
///

1<summary>   
2/// 发件人地址   
3/// </summary>

public string From="";
///

1<summary>   
2/// 发件人姓名   
3/// </summary>

public string FromName="";
///

1<summary>   
2/// 回复邮件地址   
3/// </summary>

//public string ReplyTo="";
///

1<summary>   
2/// 收件人姓名   
3/// </summary>

public string RecipientName="";
///

1<summary>   
2/// 收件人列表   
3/// </summary>

private Hashtable Recipient=new Hashtable();
///

1<summary>   
2/// 邮件服务器域名   
3/// </summary>

private string mailserver="";
///

1<summary>   
2/// 邮件服务器端口号   
3/// </summary>

private int mailserverport=25;
///

1<summary>   
2/// SMTP认证时使用的用户名   
3/// </summary>

private string username="";
///

1<summary>   
2/// SMTP认证时使用的密码   
3/// </summary>

private string password="";
///

1<summary>   
2/// 是否需要SMTP验证   
3/// </summary>

private bool ESmtp=false;
///

1<summary>   
2/// 是否Html邮件   
3/// </summary>

public bool Html=false;
///

1<summary>   
2/// 邮件附件列表   
3/// </summary>

private System.Collections.ArrayList Attachments;
///

1<summary>   
2/// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5"   
3/// </summary>

private string priority="Normal";
///

1<summary>   
2/// 邮件主题   
3/// </summary>

public string Subject="";
///

1<summary>   
2/// 邮件正文   
3/// </summary>

public string Body="";
///

1<summary>   
2/// 收件人数量   
3/// </summary>

private int RecipientNum=0;
///

1<summary>   
2/// 最多收件人数量   
3/// </summary>

private int recipientmaxnum=1;
///

1<summary>   
2/// 密件收件人数量   
3/// </summary>

//private int RecipientBCCNum=0;
///

1<summary>   
2/// 错误消息反馈   
3/// </summary>

private string errmsg;
///

1<summary>   
2/// TcpClient对象,用于连接服务器   
3/// </summary>

private TcpClient tc;
///

1<summary>   
2/// NetworkStream对象   
3/// </summary>

private NetworkStream ns;
///

1<summary>   
2/// SMTP错误代码哈希表   
3/// </summary>

private Hashtable ErrCodeHT = new Hashtable();
///

1<summary>   
2/// SMTP正确代码哈希表   
3/// </summary>

private Hashtable RightCodeHT = new Hashtable();
public ESmtpMail()
{
Attachments = new System.Collections.ArrayList();
}
///

1<summary>   
2/// 邮件服务器域名和验证信息   
3/// 形如:"user:[email protected]:25",也可省略次要信息。如"user:[email protected]"或" www.server.com "   
4/// </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;

}

}

}
}

///

1<summary>   
2/// 邮件服务器端口号   
3/// </summary>

public int MailDomainPort
{
set
{
mailserverport=value;
}
}

///

1<summary>   
2/// SMTP认证时使用的用户名   
3/// </summary>

public string MailServerUserName
{
set
{
if(value.Trim()!="")
{
username=value.Trim();
ESmtp=true;
}
else
{
username="";
ESmtp=false;
}
}
}

///

1<summary>   
2/// SMTP认证时使用的密码   
3/// </summary>

public string MailServerPassWord
{
set
{
password=value;
}
}

///

1<summary>   
2/// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5"   
3/// </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;
}
}
}

///

1<summary>   
2/// 错误消息反馈   
3/// </summary>

public string ErrorMessage
{
get
{
return errmsg;
}
}

///

1<summary>   
2/// 服务器交互记录   
3/// </summary>

private string logs="";

///

1<summary>   
2/// 服务器交互记录,如发现本组件不能使用的SMTP服务器,请将出错时的Logs发给我( [email protected] ),我将尽快查明原因。   
3/// </summary>

public string Logs
{
get
{
return logs;
}
}

///

1<summary>   
2/// SMTP回应代码哈希表   
3/// </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","用户非本地,请尝试

  1<forward-path>");   
  2ErrCodeHT.Add("452","系统存储不足,要求的操作未执行");   
  3ErrCodeHT.Add("552","过量的存储分配,要求的操作未执行");   
  4ErrCodeHT.Add("553","邮箱名不可用,要求的操作未执行(例如邮箱格式错误)");   
  5ErrCodeHT.Add("432","需要一个密码转换");   
  6ErrCodeHT.Add("534","认证机制过于简单");   
  7ErrCodeHT.Add("538","当前请求的认证机制需要加密");   
  8ErrCodeHT.Add("454","临时认证失败");   
  9ErrCodeHT.Add("530","需要认证"); 
 10
 11RightCodeHT.Add("220","服务就绪");   
 12RightCodeHT.Add("250","要求的邮件操作完成");   
 13RightCodeHT.Add("251","用户非本地,将转发向<forward-path>");   
 14RightCodeHT.Add("354","开始邮件输入,以<enter>.<enter>结束");   
 15RightCodeHT.Add("221","服务关闭传输信道");   
 16RightCodeHT.Add("334","服务器响应验证Base64字符串");   
 17RightCodeHT.Add("235","验证成功");   
 18} 
 19
 20  
 21/// <summary>   
 22/// 将字符串编码为Base64字符串   
 23/// </summary>   
 24/// <param name="estr"/>要编码的字符串   
 25private string Base64Encode(string str)   
 26{   
 27byte[] barray;   
 28barray=Encoding.Default.GetBytes(str);   
 29return Convert.ToBase64String(barray);   
 30} 
 31
 32  
 33/// <summary>   
 34/// 将Base64字符串解码为普通字符串   
 35/// </summary>   
 36/// <param name="dstr"/>要解码的字符串   
 37private string Base64Decode(string str)   
 38{   
 39byte[] barray;   
 40barray=Convert.FromBase64String(str);   
 41return Encoding.Default.GetString(barray);   
 42} 
 43
 44  
 45/// <summary>   
 46/// 得到上传附件的文件流   
 47/// </summary>   
 48/// <param name="FilePath"/>附件的绝对路径   
 49private string GetStream(string FilePath)   
 50{   
 51//建立文件流对象   
 52System.IO.FileStream FileStr=new System.IO.FileStream(FilePath,System.IO.FileMode.Open);   
 53byte[] by=new byte[System.Convert.ToInt32(FileStr.Length)];   
 54FileStr.Read(by,0,by.Length);   
 55FileStr.Close();   
 56return(System.Convert.ToBase64String(by));   
 57} 
 58
 59  
 60/// <summary>   
 61/// 添加邮件附件   
 62/// </summary>   
 63/// <param name="path"/>附件绝对路径   
 64public void AddAttachment(string path)   
 65{   
 66Attachments.Add(path);   
 67}   
 68  
 69
 70
 71/// <summary>   
 72/// 添加一个收件人   
 73/// </summary>   
 74/// <param name="str"/>收件人地址   
 75public bool AddRecipient(string str)   
 76{   
 77str=str.Trim();   
 78if(str==null||str==" "||str.IndexOf("@")==-1 )   
 79return true;   
 80if(RecipientNum<recipientmaxnum) ;="" <summary="" else="" errmsg+="收件人过多" false;="" recipient.add(recipientnum,str);="" recipientnum++;="" return="" true;="" {="" }="">   
 81/// 最多收件人数量   
 82///    
 83public int RecipientMaxNum   
 84{   
 85set   
 86{   
 87recipientmaxnum = value;   
 88}   
 89} 
 90
 91  
 92/// <summary>   
 93/// 添加一组收件人(不超过recipientmaxnum个),参数为字符串数组   
 94/// </summary>   
 95/// <param name="str"/>保存有收件人地址的字符串数组(不超过recipientmaxnum个)   
 96public bool AddRecipient(string[] str)   
 97{   
 98for(int i=0;i<str.length;i++) <summary="" false;="" if(!addrecipient(str[i]))="" return="" true;="" {="" }="">   
 99/// 发送SMTP命令   
100///    
101private bool SendCommand(string str)   
102{   
103byte[] WriteBuffer;   
104if(str==null||str.Trim()=="")   
105{   
106return true;   
107}   
108logs+=str;   
109WriteBuffer = Encoding.Default.GetBytes(str);   
110try   
111{   
112ns.Write(WriteBuffer,0,WriteBuffer.Length);   
113}   
114catch   
115{   
116errmsg="网络连接错误";   
117return false;   
118}   
119return true;   
120} 
121
122/// <summary>   
123/// 接收SMTP服务器回应   
124/// </summary>   
125private string RecvResponse()   
126{   
127int StreamSize;   
128string ReturnValue = "";   
129byte[] ReadBuffer = new byte[1024] ;   
130try   
131{   
132StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length);   
133}   
134catch   
135{   
136errmsg="网络连接错误";   
137return "false";   
138} 
139
140if (StreamSize==0)   
141{   
142return ReturnValue ;   
143}   
144else   
145{   
146ReturnValue = Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize);   
147logs+=ReturnValue;   
148return ReturnValue;   
149}   
150} 
151
152  
153/// <summary>   
154/// 与服务器交互,发送一条命令并接收回应。   
155/// </summary>   
156/// <param name="Command"/>一个要发送的命令   
157/// <param name="errstr"/>如果错误,要反馈的信息   
158private bool Dialog(string str,string errstr)   
159{   
160if(str==null||str.Trim()=="")   
161{   
162return true;   
163}   
164if(SendCommand(str))   
165{   
166string RR=RecvResponse();   
167if(RR=="false")   
168{   
169return false;   
170}   
171string RRCode=RR.Substring(0,3);   
172if(RightCodeHT[RRCode]!=null)   
173{   
174return true;   
175}   
176else   
177{   
178if(ErrCodeHT[RRCode]!=null)   
179{   
180errmsg+=(RRCode+ErrCodeHT[RRCode].ToString());   
181errmsg+=enter;   
182}   
183else   
184{   
185errmsg+=RR;   
186}   
187errmsg+=errstr;   
188return false;   
189}   
190}   
191else   
192{   
193return false;   
194} 
195
196} 
197
198  
199/// <summary>   
200/// 与服务器交互,发送一组命令并接收回应。   
201/// </summary>
202
203private bool Dialog(string[] str,string errstr)   
204{   
205for(int i=0;i<str.length;i++) "="" +="" ;="" bool="" catch(exception="" e)="" else="" enter;="" errmsg="网络连接失败" errmsg+="errstr;" false;="" from="" if(!dialog(sendbuffer,"smtp服务器验证失败,请核对用户名和密码。"))="" if(!dialog(sendbufferstr,""))="" if(!dialog(str[i],""))="" if(esmtp)="" if(rightcodeht[recvresponse().substring(0,3)]="null)" mailserver="" ns="tc.GetStream();" private="" return="" sendbuffer="new" sendbuffer;="" sendbuffer[0]="EHLO " sendbuffer[1]="AUTH LOGIN" sendbuffer[2]="Base64Encode(username)" sendbuffer[3]="Base64Encode(password)" sendbufferstr="MAIL FROM:&lt;" sendbufferstr;="" sendemail()="" smtpcodeadd();="" string="" string[4];="" string[]="" tc="new" tcpclient(mailserver,mailserverport);="" true;="" try="" {="" }="" 进行smtp验证="" 连接网络="" 验证网络连接是否正确="">" + enter;   
206if(!Dialog(SendBufferstr,"发件人地址错误,或不能为空"))   
207return false; 
208
209//   
210SendBuffer=new string[recipientmaxnum];   
211for(int i=0;i<recipient.count;i++) +="" +"="" recipient[i].tostring()="" sendbuffer[i]="RCPT TO:&lt;" {="">" + enter; 
212
213}   
214if(!Dialog(SendBuffer,"收件人地址有误"))   
215return false; 
216
217SendBufferstr="DATA" + enter;   
218if(!Dialog(SendBufferstr,""))   
219return false; 
220
221SendBufferstr="From:" + FromName + "&lt;" + From +"&gt;" +enter; 
222
223SendBufferstr += "To:=?"+Charset.ToUpper()+"?B?"+Base64Encode(RecipientName)+"?="+"&lt;"+Recipient[0]+"&gt;"+enter;   
224SendBufferstr+="CC:";   
225for(int i=0;i<recipient.count;i++) "<"="" +="" +"="" recipient[i].tostring()="" sendbufferstr+="Recipient[i].ToString()" {="">,";   
226}   
227SendBufferstr+=enter; 
228
229  
230if(Charset=="")   
231{   
232SendBufferstr+="Subject:" + Subject + enter;   
233}   
234else   
235{   
236SendBufferstr+="Subject:" + "=?" + Charset.ToUpper() + "?B?" + Base64Encode(Subject) +"?=" +enter;   
237} 
238
239SendBufferstr+="X-Priority:" + priority + enter;   
240SendBufferstr+="X-MSMail-Priority:" + priority + enter;   
241SendBufferstr+="Importance:" + priority + enter;   
242SendBufferstr+="X-Mailer: Huolx.Pubclass" + enter;   
243SendBufferstr+="MIME-Version: 1.0" + enter; 
244
245SendBufferstr += "Content-Type: multipart/mixed;"+enter;//内容格式和分隔符   
246SendBufferstr += " boundary=\"----=_NextPart_000_00D6_01C29593.AAB31770\""+enter;   
247SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter; 
248
249if(Html)   
250{   
251SendBufferstr+="Content-Type: text/html;" + enter;   
252}   
253else   
254{   
255SendBufferstr+="Content-Type: text/plain;" + enter;   
256} 
257
258if(Charset=="")   
259{   
260SendBufferstr+=" charset=\"iso-8859-1\"" + enter;   
261}   
262else   
263{   
264SendBufferstr+=" charset=\"" + Charset.ToLower() + "\"" + enter;   
265}   
266//SendBufferstr += "Content-Transfer-Encoding: base64"+enter; 
267
268SendBufferstr+="Content-Transfer-Encoding: base64" + enter + enter; 
269
270SendBufferstr+= Base64Encode(Body) + enter;   
271if(Attachments.Count!=0)   
272{   
273foreach(string filepath in Attachments)   
274{   
275  
276SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter;   
277SendBufferstr += "Content-Type: application/octet-stream"+enter;   
278SendBufferstr += " name=\"=?"+Charset.ToUpper()+"?B?"+Base64Encode(filepath.Substring(filepath.LastIndexOf(" \\\")+1))+"?=\""+enter ;   
279SendBufferstr += "Content-Transfer-Encoding: base64"+enter;   
280SendBufferstr += "Content-Disposition: attachment;"+enter;   
281SendBufferstr += " filename=\"=?"+Charset.ToUpper()+"?B?"+Base64Encode(filepath.Substring(filepath.LastIndexOf(" \\\")+1))+"?=\""+enter+enter ;   
282SendBufferstr += GetStream(filepath)+enter+enter;   
283}   
284}   
285SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770--"+enter+enter;   
286  
287  
288SendBufferstr += enter + "." + enter; 
289
290if(!Dialog(SendBufferstr,"错误信件信息"))   
291return false; 
292
293  
294SendBufferstr="QUIT" + enter;   
295if(!Dialog(SendBufferstr,"断开连接时错误"))   
296return false; 
297
298  
299ns.Close();   
300tc.Close();   
301return true;   
302} 
303
304  
305/// <summary>   
306/// 发送邮件方法,所有参数均通过属性设置。   
307/// </summary>   
308public bool Send()   
309{   
310if(Recipient.Count==0)   
311{   
312errmsg="收件人列表不能为空";   
313return false;   
314} 
315
316if(mailserver.Trim()=="")   
317{   
318errmsg="必须指定SMTP服务器";   
319return false;   
320} 
321
322return SendEmail();   
323  
324} 
325
326  
327/// <summary>   
328/// 发送邮件方法   
329/// </summary>   
330/// <param name="smtpserver"/>smtp服务器信息,如"username:[email protected]:25",也可去掉部分次要信息,如" www.smtpserver.com"   
331public bool Send(string smtpserver)   
332{   
333  
334MailDomain=smtpserver;   
335return Send();   
336} 
337
338  
339/// <summary>   
340/// 发送邮件方法   
341/// </summary>   
342/// <param name="smtpserver"/>smtp服务器信息,如"username:[email protected]:25",也可去掉部分次要信息,如" www.smtpserver.com"   
343/// <param name="from"/>发件人mail地址   
344/// <param name="fromname"/>发件人姓名   
345/// <param name="to"/>收件人地址   
346/// <param name="toname"/>收件人姓名   
347/// <param name="html"/>是否HTML邮件   
348/// <param name="subject"/>邮件主题   
349/// <param name="body"/>邮件正文   
350public bool Send(string smtpserver,string from,string fromname,string to,string toname,bool html,string subject,string body)   
351{   
352MailDomain=smtpserver;   
353From=from;   
354FromName=fromname;   
355AddRecipient(to);   
356RecipientName=toname;   
357Html=html;   
358Subject=subject;   
359Body=body;   
360return Send();   
361}   
362  
363  
364}   
365}</recipient.count;i++)></recipient.count;i++)></str.length;i++)></str.length;i++)></recipientmaxnum)></enter></enter></forward-path></forward-path>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus