c#发送需要smtp认证的邮件

-------------------------调用类 -----------------------------------
private void SendMaill(string username,string superpassword,string email) {
string body="尊敬的用户:

1<br/>
1<br/>

您好!

1<br/>
1<br/>

你的登录用户名是:"+username+"这是你的超级密码:"+superpassword
+"为了您的账号安全,我们建议您在收到邮件的72小时之内,到官方网站进行修改,并把该邮件删除。"
+"

1<br/>
1<br/>

"
+" 如有任何疑问,欢迎致电×××××发展有限责任公司客服热线:028-×××××××,我们将热情为您解答。"
+" 感谢您的支持!

1<br/>
1<br/>

"
+"                                          ××××××发展有限责任公司

1<br/>
1<br/>

"
+"                                          "+System.DateTime.Now.Year+"年"+System.DateTime.Now.Month+"月"+System.DateTime.Now.Day+"日

1<br/>
1<br/>

"
+"                                          官网: http://www.×××××.com

1<br/>
1<br/>

"
+"                                          ××××: http://www.××××.com ";

lion_office.Data.Library.MailClass.ESmtpMail sm=new lion_office.Data.Library.MailClass.ESmtpMail();
sm.Send("mail.××××.com",
" ×××@××××.com ",
"××客服",
email,
username,
true,
"×××官方网站密码找回邮件",
body
);

Session.Remove("dd");
Response.Redirect("FindSPassOK.aspx");
}

