一、两种发送邮件的方法
有用到两种方式发邮件,一种是用System.Web.Mail类,另一种是System.Net.Mail类。
System.Net.Mail是作为System.Web.Mail的替代存在的。
System.Web.Mail使用时会提示已过时,但目前任然可以正常使用。
二、遇到的问题
我在使用System.Net.Mail发邮件的时候遇到一个问题,如果是用的阿里云服务器,阿里云服务器把邮件的默认25端口给禁用掉了(为的是不让邮件泛滥),25端口被封,阿里云发送SMTP邮件失败。
在网上找了一些资料,主要有以下几种方法解决:
1、在阿里云平台申请解封TCP 25 端口 (Outbound)
2、更换端口号为465 或 587 ;
3、服务器前缀加上 ssl://
4、使用System.Web.Mail发送邮件
2和3我都试用无果,阿里云服务器还是发送邮件失败,最后使用System.Web.Mail发送成功,要是有别的更好的方法请大家告知,谢谢谢谢~~
三、示例
这里我把发邮件一些相关的参数配置在ini文件里(smt服务器、端口号、发件人邮箱、发件人密码、发件人昵称、接收人邮箱)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #region 读写本地IN文件 public static string ReadIniFile( string iniFileName, string section, string key) { string strFileName = GetRootPath() + "\\" + iniFileName; if (!System.IO.File.Exists(strFileName)) { FileStream fs = System.IO.File.Create(strFileName); fs.Close(); } TWays.IniFile localIniFile = new TWays.IniFile(strFileName); return localIniFile.ReadInivalue(section, key); } public static void WriteIniFile( string iniFileName, string section, string key, string value) { string strFileName = GetRootPath() + "\\" + iniFileName; if (!System.IO.File.Exists(strFileName)) { FileStream fs = System.IO.File.Create(strFileName); fs.Close(); } TWays.IniFile localIniFile = new TWays.IniFile(strFileName); localIniFile.WriteInivalue(section, key, value); } #endregion public const string MonitorLogFileName = "WmsImportSheetLog.Log" ; public const string MailSetIniFileName = "MailSet.ini" ; public const string MailSetSectionOption = "Option" ; public const string MailSetKeySmtpServer = "SmtpServer" ; //smtp服务器 public const string MailSetKeySmtpPort = "SmtpPort" ; //端口号 public const string MailSetKeySendAddr = "SendAddr" ; //发件人邮箱 public const string MailSetKeySendPwd = "SendPwd" ; //发件人密码 public const string MailSetKeySendUser = "SendUser" ; //发件人名称,可随意定义 public const string MailSetKeyReceiAddr = "ReceiAddr" ; //收件人邮箱 //如果ini文件内没有内容就设置默认值 public void WriteMailSet() { string strFileName = BusiUtils.GetRootPath() + "\\" + Constant.MailSetIniFileName; if (!System.IO.File.Exists(strFileName)) { BusiUtils.WriteIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySmtpServer, "smtp.163.com" ); BusiUtils.WriteIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySmtpPort, "465" ); BusiUtils.WriteIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySendAddr, "lala12121@163.com" ); string sendPwd = "lalala2017" ; sendPwd = TWays.Utils.EncryptString(sendPwd); BusiUtils.WriteIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySendPwd, sendPwd); BusiUtils.WriteIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySendUser, "系统管理员" ); //多个收件人用 ' ;' 号隔开 BusiUtils.WriteIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeyReceiAddr, "1234@qq.com;5678@qq.com;2579@qq.com;" ); } } |
System.Web.Mail
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | public bool Process() { bool boolReturn = false ; try { string errorMsg = string .Empty; string title = "每日单据导入情况" + "-" + DateTime.Now.ToString( "yyyy-MM -dd" ); string message = string .Empty; try { WriteMailSet(); bool bl = true ; DataSet ds = DataAdapter.Query(SqlText.selectImportSheetErrorLog.ToUpper()); #region if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count <= 0) { message = "单据处理成功!" ; } else { StringBuilder sb = new StringBuilder(); sb.Append( "以下为单据导入异常的消息:\r\n\r\n" ); foreach (DataRow dr in ds.Tables[0].Rows) { bl = false ; sb.Append( " 任务编号:" + dr[ "TASK_CODE" ].ToString() + ",\t" ); sb.Append( " 任务名称:" + dr[ "TASK_NAME" ].ToString() + ",\t" ); sb.Append( " 日志消息:" + dr[ "MEMO" ].ToString()); sb.Append( "\r\n" ); } message = sb.ToString(); } #endregion if (bl) { title = "[成功]" + title; } } catch (Exception Ex) { message = Ex.Message; errorMsg = "邮件发送失败!错误信息:" + message; message = "Error:" + Ex.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); return boolReturn; } #region 发送邮件 try { TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, "发送" + title + "开始\r\n" , true ); bool result = Monitor(title, message, "" , "" ); TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, "发送" + title + "结束\r\n" , true ); } catch (Exception Ex) { errorMsg = "邮件发送失败!错误信息:" + Ex.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); return boolReturn; } #endregion Result = "Succeed" ; boolReturn = true ; } catch (Exception ex) { Result = ex.Message; } return boolReturn; } private bool Monitor( string title, string message, string fileName, string shortFileName) { string smtpServer = BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySmtpServer); string smtpPort = BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySmtpPort); string sendAddr = BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySendAddr); string sendPwd = Utils.DecryptString(BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySendPwd)); string receiAddr = BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeyReceiAddr); string errorMsg = string .Empty; try { System.Web.Mail.MailMessage mmsg = new System.Web.Mail.MailMessage(); //邮件主题 mmsg.Subject = title; //mmsg.BodyFormat = System.Web.Mail.MailFormat.Html; //邮件正文 mmsg.Body = message; //正文编码 mmsg.BodyEncoding = Encoding.UTF8; //优先级 mmsg.Priority = System.Web.Mail.MailPriority.High; System.Web.Mail.MailAttachment data = null ; //if (SUpFile != "") //{ // SUpFile = HttpContext.Current.Server.MapPath(SUpFile);//获得附件在本地地址 // System.Web.Mail.MailAttachment attachment = new System.Web.Mail.MailAttachment(SUpFile); //create the attachment // mmsg.Attachments.Add(attachment); //add the attachment //} //发件者邮箱地址 mmsg.From = string .Format( "\"{0}\"<{1}>" , "方予系统管理员" , sendAddr); //收件人收箱地址 mmsg.To = receiAddr; //用户名 //密码 不是邮箱登陆密码 而是邮箱设置POP3/SMTP 时生成的第三方客户端授权码 //端口 //使用SSL //Smtp服务器 System.Web.Mail.SmtpMail.SmtpServer = smtpServer; System.Web.Mail.SmtpMail.Send(mmsg); System.Threading.Thread.Sleep(20000); } catch (Exception Ex) { errorMsg = "邮件发送失败!错误信息:" + Ex.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); return false ; } return true ; } |
System.Net.Mail
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 | SmtpClient SmtpClient = null ; //设置SMTP协议 MailAddress MailAddress_from = null ; //设置发信人地址 当然还需要密码 MailAddress MailAddress_to = null ; //设置收信人地址 不需要密码 MailMessage MailMessage_Mai = null ; FileStream FileStream_my = null ; //附件文件流 public bool Process() { bool boolReturn = false ; try { string errorMsg = string .Empty; string title = "每日单据导入情况" + "-" + DateTime.Now.ToString( "yyyy-MM-dd" ); string message = string .Empty; try { WriteMailSet(); bool bl = true ; DataSet ds = DataAdapter.Query(SqlText.selectImportSheetErrorLog.ToUpper()); #region if (ds == null || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count <= 0) { message = "单据导入成功!" ; } else { StringBuilder sb = new StringBuilder(); sb.Append( "以下为单据导入异常的消息:\r\n\r\n" ); foreach (DataRow dr in ds.Tables[0].Rows) { bl = false ; sb.Append( " 任务编号:" + dr[ "TASK_CODE" ].ToString() + ",\t" ); sb.Append( " 任务名称:" + dr[ "TASK_NAME" ].ToString() + ",\t" ); sb.Append( " 日志消息:" + dr[ "MEMO" ].ToString()); sb.Append( "\r\n" ); } message = sb.ToString(); } #endregion if (bl) { title = "[成功]" + title; } } catch (Exception Ex) { message = Ex.Message; errorMsg = "邮件发送失败!错误信息:" + message; message = "Error:" + Ex.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); return boolReturn; } #region 发送邮件 try { TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, "发送" + title + "开始\r\n" , true ); bool result = Monitor(title, message, "" , "" ); TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, "发送" + title + "结束\r\n" , true ); } catch (Exception Ex) { errorMsg = "邮件发送失败!错误信息:" + Ex.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); return boolReturn; } #endregion Result = "Succeed" ; boolReturn = true ; } catch (Exception ex) { Result = ex.Message; } return boolReturn; } private bool Monitor( string title, string message, string fileName, string shortFileName) { string smtpServer = BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySmtpServer); string smtpPort = BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySmtpPort); string sendAddr = BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySendAddr); string sendPwd = Utils.DecryptString(BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySendPwd)); string receiAddr = BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeyReceiAddr); string errorMsg = string .Empty; try { //初始化Smtp服务器信息 setSmtpClient(smtpServer, Convert.ToInt32(smtpPort)); } catch (Exception Ex) { errorMsg = "邮件发送失败,请确定SMTP服务名是否正确!错误信息:" + Ex.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); return false ; } try { //验证发件邮箱地址和密码 setAddressform(sendAddr, sendPwd); } catch (Exception Ex) { errorMsg = "邮件发送失败,请确定发件邮箱地址和密码的正确性!错误信息:" + Ex.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); return false ; } try { MailMessage_Mai = null ; MailMessage_Mai = new MailMessage(); //清空历史发送信息 以防发送时收件人收到的错误信息(收件人列表会不断重复) MailMessage_Mai.To.Clear(); string [] recAddress = receiAddr.Split( new string [] { ";" }, StringSplitOptions.RemoveEmptyEntries); //添加收件人邮箱地址 for ( int i = 0; i < recAddress.Length; i++) { MailAddress_to = new MailAddress(recAddress[i]); MailMessage_Mai.To.Add(MailAddress_to); } //发件人邮箱 MailMessage_Mai.From = MailAddress_from; //邮件主题 MailMessage_Mai.Subject = title; MailMessage_Mai.SubjectEncoding = System.Text.Encoding.UTF8; //邮件正文 MailMessage_Mai.Body = message; MailMessage_Mai.BodyEncoding = System.Text.Encoding.UTF8; //清空历史附件 以防附件重复发送 //MailMessage_Mai.Attachments.Clear(); //FileStream_my = new FileStream(fileName, FileMode.Open); //string name = FileStream_my.Name; ////添加附件 //MailMessage_Mai.Attachments.Add(new Attachment(FileStream_my, shortFileName)); //注册邮件发送完毕后的处理事件 SmtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); //开始发送邮件 SmtpClient.SendAsync(MailMessage_Mai, "000000000" ); System.Threading.Thread.Sleep(30000); } catch (Exception Ex) { errorMsg = "邮件发送失败!错误信息:" + Ex.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); return false ; } return true ; } #region 设置Smtp服务器信息 /// <summary> /// 设置Smtp服务器信息 /// </summary> /// <param name="ServerName">SMTP服务名</param> /// <param name="Port">端口号</param> private void setSmtpClient( string ServerHost, int Port) { SmtpClient = new SmtpClient(); SmtpClient.Host = ServerHost; //指定SMTP服务名 例如QQ邮箱为 smtp.qq.com 新浪cn邮箱为 smtp.sina.cn等 SmtpClient.Port = Port; //指定端口号 SmtpClient.Timeout = 5; //超时时间 SmtpClient.EnableSsl = true ; //指定 SmtpClient 使用安全套接字层 (SSL) 加密连接 } #endregion #region 验证发件人信息 /// <summary> /// 验证发件人信息 /// </summary> /// <param name="MailAddress">发件邮箱地址</param> /// <param name="MailPwd">邮箱密码</param> private void setAddressform( string MailAddress, string MailPwd) { string sendUser = BusiUtils.ReadIniFile(Constant.MailSetIniFileName, Constant.MailSetSectionOption, Constant.MailSetKeySendUser); //创建服务器认证 NetworkCredential NetworkCredential_my = new NetworkCredential(MailAddress, MailPwd); //实例化发件人地址 MailAddress_from = new System.Net.Mail.MailAddress(MailAddress, sendUser, Encoding.BigEndianUnicode); //指定发件人信息 包括邮箱地址和邮箱密码 SmtpClient.Credentials = new System.Net.NetworkCredential(MailAddress_from.Address, MailPwd); } #endregion #region 发送邮件后所处理的函数 private void SendCompletedCallback( object sender, AsyncCompletedEventArgs e) { string errorMsg = string .Empty; try { if (e.Cancelled) { errorMsg = "发送已取消!" ; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); } if (e.Error != null ) { errorMsg = "邮件发送失败!1错误信息:" + e.Error.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); } else { errorMsg = "恭喜,邮件成功发出!" ; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); } if (FileStream_my != null ) { FileStream_my.Close(); } } catch (Exception Ex) { errorMsg = "邮件发送失败!2错误信息:" + Ex.Message; TWays.Core.Loger.LogMessage(BusiUtils.GetRootPath() + "\\" + Constant.MonitorLogFileName, errorMsg + "\r\n" , true ); } } #endregion |
以上就是c# 两种发送邮件的方法的详细内容,更多关于c# 发送邮件的资料请关注自学编程网其它相关文章!
- 本文固定链接: https://zxbcw.cn/post/209587/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)