改进了的一个邮件发送类

it2022-05-07  3

/****************************************************** FileName: Copyright (c) 2003-xxxx *********公司技术开发部 Writer: create Date:2004-12-20 Rewriter: Rewrite Date: Impact: Main Content:(Function Name、parameters、returns) 支持ESMTP, 多附件 ******************************************************/ using System; using System.Collections; using System.Net.Sockets; using System.IO; using System.Text; namespace Edu.Stu.Common.Mail { ///<summary> /// Module ID:0005 /// Depiction:发送邮件,支持ESMTP, 多附件 /// Wreter:Nick /// Create Date;2004-12-20 ///</summary> public class MailSender { #region "Fields" private string m_strFromName = ""; private string[] m_strTo = null; private string m_strFrom = ""; private string m_strPassWord = ""; private string m_strUserName = ""; private int m_iPort = 25; private string m_strServer = ""; private int m_iPriority = 3; private string m_strEncoding = "8bit"; private string m_strLanguageEncoding = "GB2312"; private bool m_bIs HTML = true; private string m_str HTMLBody = ""; private string m_strTxtBody = ""; private string m_strSubject = ""; private string m_strToName = ""; private ArrayList m_alAttachments = new ArrayList (); #endregion #region "Propertes" /// <summary> /// SMTP 服务器域名 /// </summary> public string Server { get { return m_strServer; } set { if (value != m_strServer) m_strServer = value; } } /// <summary> /// SMTP 服务器端口 [默认为25] /// </summary> public int Port { get { return m_iPort; } set { if (value != m_iPort) m_iPort = value; } } /// <summary> /// 用户名 [如果需要身份验证的话] /// </summary> public string UserName { get { return m_strUserName; } set { if (value != m_strUserName) m_strUserName = value; } } /// <summary> /// 密码 [如果需要身份验证的话] /// </summary> public string Password { get { return m_strPassWord; } set { if (value != m_strPassWord) m_strPassWord = value; } } /// <summary> /// 发件人地址 /// </summary> public string From { get { return m_strFrom; } set { if (value != m_strFrom) m_strFrom = value;} } /// <summary> /// 收件人地址 /// </summary> public string[] To { get { return m_strTo; } set { if (value != m_strTo) m_strTo = value;} } /// <summary> /// 发件人姓名 /// </summary> public string FromName { get { return m_strFromName; } set { if (value != m_strFromName) m_strFromName = value; } } /// <summary> /// 收件人姓名 /// </summary> public string ToName { get { return m_strToName; } set { if (value != m_strToName) m_strToName = value; } } /// <summary> /// 邮件的主题 /// </summary> public string Subject { get { return m_strSubject; } set { if (value != m_strSubject) m_strSubject = value; } } /// <summary> /// 邮件正文 /// </summary> public string Body { get { return m_strTxtBody; } set { if (value != m_strTxtBody) m_strTxtBody = value; } } /// <summary> /// 超文本格式的邮件正文 /// </summary> public string HTMLBody { get { return m_str HTMLBody; } set { if (value != m_str HTMLBody) m_str HTMLBody = value; } } /// <summary> /// 是否是 HTML格式的邮件 /// </summary> public bool Is HTML { get { return m_bIs HTML; } set { if (value != m_bIs HTML) m_bIs HTML = value; } } /// <summary> /// 语言编码 [默认为GB2312] /// </summary> public string LanguageEncoding { get { return m_strLanguageEncoding; } set { if (value != m_strLanguageEncoding) m_strLanguageEncoding = value; } } /// <summary> /// 邮件编码 [默认为8bit] /// </summary> public string MailEncoding { get { return m_strEncoding; } set { if (value != m_strEncoding) m_strEncoding = value; } } /// <summary> /// 邮件优先级 [默认为3] /// </summary> public int Priority { get { return m_iPriority; } set { if (value != m_iPriority) m_iPriority = value; } } /// <summary> /// 附件 [AttachmentInfo] /// </summary> public IList Attachments { get { return m_alAttachments; } // set { if (value != m_alAttachments) m_alAttachments = value; } } #endregion #region "Struct AttachmentInfo" /// <summary> /// 附件信息 /// </summary> public struct AttachmentInfo { /// <summary> /// 附件的文件名 [如果输入路径,则自动转换为文件名] /// </summary> public string FileName { get { return fileName; } set { fileName = Path.GetFileName(value); } } private string fileName; /// <summary> /// 附件的内容 [由经Base64编码的字节组成] /// </summary> public string Bytes { get { return bytes; } set { if (value != bytes) bytes = value; } } private string bytes; /// <summary> /// 从流中读取附件内容并构造 /// </summary> /// <param name="p_strFileName">附件的文件名</param> /// <param name="p_stream">流</param> public AttachmentInfo (string p_strFileName, Stream p_stream) { fileName = Path.GetFileName (p_strFileName); byte[] by = new byte [p_stream.Length]; p_stream.Read (by,0,(int)p_stream.Length); // 读取文件内容 //格式转换 bytes = Convert.ToBase64String (by); // 转化为base64编码 } /// <summary> /// 按照给定的字节构造附件 /// </summary> /// <param name="p_strFileName">附件的文件名</param> /// <param name="ibytes">附件的内容 [字节]</param> public AttachmentInfo (string p_strFileName, byte[] ibytes) { fileName = Path.GetFileName (p_strFileName); bytes = Convert.ToBase64String (ibytes); // 转化为base64编码 } /// <summary> /// 从文件载入并构造 /// </summary> /// <param name="p_strPath"></param> public AttachmentInfo (string p_strPath) { fileName = Path.GetFileName (p_strPath); FileStream file = new FileStream (p_strPath, FileMode.Open); byte[] by = new byte [file.Length]; file.Read (by,0,(int)file.Length); // 读取文件内容 //格式转换 bytes = Convert.ToBase64String (by); // 转化为base64编码 file.Close (); } } #endregion #region "Functions" /// <summary> /// 发送邮件 /// </summary> private void SendMail() { // 创建TcpClient对象, 并建立连接 TcpClient tcpNewClient = null; try { tcpNewClient = new TcpClient (m_strServer, m_iPort); } catch (Exception) { throw new Exception ("无法连接 服务器"); } ReadString (tcpNewClient.GetStream());//获取连接信息 // 开始进行 服务器认证 // 如果状态码是250则表示操作成功 if (!Command (tcpNewClient.GetStream(), "EHLO Localhost", "250")) { tcpNewClient.Close(); throw new Exception ("登陆阶段失败"); } if (m_strUserName != "") { // 需要身份验证 if (!Command (tcpNewClient.GetStream(), "AUTH LOGIN", "334")) { tcpNewClient.Close(); throw new Exception ("身份验证阶段失败"); } // 此处将username转换为Base64码 string nameB64 = ToBase64 (m_strUserName); if (!Command (tcpNewClient.GetStream(), nameB64, "334")) { tcpNewClient.Close(); throw new Exception ("身份验证阶段失败"); } // 此处将m_strPassWord转换为Base64码 string passB64 = ToBase64 (m_strPassWord); if (!Command (tcpNewClient.GetStream(), passB64, "235")) { tcpNewClient.Close(); throw new Exception ("身份验证阶段失败"); } } // 准备发送 WriteString (tcpNewClient.GetStream(), "mail From: " + m_strFrom); for(int i=0;i<m_strTo.Length;i++) { WriteString (tcpNewClient.GetStream(), "rcpt m_strTo: " + m_strTo[i]); } WriteString (tcpNewClient.GetStream(), "data"); // 发送邮件头 WriteString (tcpNewClient.GetStream(), "Date: " + DateTime.Now); // 时间 WriteString (tcpNewClient.GetStream(), "From: " + m_strFromName + "<" + m_strFrom + ">"); // 发件人 WriteString (tcpNewClient.GetStream(), "Subject: " + m_strSubject); // 主题 WriteString (tcpNewClient.GetStream(), "To:" + m_strToName + "<" + m_strTo + ">"); // 收件人 //邮件格式 WriteString (tcpNewClient.GetStream(), "Content-Type: multipart/mixed; boundary=\"unique-boundary-1\""); WriteString (tcpNewClient.GetStream(), "Reply-To:" + m_strFrom); // 回复地址 WriteString (tcpNewClient.GetStream(), "X-Priority:" + m_iPriority); // 优先级 WriteString (tcpNewClient.GetStream(), "MIME-Version:1.0"); // MIME版本 // 数据ID,随意 // WriteString (tcpNewClient.GetStream(), "Message-Id: " + DateTime.Now.ToFileTime() + "@security.com"); WriteString (tcpNewClient.GetStream(), "Content-Transfer-Encoding:" + m_strEncoding); // 内容编码 WriteString (tcpNewClient.GetStream(), "X-Mailer:JcPersonal.Utility.MailSender"); // 邮件发送者 WriteString (tcpNewClient.GetStream(), ""); WriteString (tcpNewClient.GetStream(), ToBase64 ("This is a multi-part message in MIME format.")); WriteString (tcpNewClient.GetStream(), ""); // 从此处开始进行分隔输入 WriteString (tcpNewClient.GetStream(), "--unique-boundary-1"); // 在此处定义第二个分隔符 WriteString (tcpNewClient.GetStream(), "Content-Type: multipart/alternative;Boundary=\"unique-boundary-2\""); WriteString (tcpNewClient.GetStream(), ""); if(!m_bIs HTML) { // 文本信息 WriteString (tcpNewClient.GetStream(), "--unique-boundary-2"); WriteString (tcpNewClient.GetStream(), "Content-Type: text/plain;charset=" + m_strLanguageEncoding); WriteString (tcpNewClient.GetStream(), "Content-Transfer-Encoding:" + m_strEncoding); WriteString (tcpNewClient.GetStream(), ""); WriteString (tcpNewClient.GetStream(), m_strTxtBody); WriteString (tcpNewClient.GetStream(), "");//一个部分写完之后就写如空信息,分段 WriteString (tcpNewClient.GetStream(), "--unique-boundary-2--");//分隔符的结束符号,尾巴后面多了-- WriteString (tcpNewClient.GetStream(), ""); } else { // HTML信息 WriteString (tcpNewClient.GetStream(), "Content-Type: multipart/mixed"); WriteString (tcpNewClient.GetStream(), "--unique-boundary-2"); WriteString (tcpNewClient.GetStream(), "Content-Type: text/ HTML;charset=" + m_strLanguageEncoding); WriteString (tcpNewClient.GetStream(), "Content-Transfer-Encoding:" + m_strEncoding); WriteString (tcpNewClient.GetStream(), ""); WriteString (tcpNewClient.GetStream(), m_str HTMLBody); WriteString (tcpNewClient.GetStream(), ""); WriteString (tcpNewClient.GetStream(), "--unique-boundary-2--");//分隔符的结束符号,尾巴后面多了-- WriteString (tcpNewClient.GetStream(), ""); } // 发送附件 // 对文件列表做循环 for (int i = 0; i < m_alAttachments.Count; i++) { WriteString (tcpNewClient.GetStream(), "--unique-boundary-1"); // 邮件内容分隔符 WriteString (tcpNewClient.GetStream(), "Content-Type: application/octet-stream;name=\"" + ((AttachmentInfo)m_alAttachments[i]).FileName + "\""); // 文件格式 WriteString (tcpNewClient.GetStream(), "Content-Transfer-Encoding: base64"); // 内容的编码 WriteString (tcpNewClient.GetStream(), "Content-Disposition:attachment;filename=\"" + ((AttachmentInfo)m_alAttachments[i]).FileName + "\""); // 文件名 WriteString (tcpNewClient.GetStream(), ""); WriteString (tcpNewClient.GetStream(), ((AttachmentInfo)m_alAttachments[i]).Bytes); // 写入文件的内容 WriteString (tcpNewClient.GetStream(), ""); } Command (tcpNewClient.GetStream(), ".", "250"); // 最后写完了,输入"." // 关闭连接 tcpNewClient.Close (); } /// <summary> /// 向流中写入字符 /// </summary> /// <param name="p_netStream">来自TcpClient的流</param> /// <param name="p_str">写入的字符</param> protected void WriteString (NetworkStream p_netStream, string p_str) { p_str = p_str + "\r\n"; // 加入换行符 // 将命令行转化为byte[] byte[] bWrite = Encoding.GetEncoding(m_strLanguageEncoding).GetBytes(p_str.ToCharArray()); // 由于每次写入的数据大小是有限制的,那么我们将每次写入的数据长度定在75个字节,一旦命令长度超过了75,就分步写入。 int iStart=0; int iLength = bWrite.Length; int iPage = 0; int iSize = 75; int iCount = iSize; try { if (iLength>75) { // 数据分页 if ((iLength / iSize) * iSize < iLength) iPage = iLength/iSize+1; else iPage=iLength/iSize; for (int i=0;i<iPage;i++) { iStart=i*iSize; if (i==iPage-1) iCount=iLength-(i*iSize); p_netStream.Write(bWrite,iStart,iCount);// 将数据写入到 服务器上 } } else p_netStream.Write(bWrite,0,bWrite.Length); } catch(Exception) { // 忽略错误 } } /// <summary> /// 从流中读取字符 /// </summary> /// <param name="p_netStream">来自TcpClient的流</param> /// <returns>读取的字符</returns> protected string ReadString (NetworkStream p_netStream) { string strSp = null; byte[] by = new byte[1024]; int iSize = p_netStream.Read(by,0,by.Length);// 读取数据流 if (iSize > 0) { strSp = Encoding.Default.GetString(by);// 转化为String } return strSp; } /// <summary> /// 发出命令并判断返回信息是否正确 /// </summary> /// <param name="p_netStream">来自TcpClient的流</param> /// <param name="p_strCommand">命令</param> /// <param name="p_strState">正确的状态码</param> /// <returns>是否正确</returns> protected bool Command (NetworkStream p_netStream, string p_strCommand, string p_strState) { string strSp = null; bool bSuccess = false; try { // 写入命令 WriteString (p_netStream, p_strCommand); strSp = ReadString (p_netStream);// 接受返回信息 if (strSp.IndexOf(p_strState) != -1)// 判断状态码是否正确 bSuccess=true; } catch(Exception) { // 忽略错误 } return bSuccess; } /// <summary> /// 字符串编码为Base64 /// </summary> /// <param name="p_str">字符串</param> /// <returns>Base64编码的字符串</returns> protected string ToBase64 (string p_str) { try { byte[] by = Encoding.Default.GetBytes (p_str.ToCharArray()); p_str = Convert.ToBase64String (by); } catch(Exception) { // 忽略错误 } return p_str; } /// <summary> /// 表示一封待发送的邮件 /// </summary> public MailSender() { // // TODO: 在此处添加构造函数逻辑 // } #endregion #region "Tools" /// <summary> /// 回复格式化 HTML的格式到 HTMLt格式 /// </summary> /// <param name="p_strOldStr">要格式化的字符串</param> /// <param name="p_strSeparator_n"></param> /// <param name="p_strSeparator_r"></param> /// <returns></returns> public string reformatSpecail HTML_to HTML(string p_strOldStr,string p_strSeparator_n,string p_strSeparator_r) { //string result; while(p_strOldStr.IndexOf("<")>-1 || p_strOldStr.IndexOf(">")>-1 || p_strOldStr.IndexOf("@$@_n")>-1 || p_strOldStr.IndexOf("@$@_r")>-1) { if(p_strOldStr.IndexOf("<")>-1) { p_strOldStr = p_strOldStr.Substring(0,p_strOldStr.IndexOf("<")) + "<" + p_strOldStr.Substring(p_strOldStr.IndexOf("<")+4); } else if(p_strOldStr.IndexOf(">")>-1) { p_strOldStr = p_strOldStr.Substring(0,p_strOldStr.IndexOf(">")) + ">" + p_strOldStr.Substring(p_strOldStr.IndexOf(">")+4); } else if(p_strOldStr.IndexOf(p_strSeparator_n)>-1) { p_strOldStr = p_strOldStr.Substring(0,p_strOldStr.IndexOf(p_strSeparator_n)) + "<br>" + p_strOldStr.Substring(p_strOldStr.IndexOf(p_strSeparator_n) + p_strSeparator_n.Length); } else if(p_strOldStr.IndexOf(p_strSeparator_r)>-1) { p_strOldStr = p_strOldStr.Substring(0,p_strOldStr.IndexOf(p_strSeparator_r)) + "<br>" + p_strOldStr.Substring(p_strOldStr.IndexOf(p_strSeparator_r) + p_strSeparator_r.Length); } else { p_strOldStr = p_strOldStr; } } return p_strOldStr; } /// <summary> /// 格式化 HTML的格式(目前不用) /// </summary> /// <param name="p_strOldStr">要格式化的字符串</param> /// <returns></returns> private string formatSpecail HTML(string p_strOldStr) { string result; if(p_strOldStr.IndexOf("<")>-1) { result = p_strOldStr.Substring(0,p_strOldStr.IndexOf("<")) + "<" + p_strOldStr.Substring(p_strOldStr.IndexOf("<")+1); formatSpecail HTML(result); } else if(p_strOldStr.IndexOf(">")>-1) { result = p_strOldStr.Substring(0,p_strOldStr.IndexOf(">")) + ">" + p_strOldStr.Substring(p_strOldStr.IndexOf(">")+1); formatSpecail HTML(result); } else { result = p_strOldStr; } return result; } /// <summary> /// 回复格式化 HTML的格式到txt格式 /// </summary> /// <param name="p_strOldStr">要格式化的字符串</param> /// <param name="p_strSeparator_n"></param> /// <param name="p_strSeparator_r"></param> /// <returns></returns> public string reformatSpecail HTML_toTxt(string p_strOldStr,string p_strSeparator_n,string p_strSeparator_r) { //string result; while(p_strOldStr.IndexOf("<")>-1 || p_strOldStr.IndexOf(">")>-1 || p_strOldStr.IndexOf(p_strSeparator_n)>-1 || p_strOldStr.IndexOf(p_strSeparator_r)>-1) { if(p_strOldStr.IndexOf("<")>-1) { p_strOldStr = p_strOldStr.Substring(0,p_strOldStr.IndexOf("<")) + "<" + p_strOldStr.Substring(p_strOldStr.IndexOf("<")+4); } else if(p_strOldStr.IndexOf(">")>-1) { p_strOldStr = p_strOldStr.Substring(0,p_strOldStr.IndexOf(">")) + ">" + p_strOldStr.Substring(p_strOldStr.IndexOf(">")+4); } else if(p_strOldStr.IndexOf(p_strSeparator_n)>-1) { p_strOldStr = p_strOldStr.Substring(0,p_strOldStr.IndexOf(p_strSeparator_n)) + "\n" + p_strOldStr.Substring(p_strOldStr.IndexOf(p_strSeparator_n) + p_strSeparator_n.Length); } else if(p_strOldStr.IndexOf(p_strSeparator_r)>-1) { p_strOldStr = p_strOldStr.Substring(0,p_strOldStr.IndexOf(p_strSeparator_r)) + "\r" + p_strOldStr.Substring(p_strOldStr.IndexOf(p_strSeparator_r) + p_strSeparator_r.Length); } else { p_strOldStr = p_strOldStr; } } return p_strOldStr; } #endregion #region "Use" /// <summary> /// 发送邮件 /// </summary> /// <param name="p_strMailFrom">发件人地址</param> /// <param name="p_strMailTo">收件人地址</param> /// <param name="p_strMailFormat">邮件主体格式</param> /// <param name="p_strMailSubject">邮件主题</param> /// <param name="p_strMailBody">邮件主体</param> /// <param name="p_strMailAttachmentPaths">附件路径</param> /// <param name="mailSmtp">smtp服务地址</param> /// <param name="smtpUser"></param> /// <param name="p_strSmtpPassword"></param> /// <param name="p_strSeparator_n"></param> /// <param name="p_strSeparator_r"></param> public void send(string p_strMailFrom,string[] p_strMailTo,string p_strMailFormat,string p_strMailSubject,string p_strMailBody,string[] p_strMailAttachmentPaths,string mailSmtp,string smtpUser,string p_strSmtpPassword,string p_strSeparator_n,string p_strSeparator_r) { //MailSender myEmail = null; try { //myEmail = new MailSender(); this.From = p_strMailFrom; this.To = p_strMailTo; this.Subject = p_strMailSubject; this.Body = reformatSpecail HTML_toTxt(p_strMailBody,p_strSeparator_n,p_strSeparator_r); this. HTMLBody = reformatSpecail HTML_to HTML(p_strMailBody,p_strSeparator_n,p_strSeparator_r); if(p_strMailFormat.ToUpper() == " HTML") { this.Is HTML = true; } else { this.Is HTML = false; } for(int i=0;i<p_strMailAttachmentPaths.Length;i++) { if(p_strMailAttachmentPaths[i] != null && p_strMailAttachmentPaths[i].Length > 0) { object tempObj = new MailSender.AttachmentInfo(p_strMailAttachmentPaths[i]); this.Attachments.Add(tempObj); } } this.Server = mailSmtp; this.UserName = smtpUser; this.Password = p_strSmtpPassword; //this.SendMail(); SendMail(); } catch(Exception ex) { throw new Exception("使用MailSender失败",ex); } } /// <summary> /// 发送邮件(使用默认分隔符号) /// </summary> /// <param name="p_strMailFrom">发件人地址</param> /// <param name="p_strMailTo">收件人地址</param> /// <param name="p_strMailFormat">邮件主体格式</param> /// <param name="p_strMailSubject">邮件主题</param> /// <param name="p_strMailBody">邮件主体</param> /// <param name="p_strMailAttachmentPaths">附件路径</param> /// <param name="mailSmtp">smtp服务地址</param> /// <param name="smtpUser"></param> /// <param name="p_strSmtpPassword"></param> /// Writer:Nick /// Create Date:2004-12-20 public void send(string p_strMailFrom,string[] p_strMailTo,string p_strMailFormat,string p_strMailSubject,string p_strMailBody,string[] p_strMailAttachmentPaths,string mailSmtp,string smtpUser,string p_strSmtpPassword) { string strSeparator_n = "@$@_n"; string strSeparator_r = "@$@_r"; send(p_strMailFrom,p_strMailTo,p_strMailFormat, p_strMailSubject, p_strMailBody, p_strMailAttachmentPaths, mailSmtp, smtpUser, p_strSmtpPassword,strSeparator_n,strSeparator_r); } /// <summary> /// 发送邮件(无附件) /// </summary> /// <param name="p_strMailFrom">发件人地址</param> /// <param name="p_strMailTo">收件人地址</param> /// <param name="p_strMailFormat">邮件主体格式</param> /// <param name="p_strMailSubject">邮件主题</param> /// <param name="p_strMailBody">邮件主体</param> /// <param name="mailSmtp">smtp服务地址</param> /// <param name="smtpUser"></param> /// <param name="p_strSmtpPassword"></param> /// Writer:Nick /// Create Date:2004-12-20 public void send(string p_strMailFrom,string[] p_strMailTo,string p_strMailFormat,string p_strMailSubject,string p_strMailBody,string mailSmtp,string smtpUser,string p_strSmtpPassword) { string[] strMailAttachmentPaths = new string[3]; send(p_strMailFrom,p_strMailTo,p_strMailFormat,p_strMailSubject,p_strMailBody,strMailAttachmentPaths, mailSmtp, smtpUser, p_strSmtpPassword); } /// <summary> /// 发送邮件(无附件、txt格式) /// </summary> /// <param name="p_strMailFrom">发件人地址</param> /// <param name="p_strMailTo">收件人地址</param> /// <param name="p_strMailSubject">邮件主题</param> /// <param name="p_strMailBody">邮件主体</param> /// <param name="mailSmtp">smtp服务地址</param> /// <param name="smtpUser"></param> /// <param name="p_strSmtpPassword"></param> /// Writer:Nick /// Create Date:2004-12-20 public void send(string p_strMailFrom,string[] p_strMailTo,string p_strMailSubject,string p_strMailBody,string mailSmtp,string smtpUser,string p_strSmtpPassword) { string strMailFormat = "txt"; send(p_strMailFrom,p_strMailTo,strMailFormat,p_strMailSubject,p_strMailBody,mailSmtp,smtpUser,p_strSmtpPassword); } /// <summary> /// 发送邮件 /// </summary> /// Writer:Nick /// Create Date:2004-12-20 public void send() { SendMail(); } /// <summary> /// 销毁(预留) /// </summary> /// Writer:Nick /// Create Date:2004-12-20 public void Dispose() { } #endregion } }

转载于:https://www.cnblogs.com/zhuor/archive/2005/12/31/308930.html

相关资源:DirectX修复工具V4.0增强版

最新回复(0)