-------------------------调用类 -----------------------------------
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:<" 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:<" {="">" + enter;
211
212}
213if(!Dialog(SendBuffer,"收件人地址有误"))
214return false;
215
216SendBufferstr="DATA" + enter;
217if(!Dialog(SendBufferstr,""))
218return false;
219
220SendBufferstr="From:" + FromName + "<" + From +">" +enter;
221
222SendBufferstr += "To:=?"+Charset.ToUpper()+"?B?"+Base64Encode(RecipientName)+"?="+"<"+Recipient[0]+">"+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>