-------------------------基类---------------------

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:paswww.server.com:25",也可省略次要信息。如"user:paswww.server.com" 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/// <summary>   
 45/// 得到上传附件的文件流   
 46/// </summary>   
 47/// <param name="FilePath"/>附件的绝对路径   
 48private string GetStream(string FilePath)   
 49{   
 50//建立文件流对象   
 51System.IO.FileStream FileStr=new System.IO.FileStream(FilePath,System.IO.FileMode.Open);   
 52byte[] by=new byte[System.Convert.ToInt32(FileStr.Length)];   
 53FileStr.Read(by,0,by.Length);   
 54FileStr.Close();   
 55return(System.Convert.ToBase64String(by));   
 56} 
 57
 58  
 59/// <summary>   
 60/// 添加邮件附件   
 61/// </summary>   
 62/// <param name="path"/>附件绝对路径   
 63public void AddAttachment(string path)   
 64{   
 65Attachments.Add(path);   
 66}   
 67  
 68
 69
 70/// <summary>   
 71/// 添加一个收件人   
 72/// </summary>   
 73/// <param name="str"/>收件人地址   
 74public bool AddRecipient(string str)   
 75{   
 76str=str.Trim();   
 77if(str==null||str==" "||str.IndexOf("@")==-1 )   
 78return true;   
 79if(RecipientNum<recipientmaxnum) ;="" <summary="" else="" errmsg+="收件人过多" false;="" recipient.add(recipientnum,str);="" recipientnum++;="" return="" true;="" {="" }="">   
 80/// 最多收件人数量   
 81///    
 82public int RecipientMaxNum   
 83{   
 84set   
 85{   
 86recipientmaxnum = value;   
 87}   
 88} 
 89
 90  
 91/// <summary>   
 92/// 添加一组收件人(不超过recipientmaxnum个),参数为字符串数组   
 93/// </summary>   
 94/// <param name="str"/>保存有收件人地址的字符串数组(不超过recipientmaxnum个)   
 95public bool AddRecipient(string[] str)   
 96{   
 97for(int i=0;i<str.length;i++) <summary="" false;="" if(!addrecipient(str[i]))="" return="" true;="" {="" }="">   
 98/// 发送SMTP命令   
 99///    
100private bool SendCommand(string str)   
101{   
102byte[] WriteBuffer;   
103if(str==null||str.Trim()=="")   
104{   
105return true;   
106}   
107logs+=str;   
108WriteBuffer = Encoding.Default.GetBytes(str);   
109try   
110{   
111ns.Write(WriteBuffer,0,WriteBuffer.Length);   
112}   
113catch   
114{   
115errmsg="网络连接错误";   
116return false;   
117}   
118return true;   
119} 
120
121/// <summary>   
122/// 接收SMTP服务器回应   
123/// </summary>   
124private string RecvResponse()   
125{   
126int StreamSize;   
127string Returnvalue = "";   
128byte[] ReadBuffer = new byte[1024] ;   
129try   
130{   
131StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length);   
132}   
133catch   
134{   
135errmsg="网络连接错误";   
136return "false";   
137} 
138
139if (StreamSize==0)   
140{   
141return Returnvalue ;   
142}   
143else   
144{   
145Returnvalue = Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize);   
146logs+=Returnvalue;   
147return Returnvalue;   
148}   
149} 
150
151  
152/// <summary>   
153/// 与服务器交互,发送一条命令并接收回应。   
154/// </summary>   
155/// <param name="Command"/>一个要发送的命令   
156/// <param name="errstr"/>如果错误,要反馈的信息   
157private bool Dialog(string str,string errstr)   
158{   
159if(str==null||str.Trim()=="")   
160{   
161return true;   
162}   
163if(SendCommand(str))   
164{   
165string RR=RecvResponse();   
166if(RR=="false")   
167{   
168return false;   
169}   
170string RRCode=RR.Substring(0,3);   
171if(RightCodeHT[RRCode]!=null)   
172{   
173return true;   
174}   
175else   
176{   
177if(ErrCodeHT[RRCode]!=null)   
178{   
179errmsg+=(RRCode+ErrCodeHT[RRCode].ToString());   
180errmsg+=enter;   
181}   
182else   
183{   
184errmsg+=RR;   
185}   
186errmsg+=errstr;   
187return false;   
188}   
189}   
190else   
191{   
192return false;   
193} 
194
195} 
196
197  
198/// <summary>   
199/// 与服务器交互,发送一组命令并接收回应。   
200/// </summary>
201
202private bool Dialog(string[] str,string errstr)   
203{   
204for(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;   
205if(!Dialog(SendBufferstr,"发件人地址错误,或不能为空"))   
206return false; 
207
208//   
209SendBuffer=new string[recipientmaxnum];   
210for(int i=0;i<recipient.count;i++) +="" +"="" recipient[i].tostring()="" sendbuffer[i]="RCPT TO:&lt;" {="">" + enter; 
211
212}   
213if(!Dialog(SendBuffer,"收件人地址有误"))   
214return false; 
215
216SendBufferstr="DATA" + enter;   
217if(!Dialog(SendBufferstr,""))   
218return false; 
219
220SendBufferstr="From:" + FromName + "&lt;" + From +"&gt;" +enter; 
221
222SendBufferstr += "To:=?"+Charset.ToUpper()+"?B?"+Base64Encode(RecipientName)+"?="+"&lt;"+Recipient[0]+"&gt;"+enter;   
223SendBufferstr+="CC:";   
224for(int i=0;i<recipient.count;i++) "<"="" +="" +"="" recipient[i].tostring()="" sendbufferstr+="Recipient[i].ToString()" {="">,";   
225}   
226SendBufferstr+=enter; 
227
228  
229if(Charset=="")   
230{   
231SendBufferstr+="Subject:" + Subject + enter;   
232}   
233else   
234{   
235SendBufferstr+="Subject:" + "=?" + Charset.ToUpper() + "?B?" + Base64Encode(Subject) +"?=" +enter;   
236} 
237
238SendBufferstr+="X-Priority:" + priority + enter;   
239SendBufferstr+="X-MSMail-Priority:" + priority + enter;   
240SendBufferstr+="Importance:" + priority + enter;   
241SendBufferstr+="X-Mailer: Huolx.Pubclass" + enter;   
242SendBufferstr+="MIME-Version: 1.0" + enter; 
243
244SendBufferstr += "Content-Type: multipart/mixed;"+enter;//内容格式和分隔符   
245SendBufferstr += " boundary=\"----=_NextPart_000_00D6_01C29593.AAB31770\""+enter;   
246SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter; 
247
248if(Html)   
249{   
250SendBufferstr+="Content-Type: text/html;" + enter;   
251}   
252else   
253{   
254SendBufferstr+="Content-Type: text/plain;" + enter;   
255} 
256
257if(Charset=="")   
258{   
259SendBufferstr+=" charset=\"iso-8859-1\"" + enter;   
260}   
261else   
262{   
263SendBufferstr+=" charset=\"" + Charset.ToLower() + "\"" + enter;   
264}   
265//SendBufferstr += "Content-Transfer-Encoding: base64"+enter; 
266
267SendBufferstr+="Content-Transfer-Encoding: base64" + enter + enter; 
268
269SendBufferstr+= Base64Encode(Body) + enter;   
270if(Attachments.Count!=0)   
271{   
272foreach(string filepath in Attachments)   
273{   
274  
275SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter;   
276SendBufferstr += "Content-Type: application/octet-stream"+enter;   
277SendBufferstr += " name=\"=?"+Charset.ToUpper()+"?B?"+Base64Encode(filepath.Substring(filepath.LastIndexOf(" \\\")+1))+"?=\""+enter ;   
278SendBufferstr += "Content-Transfer-Encoding: base64"+enter;   
279SendBufferstr += "Content-Disposition: attachment;"+enter;   
280SendBufferstr += " filename=\"=?"+Charset.ToUpper()+"?B?"+Base64Encode(filepath.Substring(filepath.LastIndexOf(" \\\")+1))+"?=\""+enter+enter ;   
281SendBufferstr += GetStream(filepath)+enter+enter;   
282}   
283}   
284SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770--"+enter+enter;   
285  
286  
287SendBufferstr += enter + "." + enter; 
288
289if(!Dialog(SendBufferstr,"错误信件信息"))   
290return false; 
291
292  
293SendBufferstr="QUIT" + enter;   
294if(!Dialog(SendBufferstr,"断开连接时错误"))   
295return false; 
296
297  
298ns.Close();   
299tc.Close();   
300return true;   
301} 
302
303  
304/// <summary>   
305/// 发送邮件方法,所有参数均通过属性设置。   
306/// </summary>   
307public bool Send()   
308{   
309if(Recipient.Count==0)   
310{   
311errmsg="收件人列表不能为空";   
312return false;   
313} 
314
315if(mailserver.Trim()=="")   
316{   
317errmsg="必须指定SMTP服务器";   
318return false;   
319} 
320
321return SendEmail();   
322  
323} 
324
325  
326/// <summary>   
327/// 发送邮件方法   
328/// </summary>   
329/// <param name="smtpserver"/>smtp服务器信息,如"username:passwordwww.smtpserver.com:25",也可去掉部分次要信息,如 www.smtpserver.com"   
330public bool Send(string smtpserver)   
331{   
332  
333MailDomain=smtpserver;   
334return Send();   
335} 
336
337  
338/// <summary>   
339/// 发送邮件方法   
340/// </summary>   
341/// <param name="smtpserver"/>smtp服务器信息,如"username:passwordwww.smtpserver.com:25",也可去掉部分次要信息,如 www.smtpserver.com"   
342/// <param name="from"/>发件人mail地址   
343/// <param name="fromname"/>发件人姓名   
344/// <param name="to"/>收件人地址   
345/// <param name="toname"/>收件人姓名   
346/// <param name="html"/>是否HTML邮件   
347/// <param name="subject"/>邮件主题   
348/// <param name="body"/>邮件正文   
349public bool Send(string smtpserver,string from,string fromname,string to,string toname,bool html,string subject,string body)   
350{   
351MailDomain=smtpserver;   
352From=from;   
353FromName=fromname;   
354AddRecipient(to);   
355RecipientName=toname;   
356Html=html;   
357Subject=subject;   
358Body=body;   
359return Send();   
360}   
361  
362  
363}   
364}</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