国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

用c#寫的smtp郵件發(fā)送類

2024-07-21 02:25:41
字體:
供稿:網(wǎng)友
//**********************created by chen**************************
using system;
using system.io;
using system.text;
using system.net;
using system.net.sockets;
using system.collections;
using system.collections.specialized;
using ksn.exceptions;
using ksn.validate;
namespace ksn.web.mail
{
/// <summary>
/// 郵件內(nèi)容
/// </summary>
public class mailmessage
{
private string sender=null;
private stringcollection receivers=new stringcollection();
private string subject="";
private string xmailer="";
private stringcollection attachments=new stringcollection();
private mailencodings mailencoding=mailencodings.gb2312;
private mailtypes mailtype=mailtypes.html;
private byte[] mailbody=null;
/// <summary>
/// 獲取或設(shè)置發(fā)件人
/// </summary>
public string sender
{
get{return this.sender;}
set{this.sender=value;}
}
/// <summary>
/// 獲取收件人地址集合
/// </summary>
public stringcollection receivers
{
get{return this.receivers;}
}
/// <summary>
/// 獲取或設(shè)置郵件主題
/// </summary>
public string subject
{
get{return this.subject;}
set{this.subject=value;}
}
/// <summary>
/// 獲取或設(shè)置郵件傳送者
/// </summary>
public string xmailer
{
get{return this.xmailer;}
set{this.xmailer=value;}
}
/// <summary>
/// 獲取附件列表
/// </summary>
public stringcollection attachments
{
get{return this.attachments;}
}
/// <summary>
/// 獲取或設(shè)置郵件的編碼方式
/// </summary>
public mailencodings mailencoding
{
get{return this.mailencoding;}
set{this.mailencoding=value;}
}
/// <summary>
/// 獲取或設(shè)置郵件格式
/// </summary>
public mailtypes mailtype
{
get{return this.mailtype;}
set{this.mailtype=value;}
}
/// <summary>
/// 獲取或設(shè)置郵件正文
/// </summary>
public byte[] mailbody
{
get{return this.mailbody;}
set{this.mailbody=value;}
}
}
/// <summary>
/// 郵件編碼
/// </summary>
public enum mailencodings
{
gb2312,
ascii,
unicode,
utf8
}
/// <summary>
/// 郵件格式
/// </summary>
public enum mailtypes
{
html,
text
}
/// <summary>
/// smtp服務(wù)器的驗證方式
/// </summary>
public enum smtpvalidatetypes
{
/// <summary>
/// 不需要驗證
/// </summary>
none,
/// <summary>
/// 通用的auth login驗證
/// </summary>
login,
/// <summary>
/// 通用的auth plain驗證
/// </summary>
plain,
/// <summary>
/// cram-md5驗證
/// </summary>
crammd5
}
/// <summary>
/// 郵件發(fā)送類
/// </summary>
public class ksn_smtp
{
#region "member fields"
/// <summary>
/// 連接對象
/// </summary>
private tcpclient tc;
/// <summary>
/// 網(wǎng)絡(luò)流
/// </summary>
private networkstream ns;
/// <summary>
/// 錯誤的代碼字典
/// </summary>
private stringdictionary errorcodes=new stringdictionary();
/// <summary>
/// 操作執(zhí)行成功后的響應(yīng)代碼字典
/// </summary>
private stringdictionary rightcodes=new stringdictionary();
/// <summary>
/// 執(zhí)行過程中錯誤的消息
/// </summary>
private string errormessage="";
/// <summary>
/// 記錄操作日志
/// </summary>
private string logs="";
/// <summary>
/// 主機登陸的驗證方式
/// </summary>
private stringcollection validatetypes=new stringcollection();
/// <summary>
/// 換行常數(shù)
/// </summary>
private const string crlf="/r/n";
private string servername="smtp";
private string logpath=null;
private string userid=null;
private string password=null;
private string mailencodingname="gb2312";
private bool sendiscomplete=false;
private smtpvalidatetypes smtpvalidatetype=smtpvalidatetypes.login;
#endregion
#region "propertys"
/// <summary>
/// 獲取最后一此程序執(zhí)行中的錯誤消息
/// </summary>
public string errormessage
{
get{return this.errormessage;}
}
/// <summary>
/// 獲取或設(shè)置日志輸出路徑
/// </summary>
public string logpath
{
get
{
return this.logpath;
}
set{this.logpath=value;}
}
/// <summary>
/// 獲取或設(shè)置登陸smtp服務(wù)器的帳號
/// </summary>
public string userid
{
get{return this.userid;}
set{this.userid=value;}
}
/// <summary>
/// 獲取或設(shè)置登陸smtp服務(wù)器的密碼
/// </summary>
public string password
{
get{return this.password;}
set{this.password=value;}
}
/// <summary>
/// 獲取或設(shè)置要使用登陸smtp服務(wù)器的驗證方式
/// </summary>
public smtpvalidatetypes smtpvalidatetype
{
get{return this.smtpvalidatetype;}
set{this.smtpvalidatetype=value;}
}
#endregion
#region "construct functions"
/// <summary>
/// 構(gòu)造函數(shù)
/// </summary>
/// <param name="server">主機名</param>
/// <param name="port">端口</param>
public ksn_smtp(string server,int port)
{
tc=new tcpclient(server,port);
ns=tc.getstream();
this.servername=server;
this.initialfields();
}
/// <summary>
/// 構(gòu)造函數(shù)
/// </summary>
/// <param name="ip">主機ip</param>
/// <param name="port">端口</param>
public ksn_smtp(ipaddress ip,int port)
{
ipendpoint endpoint=new ipendpoint(ip,port);
tc=new tcpclient(endpoint);
ns=tc.getstream();
this.servername=ip.tostring();
this.initialfields();
}
#endregion
#region "methods"
private void initialfields() //初始化連接
{
logs="================"+datetime.now.tolongdatestring()+" "+datetime.now.tolongtimestring()+"==============="+crlf;
//*****************************************************************
//錯誤的狀態(tài)碼
//*****************************************************************
errorcodes.add("421","服務(wù)未就緒,關(guān)閉傳輸通道");
errorcodes.add("432","需要一個密碼轉(zhuǎn)換");
errorcodes.add("450","要求的郵件操作未完成,郵箱不可用(如:郵箱忙)");
errorcodes.add("451","放棄要求的操作,要求的操作未執(zhí)行");
errorcodes.add("452","系統(tǒng)存儲不足,要求的操作未完成");
errorcodes.add("454","臨時的認證失敗");
errorcodes.add("500","郵箱地址錯誤");
errorcodes.add("501","參數(shù)格式錯誤");
errorcodes.add("502","命令不可實現(xiàn)");
errorcodes.add("503","命令的次序不正確");
errorcodes.add("504","命令參數(shù)不可實現(xiàn)");
errorcodes.add("530","需要認證");
errorcodes.add("534","認證機制過于簡單");
errorcodes.add("538","當前請求的認證機制需要加密");
errorcodes.add("550","當前的郵件操作未完成,郵箱不可用(如:郵箱未找到或郵箱不能用)");
errorcodes.add("551","用戶非本地,請嘗試<forward-path>");
errorcodes.add("552","過量的存儲分配,制定的操作未完成");
errorcodes.add("553","郵箱名不可用,如:郵箱地址的格式錯誤");
errorcodes.add("554","傳送失敗");
errorcodes.add("535","用戶身份驗證失敗");
//****************************************************************
//操作執(zhí)行成功后的狀態(tài)碼
//****************************************************************
rightcodes.add("220","服務(wù)就緒");
rightcodes.add("221","服務(wù)關(guān)閉傳輸通道");
rightcodes.add("235","驗證成功");
rightcodes.add("250","要求的郵件操作完成");
rightcodes.add("251","非本地用戶,將轉(zhuǎn)發(fā)向<forward-path>");
rightcodes.add("334","服務(wù)器響應(yīng)驗證base64字符串");
rightcodes.add("354","開始郵件輸入,以<crlf>.<crlf>結(jié)束");
//讀取系統(tǒng)回應(yīng)
streamreader reader=new streamreader(ns);
logs+=reader.readline()+crlf;
}
/// <summary>
/// 向smtp發(fā)送命令
/// </summary>
/// <param name="cmd"></param>
private string sendcommand(string cmd,bool ismaildata)
{
if(cmd!=null && cmd.trim()!=string.empty)
{
byte[] cmd_b=null;
if(!ismaildata)//不是郵件數(shù)據(jù)
cmd+=crlf;

logs+=cmd;
//開始寫入郵件數(shù)據(jù)
if(!ismaildata)
{
cmd_b=encoding.ascii.getbytes(cmd);
ns.write(cmd_b,0,cmd_b.length);
}
else
{
cmd_b=encoding.getencoding(this.mailencodingname).getbytes(cmd);
ns.beginwrite(cmd_b,0,cmd_b.length,new asynccallback(this.asynccallback),null);
}
//讀取服務(wù)器響應(yīng)
streamreader reader=new streamreader(ns);
string response=reader.readline();
logs+=response+crlf;
//檢查狀態(tài)碼
string statuscode=response.substring(0,3);
bool isexist=false;
bool isrightcode=true;
foreach(string err in this.errorcodes.keys)
{
if(statuscode==err)
{
isexist=true;
isrightcode=false;
break;
}
}
foreach(string right in this.rightcodes.keys)
{
if(statuscode==right)
{
isexist=true;
break;
}
}
//根據(jù)狀態(tài)碼來處理下一步的動作
if(!isexist) //不是合法的smtp主機
{
this.seterror("不是合法的smtp主機,或服務(wù)器拒絕服務(wù)");
}
else if(!isrightcode)//命令沒能成功執(zhí)行
{
this.seterror(statuscode+":"+this.errorcodes[statuscode]);
}
else //命令成功執(zhí)行
{
this.errormessage="";
}
return response;
}
else
{
return null;
}
}
/// <summary>
/// 通過auth login方式登陸smtp服務(wù)器
/// </summary>
private void landingbylogin()
{
string base64userid=this.convertbase64string(this.userid,"ascii");
string base64pass=this.convertbase64string(this.password,"ascii");
//握手
this.sendcommand("helo "+this.servername,false);
//開始登陸
this.sendcommand("auth login",false);
this.sendcommand(base64userid,false);
this.sendcommand(base64pass,false);
}
/// <summary>
/// 通過auth plain方式登陸服務(wù)器
/// </summary>
private void landingbyplain()
{
string null=((char)0).tostring();
string loginstr=null+this.userid+null+this.password;
string base64loginstr=this.convertbase64string(loginstr,"ascii");
//握手
this.sendcommand("helo "+this.servername,false);
//登陸
this.sendcommand(base64loginstr,false);
}
/// <summary>
/// 通過auth cram-md5方式登陸
/// </summary>
private void landingbycrammd5()
{
//握手
this.sendcommand("helo "+this.servername,false);
//登陸
string response=this.sendcommand("auth cram-md5",false);
//得到服務(wù)器返回的標識
string identifier=response.remove(0,4);
//用md5加密標識
ksn_mactripledes mac=new ksn_mactripledes();
mac.key=this.password;
mac.data=encoding.ascii.getbytes(identifier);
string hash=mac.gethashvalue();
//發(fā)送用戶帳號信息
this.sendcommand(this.userid+" "+hash,false);
}
/// <summary>
/// 發(fā)送郵件
/// </summary>
/// <returns></returns>
public bool sendmail(mailmessage mail)
{
bool issended=true;
try
{
//檢測發(fā)送郵件的必要條件
if(mail.sender==null)
{
this.seterror("沒有設(shè)置發(fā)信人");
}
if(mail.receivers.count==0)
{
this.seterror("至少要有一個收件人");
}
if(this.smtpvalidatetype!=smtpvalidatetypes.none)
{
if(this.userid==null || this.password==null)
{
this.seterror("當前設(shè)置需要smtp驗證,但是沒有給出登陸帳號");
}
}
//開始登陸
switch(this.smtpvalidatetype)
{
case smtpvalidatetypes.none:
this.sendcommand("helo "+this.servername,false);
break;
case smtpvalidatetypes.login:
this.landingbylogin();
break;
case smtpvalidatetypes.plain:
this.landingbyplain();
break;
case smtpvalidatetypes.crammd5:
this.landingbycrammd5();
break;
default:
break;
}
//初始化郵件會話(對應(yīng)smtp命令mail)
this.sendcommand("mail from:<"+mail.sender+">",false);
//標識收件人(對應(yīng)smtp命令rcpt)
foreach(string receive in mail.receivers)
{
this.sendcommand("rcpt to:<"+receive+">",false);
}
//標識開始輸入郵件內(nèi)容(data)
this.sendcommand("data",false);
//開始編寫郵件內(nèi)容
string message="subject:"+mail.subject+crlf;
message+="x-mailer:"+mail.xmailer+crlf;
message+="mime-version:1.0"+crlf;
if(mail.attachments.count==0)//沒有附件
{
if(mail.mailtype==mailtypes.text) //文本格式
{
message+="content-type:text/plain;"+crlf+" ".padright(8,' ')+"charset=/""+
mail.mailencoding.tostring()+"/""+crlf;
message+="content-transfer-encoding:base64"+crlf+crlf;
if(mail.mailbody!=null)
message+=convert.tobase64string(mail.mailbody,0,mail.mailbody.length)+crlf+crlf+crlf+"."+crlf;
}
else//html格式
{
message+="content-type:multipart/alertnative;"+crlf+" ".padright(8,' ')+"boundary"
+"=/"=====003_dragon310083331177_=====/""+crlf+crlf+crlf;
message+="this is a multi-part message in mime format"+crlf+crlf;
message+="--=====003_dragon310083331177_====="+crlf;
message+="content-type:text/html;"+crlf+" ".padright(8,' ')+"charset=/""+
mail.mailencoding.tostring().tolower()+"/""+crlf;
message+="content-transfer-encoding:base64"+crlf+crlf;
if(mail.mailbody!=null)
message+=convert.tobase64string(mail.mailbody,0,mail.mailbody.length)+crlf+crlf;
message+="--=====003_dragon310083331177_=====--"+crlf+crlf+crlf+"."+crlf;
}
}
else//有附件
{
//處理要在郵件中顯示的每個附件的數(shù)據(jù)
stringcollection attatchmentdatas=new stringcollection();
foreach(string path in mail.attachments)
{
if(!file.exists(path))
{
this.seterror("指定的附件沒有找到"+path);
}
else
{
//得到附件的字節(jié)流
fileinfo file=new fileinfo(path);
filestream fs=new filestream(path,filemode.open,fileaccess.read);
if(fs.length>(long)int.maxvalue)
{
this.seterror("附件的大小超出了最大限制");
}
byte[] file_b=new byte[(int)fs.length];
fs.read(file_b,0,file_b.length);
fs.close();
string attatchmentmailstr="content-type:application/octet-stream;"+crlf+" ".padright(8,' ')+"name="+
"/""+file.name+"/""+crlf;
attatchmentmailstr+="content-transfer-encoding:base64"+crlf;
attatchmentmailstr+="content-disposition:attachment;"+crlf+" ".padright(8,' ')+"filename="+
"/""+file.name+"/""+crlf+crlf;
attatchmentmailstr+=convert.tobase64string(file_b,0,file_b.length)+crlf+crlf;
attatchmentdatas.add(attatchmentmailstr);
}
}
//設(shè)置郵件信息
if(mail.mailtype==mailtypes.text) //文本格式
{
message+="content-type:multipart/mixed;"+crlf+" ".padright(8,' ')+"boundary=/"=====001_dragon320037612222_=====/""
+crlf+crlf;
message+="this is a multi-part message in mime format."+crlf+crlf;
message+="--=====001_dragon320037612222_====="+crlf;
message+="content-type:text/plain;"+crlf+" ".padright(8,' ')+"charset=/""+mail.mailencoding.tostring().tolower()+"/""+crlf;
message+="content-transfer-encoding:base64"+crlf+crlf;
if(mail.mailbody!=null)
message+=convert.tobase64string(mail.mailbody,0,mail.mailbody.length)+crlf;
foreach(string s in attatchmentdatas)
{
message+="--=====001_dragon320037612222_====="+crlf+s+crlf+crlf;
}
message+="--=====001_dragon320037612222_=====--"+crlf+crlf+crlf+"."+crlf;
}
else
{
message+="content-type:multipart/mixed;"+crlf+" ".padright(8,' ')+"boundary=/"=====001_dragon255511664284_=====/""
+crlf+crlf;
message+="this is a multi-part message in mime format."+crlf+crlf;
message+="--=====001_dragon255511664284_====="+crlf;
message+="content-type:text/html;"+crlf+" ".padright(8,' ')+"charset=/""+mail.mailencoding.tostring().tolower()+"/""+crlf;
message+="content-transfer-encoding:base64"+crlf+crlf;
if(mail.mailbody!=null)
message+=convert.tobase64string(mail.mailbody,0,mail.mailbody.length)+crlf+crlf;
for(int i=0;i<attatchmentdatas.count;i++)
{
message+="--=====001_dragon255511664284_====="+crlf+attatchmentdatas[i]+crlf+crlf;
}
message+="--=====001_dragon255511664284_=====--"+crlf+crlf+crlf+"."+crlf;
}
}
//發(fā)送郵件數(shù)據(jù)
this.mailencodingname=mail.mailencoding.tostring();
this.sendcommand(message,true);
if(this.sendiscomplete)
this.sendcommand("quit",false);
}
catch
{
issended=false;
}
finally
{
this.disconnect();
//輸出日志文件
if(this.logpath!=null)
{
filestream fs=null;
if(file.exists(this.logpath))
{
fs=new filestream(this.logpath,filemode.append,fileaccess.write);
this.logs=crlf+crlf+this.logs;
}
else
fs=new filestream(this.logpath,filemode.create,fileaccess.write);
byte[] logpath_b=encoding.getencoding("gb2312").getbytes(this.logs);
fs.write(logpath_b,0,logpath_b.length);
fs.close();
}
}
return issended;
}
/// <summary>
/// 異步寫入數(shù)據(jù)
/// </summary>
/// <param name="result"></param>
private void asynccallback(iasyncresult result)
{
if(result.iscompleted)
this.sendiscomplete=true;
}
/// <summary>
/// 關(guān)閉連接
/// </summary>
private void disconnect()
{
try
{
ns.close();
tc.close();
}
catch
{
;
}
}
/// <summary>
/// 設(shè)置出現(xiàn)錯誤時的動作
/// </summary>
/// <param name="errorstr"></param>
private void seterror(string errorstr)
{
this.errormessage=errorstr;
logs+=this.errormessage+crlf+"【郵件處理動作中止】"+crlf;
this.disconnect();
throw new applicationexception("");
}
/// <summary>
///將字符串轉(zhuǎn)換為base64
/// </summary>
/// <param name="str"></param>
/// <param name="encodingname"></param>
/// <returns></returns>
private string convertbase64string(string str,string encodingname)
{
byte[] str_b=encoding.getencoding(encodingname).getbytes(str);
return convert.tobase64string(str_b,0,str_b.length);
}
#endregion
}
}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 色达县| 华宁县| 汝阳县| 安西县| 巴东县| 临沭县| 崇文区| 阿荣旗| 达孜县| 唐河县| 雷波县| 郓城县| 黄浦区| 高密市| 隆化县| 厦门市| 苏州市| 木里| 浦县| 文昌市| 金秀| 集安市| 平顶山市| 濮阳市| 博罗县| 景洪市| 黔西| 壶关县| 湘潭县| 阿克苏市| 原阳县| 美姑县| 封丘县| 电白县| 兰溪市| 阳朔县| 碌曲县| 贵南县| 女性| 杭州市| 昔阳县|