📄 esmtp.cs
字号:
}
}
return true;
}
/// <summary>
/// 添加一个密件收件人
/// </summary>
/// <param name="str">收件人地址</param>
public bool AddRecipientBCC(string str)
{
if (str == null || str.Trim() == "")
return true;
if(RecipientBCCNum < 10)
{
RecipientBCC.Add(RecipientBCCNum,str);
RecipientBCCNum ++;
return true;
}
else
{
errmsg += "收件人过多";
return false;
}
}
/// <summary>
/// 添加一组密件收件人(不超过10个),参数为字符串数组
/// </summary>
/// <param name="str">保存有收件人地址的字符串数组(不超过10个)</param>
public bool AddRecipientBCC(string[] str)
{
for(int i = 0; i < str.Length; i ++)
{
if (!AddRecipientBCC(str[i]))
{
return false;
}
}
return true;
}
/// <summary>
/// 发送SMTP命令
/// </summary>
private bool SendCommand(string Command)
{
byte[] WriteBuffer;
if(Command == null || Command.Trim() == "")
{
return true;
}
logs += Command;
WriteBuffer = Encoding.Default.GetBytes(Command);
try
{
ns.Write(WriteBuffer,0,WriteBuffer.Length);
}
catch
{
errmsg = "网络连接错误";
return false;
}
return true;
}
/// <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
{
if(ErrCodeHT[RRCode] != null)
{
errmsg += (RRCode+ErrCodeHT[RRCode].ToString());
errmsg += enter;
}
else
{
errmsg += RR;
}
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;
if (ReplyTo.Trim() != "")
{
SendBufferstr += "Reply-To: " + ReplyTo + 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 (Charset == "")
{
SendBufferstr += "Subject:" + Subject + enter;
}
else
{
SendBufferstr += "Subject:" + "=?" + Charset.ToUpper() + "?B?" + Base64Encode(Subject) + "?=" + enter;
}
SendBufferstr += "X-Priority:" + priority + enter;
SendBufferstr += "X-MSMail-Priority:" + priority + enter;
SendBufferstr += "Importance:" + priority + enter;
SendBufferstr += "X-Mailer: PowBoard" + 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 += 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:password@www.smtpserver.com:25",也可去掉部分次要信息,如"www.smtpserver.com"</param>
public bool Send(string smtpserver)
{
MailDomain = smtpserver;
return Send();
}
/// <summary>
/// 发送邮件方法
/// </summary>
/// <param name="smtpserver">smtp服务器信息,如"username:password@www.smtpserver.com: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();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -