C#实现SMTP服务器.docx
- 文档编号:9266082
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:30
- 大小:21.42KB
C#实现SMTP服务器.docx
《C#实现SMTP服务器.docx》由会员分享,可在线阅读,更多相关《C#实现SMTP服务器.docx(30页珍藏版)》请在冰豆网上搜索。
C#实现SMTP服务器
C#实现SMTP服务器,使用TCP命令实现
usingSystem;
usingSystem.Text;
usingSystem.IO;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Collections;
namespaceSkyDev.Web.Mail
{
publicenumMailFormat{Text,HTML};
publicenumMailPriority{Low=1,Normal=3,High=5};
#regionClassmailAttachments
publicclassMailAttachments
{
privateconstintMaxAttachmentNum=10;
privateIList_Attachments;
publicMailAttachments()
{
_Attachments=newArrayList();
}
publicstringthis[intindex]
{
get{return(string)_Attachments[index];}
}
///
///添加邮件附件
///
///
publicvoidAdd(paramsstring[]filePath)
{
if(filePath==null)
{
throw(newArgumentNullException("非法的附件"));
}
else
{
for(inti=0;i { Add(filePath[i]); } } } /// ///添加一个附件,当指定的附件不存在时,忽略该附件,不产生异常。 /// /// publicvoidAdd(stringfilePath) { //当附件存在时才加入,否则忽略 if(System.IO.File.Exists(filePath)) { if(_Attachments.Count { _Attachments.Add(filePath); } } } publicvoidClear()//清除所有附件 { _Attachments.Clear(); } publicintCount//获取附件个数 { get{return_Attachments.Count;} } } #endregion//endClassmailAttachments #regionClassMailMessage /// ///MailMessage表示SMTP要发送的一封邮件的消息。 /// publicclassMailMessage { privateconstintMaxRecipientNum=10; publicMailMessage() { _Recipients=newArrayList();//收件人列表 _Attachments=newMailAttachments();//附件 _BodyFormat=MailFormat.Text;//缺省的邮件格式为Text _Priority=MailPriority.Normal; _Charset="GB2312"; } /// ///设定语言代码,默认设定为GB2312,如不需要可设置为"" /// publicstringCharset { get{return_Charset;} set{_Charset=value;} } publicstringFrom { get{return_From;} set{_From=value;} } publicstringFromName { get{return_FromName;} set{_FromName=value;} } publicstringBody { get{return_Body;} set{_Body=value;} } publicstringSubject { get{return_Subject;} set{_Subject=value;} } publicMailAttachmentsAttachments { get{return_Attachments;} set{_Attachments=value;} } publicMailPriorityPriority { get{return_Priority;} set{_Priority=value;} } publicIListRecipients { get{return_Recipients;} } /// ///增加一个收件人地址 /// /// publicvoidAddRecipients(stringrecipient) { //先检查邮件地址是否符合规范 if(_Recipients.Count { _Recipients.Add(recipient);//增加到收件人列表 } } publicvoidAddRecipients(paramsstring[]recipient) { if(recipient==null) { throw(newArgumentException("收件人不能为空.")); } else { for(inti=0;i { AddRecipients(recipient[i]); } } } publicMailFormatBodyFormat { set{_BodyFormat=value;} get{return_BodyFormat;} } privatestring_From;//发件人地址 privatestring_FromName;//发件人姓名 privateIList_Recipients;//收件人 privateMailAttachments_Attachments;//附件 privatestring_Body;//内容 privatestring_Subject;//主题 privateMailFormat_BodyFormat;//邮件格式 privatestring_Charset="GB2312";//字符编码格式 privateMailPriority_Priority;//邮件优先级 } #endregion #regionClassSmtpMail publicclassSmtpServerHelper { privatestringCRLF="\r\n";//回车换行 /// ///错误消息反馈 /// privatestringerrmsg; /// ///TcpClient对象,用于连接服务器 /// privateTcpClienttcpClient; /// ///NetworkStream对象 /// privateNetworkStreamnetworkStream; /// ///服务器交互记录 /// privatestringlogs=""; /// ///SMTP错误代码哈希表 /// privateHashtableErrCodeHT=newHashtable(); /// ///SMTP正确代码哈希表 /// privateHashtableRightCodeHT=newHashtable(); publicSmtpServerHelper() { SMTPCodeAdd();//初始化SMTPCode } ~SmtpServerHelper() { networkStream.Close(); tcpClient.Close(); } /// ///将字符串编码为Base64字符串 /// /// privatestringBase64Encode(stringstr) { byte[]barray; barray=Encoding.Default.GetBytes(str); returnConvert.ToBase64String(barray); } /// ///将Base64字符串解码为普通字符串 /// /// privatestringBase64Decode(stringstr) { byte[]barray; barray=Convert.FromBase64String(str); returnEncoding.Default.GetString(barray); } /// ///得到上传附件的文件流 /// /// privatestringGetStream(stringFilePath) { //建立文件流对象 System.IO.FileStreamFileStr=newSystem.IO.FileStream(FilePath,System.IO.FileMode.Open); byte[]by=newbyte[System.Convert.ToInt32(FileStr.Length)]; FileStr.Read(by,0,by.Length); FileStr.Close(); return(System.Convert.ToBase64String(by)); } /// ///SMTP回应代码哈希表 /// privatevoidSMTPCodeAdd() { //[RFC8214.2.1.] /* 4.2.2.NUMERICORDERLISTOFREPLYCODES 211Systemstatus,orsystemhelpreply 214Helpmessage [Informationonhowtousethereceiverorthemeaningofa particularnon-standardcommand;thisreplyisusefulonly tothehumanuser] 220 221 250Requestedmailactionokay,completed 251Usernotlocal;willforwardto 354Startmailinput;endwith 421 closingtransmissionchannel [Thismaybeareplytoanycommandiftheserviceknowsit mustshutdown] 450Requestedmailactionnottaken: mailboxunavailable [E.g.,mailboxbusy] 451Requestedactionaborted: localerrorinprocessing 452Requestedactionnottaken: insufficientsystemstorage 500Syntaxerror,commandunrecognized [Thismayincludeerrorssuchascommandlinetoolong] 501Syntaxerrorinparametersorarguments 502Commandnotimplemented 503Badsequenceofcommands 504Commandparameternotimplemented 550Requestedactionnottaken: mailboxunavailable [E.g.,mailboxnotfound,noaccess] 551Usernotlocal;pleasetry 552Requestedmailactionaborted: exceededstorageallocation 553Requestedactionnottaken: mailboxnamenotallowed [E.g.,mailboxsyntaxincorrect] 554Transactionfailed */ ErrCodeHT.Add("421","服务未就绪,关闭传输信道"); ErrCodeHT.Add("432","需要一个密码转换"); ErrCodeHT.Add("450","要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)"); ErrCodeHT.Add("451","放弃要求的操作;处理过程中出错"); ErrCodeHT.Add("452","系统存储不足,要求的操作未执行"); ErrCodeHT.Add("454","临时认证失败"); ErrCodeHT.Add("500","邮箱地址错误"); ErrCodeHT.Add("501","参数格式错误"); ErrCodeHT.Add("502","命令不可实现"); ErrCodeHT.Add("503","服务器需要SMTP验证"); ErrCodeHT.Add("504","命令参数不可实现"); ErrCodeHT.Add("530","需要认证"); ErrCodeHT.Add("534","认证机制过于简单"); ErrCodeHT.Add("538","当前请求的认证机制需要加密"); ErrCodeHT.Add("550","要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)"); ErrCodeHT.Add("551","用户非本地,请尝试 ErrCodeHT.Add("552","过量的存储分配,要求的操作未执行"); ErrCodeHT.Add("553","邮箱名不可用,要求的操作未执行(例如邮箱格式错误)"); ErrCodeHT.Add("554","传输失败"); /* 211Systemstatus,orsystemhelpreply 214Helpmessage [Informationonhowtousethereceiverorthemeaningofa particularnon-standardcommand;thisreplyisusefulonly tothehumanuser] 220 221 250Requestedmailactionokay,completed 251Usernotlocal;willforwardto 354Startmailinput;endwith */ RightCodeHT.Add("220","服务就绪"); RightCodeHT.Add("221","服务关闭传输信道"); RightCodeHT.Add("235","验证成功"); RightCodeHT.Add("250","要求的邮件操作完成"); RightCodeHT.Add("251","非本地用户,将转发向 RightCodeHT.Add("334","服务器响应验证Base64字符串"); RightCodeHT.Add("354","开始邮件输入,以 } /// ///发送SMTP命令 /// privateboolSendCommand(stringstr) { byte[]WriteBuffer; if(str==null||str.Trim()==String.Empty) { returntrue; } logs+=str; WriteBuffer=Encoding.Default.GetBytes(str); try { networkStream.Write(WriteBuffer,0,WriteBuffer.Length); } catch { errmsg="网络连接错误"; returnfalse; } returntrue; } /// ///接收SMTP服务器回应 /// privatestringRecvResponse() { intStreamSize; stringReturnvalue=String.Empty; byte[]ReadBuffer=newbyte[1024]; try { StreamSize=networkStream.Read(ReadBuffer,0,ReadBuffer.Length); } catch { errmsg="网络连接错误"; return"false"; } if(StreamSize==0) { returnReturnvalue; } else { Returnvalue=Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize); logs+=Returnvalue+this.CRLF; returnReturnvalue; } } /// ///与服务器交互,发送一条命令并接收回应。 /// /// /// privateboolDialog(stringstr,stringerrstr) { if(str==null||str.Trim()==string.Empty) { returntrue; } if(SendCommand(str)) { stringRR=RecvResponse(); if(RR=="false") { returnfalse; } //检查返回的代码,根据[RFC821]返回代码为3位数字代码如220 stringRRCode=RR.Substring(0,3); if(RightCodeHT[RRCode]! =null) { returntrue; } else { if(ErrCodeHT[RRCode]! =null) { errmsg+=(RRCode+ErrCodeHT[RRCode].ToString()); errmsg+=CRLF; } else { errmsg+=RR; } errmsg+=errstr; returnfalse; } } else { returnfalse; } } /// ///与服务器交互,发送一组命令并接收回应。 /// privateboolDialog(string[]str,stringerrstr) { for(inti=0;i { if(! Dialog(str[i],"")) { errmsg+=CRLF; errmsg+=errstr; returnfalse; } } returntrue; } //连接服务器 privateboolConnect(stringsmtpServer,intport) { //创建Tcp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 实现 SMTP 服务器