C#寫的支持SMTP驗證的發送郵件組件(2)
2024-07-21 02:24:26
供稿:網友
/// <summary>
/// 接收smtp服務器回應
/// </summary>
private string recvresponse()
{
int streamsize;
string returnvalue = "";
byte[] readbuffer = new byte[1024] ;
try
{
streamsize=ns.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;
return returnvalue;
}
}
/// <summary>
/// 與服務器交互,發送一條命令并接收回應。
/// </summary>
/// <param name="command">一個要發送的命令</param>
/// <param name="errstr">如果錯誤,要反饋的信息</param>
private bool dialog(string command,string errstr)
{
if(command==null||command.trim()=="")
{
return true;
}
if(sendcommand(command))
{
string rr=recvresponse();
if(rr=="false")
{
return false;
}
string rrcode=rr.substring(0,3);
if(rightcodeht[rrcode]!=null)
{
return true;
}
else
{
errmsg+=(rrcode+errcodeht[rrcode].tostring());
errmsg+=enter;
errmsg+=errstr;
return false;
}
}
else
{
return false;
}
}
/// <summary>
/// 與服務器交互,發送一組命令并接收回應。
/// </summary>
private bool dialog(string[] command,string errstr)
{
for(int i=0;i<command.length;i++)
{
if(!dialog(command[i],""))
{
errmsg+=enter;
errmsg+=errstr;
return false;
}
}
return true;
}
private bool sendemail()
{
//連接網絡
try
{
tc=new tcpclient(mailserver,mailserverport);
}
catch(exception e)
{
errmsg=e.tostring();
return false;
}
ns = tc.getstream();
smtpcodeadd();
//驗證網絡連接是否正確
if(rightcodeht[recvresponse().substring(0,3)]==null)
{
errmsg="網絡連接失敗";
return false;
}
string[] sendbuffer;
string sendbufferstr;
//進行smtp驗證
if(esmtp)
{
sendbuffer=new string[4];
sendbuffer[0]="ehlo " + mailserver + enter;
sendbuffer[1]="auth login" + enter;
sendbuffer[2]=base64encode(username) + enter;
sendbuffer[3]=base64encode(password) + enter;
if(!dialog(sendbuffer,"smtp服務器驗證失敗,請核對用戶名和密碼。"))
return false;
}
else
{
sendbufferstr="helo " + mailserver + enter;
if(!dialog(sendbufferstr,""))
return false;
}
//
sendbufferstr="mail from:<" + from + ">" + enter;
if(!dialog(sendbufferstr,"發件人地址錯誤"))
return false;
//
sendbuffer=new string[10];
for(int i=0;i<recipient.count;i++)
{
sendbuffer[i]="rcpt to:<" + recipient[i].tostring() +">" + enter;
}
if(!dialog(sendbuffer,"收件人地址有誤"))
return false;
sendbuffer=new string[10];
for(int i=0;i<recipientbcc.count;i++)
{
sendbuffer[i]="rcpt to:<" + recipientbcc[i].tostring() +">" + enter;
}
if(!dialog(sendbuffer,"密件收件人地址有誤"))
return false;
sendbufferstr="data" + enter;
if(!dialog(sendbufferstr,""))
return false;
sendbufferstr="from:" + fromname + "<" + from +">" +enter;
sendbufferstr+="to:" + recipientname + "<" + recipient[0] +">" +enter;
sendbufferstr+="cc:";
for(int i=1;i<recipient.count;i++)
{
sendbufferstr+=recipient[i].tostring() + "<" + recipient[i].tostring() +">,";
}
sendbufferstr+=enter;
if(replyto.trim()!="")
{
sendbufferstr+="reply-to: " + replyto + enter;
}
if(charset=="")
{
sendbufferstr+="subject:" + subject + enter;
}
else
{
sendbufferstr+="subject:" + "=?" + charset.toupper() + "?b?" + base64encode(subject) +"?=" +enter;
}
sendbufferstr+="mime-version: 1.0" + enter;
if(html)
{
sendbufferstr+="content-type: text/html;" + enter;
}
else
{
sendbufferstr+="content-type: text/plain;" + enter;
}
if(charset=="")
{
sendbufferstr+="charset=/"iso-8859-1/"" + enter;
}
else
{
sendbufferstr+="charset=/"" + charset.tolower() + "/"" + enter;
}
sendbufferstr+="content-transfer-encoding: base64" + enter;
sendbufferstr+="x-priority:" + priority + enter;
sendbufferstr+="x-msmail-priority:" + priority + enter;
sendbufferstr+="importance:" + priority + enter;
sendbufferstr+="x-mailer: huolx.pubclass" + enter;
sendbufferstr+= enter + enter;
sendbufferstr+= base64encode(body) + enter;
sendbufferstr+=enter + "." + enter;
if(!dialog(sendbufferstr,"錯誤信件信息"))
return false;
sendbufferstr="quit" + enter;
if(!dialog(sendbufferstr,"斷開連接時錯誤"))
return false;
ns.close();
tc.close();
return true;
}
/// <summary>
/// 發送郵件方法,所有參數均通過屬性設置。
/// </summary>
public bool send()
{
if(recipient.count==0)
{
errmsg="收件人列表不能為空";
return false;
}
if(recipientname=="")
recipientname=recipient[0].tostring();
if(mailserver.trim()=="")
{
errmsg="必須指定smtp服務器";
return false;
}
return sendemail();
}
/// <summary>
/// 發送郵件方法
/// </summary>
/// <param name="smtpserver">smtp服務器信息,如"username:[email protected]:25",也可去掉部分次要信息,如"www.smtpserver.com"</param>
public bool send(string smtpserver)
{
maildomain=smtpserver;
return send();
}
/// <summary>
/// 發送郵件方法
/// </summary>
/// <param name="smtpserver">smtp服務器信息,如"username:[email protected]:25",也可去掉部分次要信息,如"www.smtpserver.com"</param>
/// <param name="from">發件人mail地址</param>
/// <param name="fromname">發件人姓名</param>
/// <param name="replyto">回復郵件地址</param>
/// <param name="to">收件人地址</param>
/// <param name="toname">收件人姓名</param>
/// <param name="html">是否html郵件</param>
/// <param name="subject">郵件主題</param>
/// <param name="body">郵件正文</param>
public bool send(string smtpserver,string from,string fromname,string replyto,string to,string toname,bool html,string subject,string body)
{
maildomain=smtpserver;
from=from;
fromname=fromname;
replyto=replyto;
addrecipient(to);
recipientname=toname;
html=html;
subject=subject;
body=body;
return send();
}
}
}