C# 通过Smtp 完成系统发送邮件
1 //1. 新建EmailHelper 类 2 using System; 3 using System.Collections.Generic; 4 using System.Configuration; 5 using System.Linq; 6 using System.Net.Mail; 7 using System.Web; 8 9 namespace WebAPI.Common 10 { 11 public class EmailHelper 12 { 13 private MailMessage msg; 14 private string[] emailfrom; 15 private string[] emailto; 16 private string[] emailcc; 17 private string[] emailbcc; 18 private string emailsubject; 19 private System.Text.StringBuilder emailcontent; 20 public EmailHelper() 21 { 22 msg = new MailMessage(); 23 Emailpara email = System.Configuration.ConfigurationManager.GetSection("email") as Emailpara; 24 25 emailfrom = email.emailfrom.Split(';'); 26 emailto = email.emailto.Split(';'); 27 emailcc = email.emailcc.Split(';'); 28 emailbcc = email.emailbcc.Split(';'); 29 emailsubject = email.emailsubject; 30 31 emailcontent = new System.Text.StringBuilder(); 32 33 //emailcontent.Append("<Table class=\"gridtable\">"); 34 //emailcontent.Append("<tr>"); 35 //emailcontent.Append("<th>Req_ID</th>"); 36 //emailcontent.Append("<th>Requester</th>"); 37 //emailcontent.Append("<th>Country</th>"); 38 //emailcontent.Append("<th>Env</th>"); 39 //emailcontent.Append("</tr>"); 40 } 41 public void setContent(string str) 42 { 43 //ErrorList.AddLast(request); 44 //emailcontent.Append("<tr>"); 45 //emailcontent.Append("<td>" + request.Req_ID + "</td>"); 46 //emailcontent.Append("<td>" + request.Requester + "</td>"); 47 //emailcontent.Append("<td>" + request.Country +"</td>"); 48 //emailcontent.Append("<td>" + request.Env +"</td>"); 49 //emailcontent.Append("</tr>"); 50 51 emailcontent.Append(str); 52 53 emailcontent.Append("<br />"); 54 } 55 56 public void Send() 57 { 58 // emailcontent.Append("</Table>"); 59 //set emailTo 60 foreach (string tostr in emailto) 61 { 62 msg.To.Add(tostr); 63 } 65 //set emailCC 66 if (emailcc.Length > 0 && !String.Empty.Equals(emailcc[0])) 67 { 68 foreach (string ccstr in emailcc) 69 { 70 msg.CC.Add(ccstr); 71 } 72 } 73 //set emailBcc 74 if (emailbcc.Length > 0 && !String.Empty.Equals(emailbcc[0])) 75 { 76 77 foreach (string bccstr in emailbcc) 78 { 79 msg.Bcc.Add(bccstr); 80 } 81 } 82 // set emailFrom 83 if (emailfrom.Length > 0 && !String.Empty.Equals(emailfrom)) 84 msg.From = new MailAddress(emailfrom[0]); 85 else 86 msg.From = new MailAddress("DO.NOT.REPLY.TO@Test.COM"); 87 88 msg.Subject = emailsubject; 89 msg.SubjectEncoding = System.Text.Encoding.UTF8; 90 91 msg.BodyEncoding = System.Text.Encoding.UTF8; 92 msg.IsBodyHtml = true; 93 msg.Priority = MailPriority.Normal; 94 string content = "<!DOCTYPE html><html><head><style type=\"text/css\">table.gridtable {font-family: verdana,arial,sans-serif;font-size:11px;color:#333333;border-width: 1px;border-color: #666666;border-collapse: collapse;}"; 95 content = content + "table.gridtable th {border-width: 1px;padding: 8px; border-style: solid;border-color: #666666;background-color: #dedede;}table.gridtable td {border-width: 1px; padding: 8px;border-style: solid;border-color: #666666; background-color: #ffffff;}</style></head>"; 96 content = content + "<body><span style=\"font-family:Arial;font-size:16px;color:blue\"><br />An error has occurred <b></b> <br /><br />Following error happened. <br /> Details as below . <br /><br /></span>"; 97 content = content + emailcontent.ToString(); 98 content = content + "<hr width=50% align=left /><span style=\"font-family:Arial;font-size:16px;color:blue\">Team Support <br /></span></body></html>"; 99 100 msg.Body = content; 101 msg.BodyEncoding = System.Text.Encoding.UTF8; 102 SmtpClient client = new SmtpClient(); 103 client.Host = "localhost"; // important thing, 104 try 105 { 106 client.Send(msg); 107 } 108 catch (Exception ex) 109 { 110 111 } 113 } 115 } 116 public class EmailSectionHandler : IConfigurationSectionHandler 117 { 118 public object Create(object parent, object configContext, System.Xml.XmlNode section) 119 { 120 string emailfrom = section.SelectSingleNode("EmailFrom").InnerText; 121 string emailto = section.SelectSingleNode("EmailTo").InnerText; 122 string emailcc = section.SelectSingleNode("EmailCC").InnerText; 123 string emailbcc = section.SelectSingleNode("EmailBCC").InnerText; 124 string emailsubject = section.SelectSingleNode("EmailSubject").InnerText; 125 Emailpara email = new Emailpara(); 126 email.emailfrom = emailfrom; 127 email.emailto = emailto; 128 email.emailcc = emailcc; 129 email.emailbcc = emailbcc; 130 email.emailsubject = emailsubject; 131 132 return email; 133 } 134 } 135 136 public class Emailpara 137 { 138 public string emailfrom { get; set; } 139 public string emailto { get; set; } 140 public string emailcc { get; set; } 141 public string emailbcc { get; set; } 142 public string emailsubject { get; set; } 143 144 } 145 } 146 147 //2。配置Web.config 148 149 <configuration> 150 <configSections> 151 <section name ="email" type ="WebAPI.Common.EmailSectionHandler" /> 152 </configSections> 153 154 <email> 155 <EmailFrom>DO.NOT.REPLY.TO@Test.COM</EmailFrom> 156 <EmailTo>Email Address</EmailTo> 157 <EmailCC></EmailCC> 158 <EmailBCC></EmailBCC> 159 <EmailSubject>ERROR Message</EmailSubject> 160 </email> 161 </configuration> 162 163 //3。调用EmailHelper,并发送相关信息 164 EmailHelper email = new EmailHelper(); 165 email.setContent("ErrorMessage"); 166 email.Send();
// 以上内容在目前项目SMTP 服务器开启的情况下,可以正常发送邮件
//4. 配置server 端的SMTP(以下内容:转载,未经自己测试)
安装 SMTP 服务器
以下是安装 SMTP 服务器功能的步骤:
- 打开“服务器管理器”:单击键盘上的 Windows 按钮。输入“服务器管理器”。在“结果”窗口中,单击“服务器管理器”。。
- 单击左窗格中的“仪表板”。。
- 单击“添加角色和功能”。也可以从右上角的“管理”菜单打开“添加角色和功能”。
- 在“开始之前”窗口上,单击“下一步”。
- 在“安装类型”中,单击“基于角色或基于功能的安装”。单击“下一步”。
- 在“服务器选择”中,依次单击“从服务器池中选择服务器”、所需的服务器和“下一步”。“服务器选择”窗口中会列出已使用“添加服务器”添加在“服务器管理器”中的服务器。默认情况下,本地服务器处于选中状态。向服务器管理器添加服务器列出了在 Windows Server 2012 上使用“添加服务器”的步骤。
- 在“服务器角色”窗口中,单击“下一步”。
- 在“功能”窗口中,选中“SMTP 服务器”。如果出现提示,请单击“添加功能”。单击“下一步”。
- 在“确认”中,选择“如果需要,自动重新启动目标服务器”,然后单击“安装”。完成时,单击“关闭”。
配置 SMTP 服务器
以下是使用 IIS 6.0 管理器配置 SMTP 虚拟服务器的步骤:
- 打开 IIS 管理器:单击键盘上的 Windows 按钮。输入“IIS”。在“结果”窗口中,单击“Internet 信息服务 (IIS) 6.0 管理器”。
- 展开计算机名。右键单击“[SMTP 虚拟服务器 1]”,然后单击“属性”。
- 在“访问”选项卡中,单击“中继”按钮。
- 单击“添加”。对于“单台计算机”,输入 127.0.0.1,然后单击“确定”。
通过添加 127.0.0.1,我们将允许本地服务器从此 SMTP 服务器发送消息。如果你希望其他计算机从此 SMTP 服务器发送消息,请输入其 IP 地址。 - 在“传递”选项卡中,单击“出站安全”。选择以下选项:
匿名访问:不需要帐户名或密码。此选项将禁用 SMTP 服务器身份验证。
基本身份验证:以明文形式发送要连接的服务器的帐户名和密码。输入的帐户用于传输电子邮件。向个人帐户或 Exchange 帐户发送电子邮件时,可以选择“基本身份验证”。因为凭据将以明文形式传递,所以建议启用“TLS 加密”。
集成的 Windows 身份验证:Windows 域帐户名和密码用于进行身份验证。输入的帐户用于传输电子邮件。
TLS 加密:与 SSL 相似,TLS 用于保护连接的安全。需要在此服务器上安装一个有效的 SSL 服务器证书。- Tip技巧
- 若要使用个人电子邮件帐户(包括 Exchange 帐户)测试核心 SMTP 功能,请选择“匿名访问”。选择“基本身份验证”时,SMTP 使用 AUTH 命令。一些电子邮件提供商由于 AUTH 命令可能会失败。如果 AUTH 命令失败,则错误可能会记录到 SMTP 服务器上的 Windows 事件日志中。
- 在“传递”选项卡中,单击“出站连接”。默认情况下,TCP 端口为 25。如果其他端口已在防火墙内打开,可以输入其他端口。单击“确定”。
- 在“传递”选项卡中,单击“高级”。默认情况下,会列出本地服务器的“完全限定的域名”。根据 Internet 提供商,“智能主机”属性可以留空。你可能需要联系 Internet 提供商来确认是否需要“智能主机”。否则你可能无法进入 smtp.EMailProvider.com。
- note便笺
- “智能主机”(也称为中继主机)是 Exchange Server 专用于路由所有传出消息的服务器。“智能主机”收到消息之后,会将消息转发到远程域。“智能主机”的目标是提高 Exchange Server 的性能。Exchange Server 只向智能主机进行传输;而不是反复联系远程域,直到建立连接。
- 单击“确定”关闭所有窗口。
- 重新启动 SMTP 服务器:右键单击“[SMTP 虚拟服务器 1]”,然后依次单击“停止”和“启动”。必须重新启动才能应用 SMTP 服务器设置。