使用Net Mail发送邮件
最近用到了发送邮件这个功能,简单记录一下案例。代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Configuration; 6 using System.Net.Mail; 7 using HtmlAgilityPack; 8 using System.IO; 9 using System.Transactions; 10 using System.Text.RegularExpressions; 11 using NLog; 12 using System.Web; 13 using System.Data; 15 using System.Net; 16 using System.Net.Mime; 17 18 namespace Services 19 { 20 public class SendEmailService 21 { 22 public static string FROM => ConfigurationManager.AppSettings["SenderEmailAddress"]; 23 public static string FROM_DISPLAY_NAME => ConfigurationManager.AppSettings["SenderName"]; 24 public static String USERNAME => ConfigurationManager.AppSettings["SenderUserName"]; 25 public static String PASSWORD => ConfigurationManager.AppSettings["SenderPwd"]; 26 public static String HOST => ConfigurationManager.AppSettings["Host"]; 27 public static int PORT => int.Parse(ConfigurationManager.AppSettings["ServerPort"]); 28 public static int TIMEOUT => int.Parse(ConfigurationManager.AppSettings["TimeOut"]); 29 public static Boolean ENABLESSL => Convert.ToBoolean(ConfigurationManager.AppSettings["EnableSSL"]); 30 public static String SUBACCOUNT => ConfigurationManager.AppSettings["SubAccount"]; 31 32 private static Logger logger = LogManager.GetCurrentClassLogger(); 33 34 public const string EmptyString = ""; 35 36 public static string Send(List<string> toList, List<string> ccList, List<string> bccList, string subject, string body, List<string> attachments, Stream stream = null, string fileName = "") 37 { 38 39 string msg = string.Empty; 40 int emailTriggerStatus = int.Parse(ConfigurationManager.AppSettings["Email_TriggerStatus"]); 41 List<string> validEmailList = new List<string>(); 42 List<string> validEmailCcList = new List<string>(); 43 List<string> validEmailBccList = new List<string>(); 44 try 45 { 46 MailMessage mailMsg = new MailMessage(); 47 IEnumerable<string> finalToRecipients = null; 48 IEnumerable<string> finalCcRecipients = null; 49 IEnumerable<string> finalBccRecipients = null; 50 if (emailTriggerStatus == Globals.EMAIL_NOT_SEND) 51 { 52 logger.Info(Globals.EMAIL_LOGGER); 53 } 54 else 55 { 56 foreach (string email in toList) 57 { 58 if (UtilityService.IsValidEmail(email)) 59 { 60 validEmailList.Add(email); 61 } 62 } 63 64 finalToRecipients = validEmailList.Distinct(); 65 if (!ccList.IsNullOrEmpty()) 66 { 67 foreach (string email in ccList) 68 { 69 if (UtilityService.IsValidEmail(email)) 70 { 71 validEmailCcList.Add(email); 72 } 73 } 74 } 75 76 // both Emailto and EmailCC null , not send email 77 if (!(validEmailList.IsNullOrEmpty())) 78 { 79 if (!validEmailCcList.IsNullOrEmpty()) 80 { 81 finalCcRecipients = validEmailCcList.Where(m => !finalToRecipients.Contains(m)).Distinct(); 82 } 83 84 if (!bccList.IsNullOrEmpty()) 85 { 86 foreach (string email in bccList) 87 { 88 if (UtilityService.IsValidEmail(email)) 89 { 90 validEmailBccList.Add(email); 91 } 92 } 93 } 94 95 if (!validEmailBccList.IsNullOrEmpty()) 96 { 97 finalBccRecipients = validEmailBccList.Where(m => !finalToRecipients.Contains(m)).Distinct(); 98 } 99 100 foreach (string to in finalToRecipients) 101 { 102 mailMsg.To.Add(to); 103 } 104 if (!finalCcRecipients.IsNullOrEmpty()) 105 { 106 foreach (string cc in finalCcRecipients) 107 { 108 mailMsg.CC.Add(cc); 109 } 110 } 111 112 //BCC 113 if (!finalBccRecipients.IsNullOrEmpty()) 114 { 115 foreach (string bcc in finalBccRecipients) 116 { 117 mailMsg.Bcc.Add(bcc); 118 } 119 } 120 121 //attachments 122 if (!attachments.IsNullOrEmpty()) 123 { 124 foreach (string attachment in attachments) 125 { 126 Attachment attachmentFile = new Attachment(attachment); //create the attachment 127 mailMsg.Attachments.Add(attachmentFile); 128 } 129 } 130 131 if (!stream.IsNull() && fileName.ToLower().IndexOf(".pdf") > 0) 132 { 133 ContentType ct = new ContentType(MediaTypeNames.Application.Pdf); 134 Attachment attachmentFile = new Attachment(stream, ct); //create the attachment 135 mailMsg.Attachments.Add(attachmentFile); 136 attachmentFile.ContentDisposition.FileName = fileName; 137 } 138 if (!stream.IsNull() && fileName.ToLower().IndexOf(".xlsx") > 0) 139 { 140 Attachment attachmentFile = new Attachment(stream, fileName); //create the attachment 141 mailMsg.Attachments.Add(attachmentFile); 142 attachmentFile.ContentDisposition.FileName = fileName; 143 } 144 145 mailMsg.IsBodyHtml = true; 146 // From 147 MailAddress mailAddress = new MailAddress(FROM, FROM_DISPLAY_NAME); 148 mailMsg.From = mailAddress; 149 150 // Subject and Body 151 if (emailTriggerStatus == Globals.EMAIL_SEND_PRIMARY_EMAIL_TESTING) 152 { 153 subject = "[RTS TEST IGNORE]: " + subject; 154 } 155 156 if (!SUBACCOUNT.IsNullOrEmpty()) 157 { 158 mailMsg.Headers.Add("X-MC-Subaccount", SUBACCOUNT); 159 } 160 161 mailMsg.Subject = subject; 162 mailMsg.Body = body; 163 164 // Init SmtpClient and send 165 SmtpClient smtpClient = new SmtpClient(); 166 if (!string.IsNullOrEmpty(USERNAME) && !string.IsNullOrEmpty(PASSWORD)) 167 { 168 NetworkCredential credentials = new NetworkCredential(USERNAME, PASSWORD); 169 smtpClient.Credentials = credentials; 170 } 171 smtpClient.Timeout = Convert.ToInt32(TIMEOUT); 172 smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; 173 smtpClient.Host = HOST; 174 smtpClient.Port = Convert.ToInt32(PORT); 175 smtpClient.EnableSsl = ENABLESSL; 176 smtpClient.UseDefaultCredentials = true; 177 smtpClient.Send(mailMsg); 178 179 mailMsg.Attachments.Dispose(); 180 mailMsg.Dispose(); 183 } 184 } 185 catch (Exception ex) 186 { 187 msg = ex.Message; 188 logger.Error(ex); 189 } 190 finally 191 { 192 if (!stream.IsNull()) 193 stream.Close(); 194 } 195 return msg; 196 } 197 198 public static string Send(List<string> toList, List<string> ccList, string subject, string body, List<string> attachments) 199 { 200 return Send(toList, ccList, null, subject, body, attachments); 201 } 202 203 public static void SendApprovalNotifyEmail(string emailTo, List<AlertEmailUserInfo> alertEmailUserInfos, 204 List<string> emailCC = null, List<string> emailBCC = null, 205 List<string> attachment = null, string subject = "", 206 string text = "", SendType sendType = SendType.PreAlert) 207 { 208 try 209 { 210 SendEmail(emailTo, alertEmailUserInfos, emailCC, emailBCC, attachment, subject, text, sendType); 211 } 212 catch (Exception ex) 213 { 214 logger.Error(ex.ToString()); 215 } 216 } 217 218 private static void SendEmail(string emailTo, List<AlertEmailUserInfo> alertEmailUserInfos, 219 List<string> emailCC = null, List<string> emailBCC = null, 220 List<string> attachment = null, string subject = "", 221 string perText = "", SendType sendType = SendType.PreAlert) 222 { 223 try 224 { 225 HtmlDocument html = new HtmlDocument(); 226 string tempPath = ConfigurationManager.AppSettings["TemplatePath"]; 227 html.Load(tempPath); 228 StringBuilder sb = new StringBuilder(); 229 sb.Append("<table>"); 230 sb.Append("<thead>"); 231 sb.Append("<tr>"); 232 sb.Append("<td>email</td><td>ID</td>"); 233 sb.Append("</tr>"); 234 sb.Append("</thead>"); 235 sb.Append("<tbody>"); 236 foreach (var item in alertEmailUserInfos) 237 { 238 sb.Append("<tr>"); 239 sb.AppendFormat("<td>{0}</td>", item.a); 240 sb.AppendFormat("<td>{0}</td>", item.b); 241 sb.AppendFormat("<td " + (item.c? "class=\"redText\"" : "") + ">{0}</td>", item.d); 242 243 sb.Append("</tr>"); 244 } 245 sb.Append("</tbody>"); 246 sb.Append("</table>"); 247 var nodeCollection = html.DocumentNode.SelectNodes("//*[@id=\"tableParent\"]"); 248 foreach (var item in nodeCollection) 249 { 250 item.InnerHtml = sb.ToString(); 251 } 252 using (MemoryStream stream = new MemoryStream()) 253 { 254 html.Save(stream); 255 stream.Seek(0, SeekOrigin.Begin); 256 if (stream != null) 257 { 258 using (StreamReader streamGSKU = new StreamReader(stream)) 259 { 260 string plmail = ""; 261 List<string> emailToList = new List<string>(); 262 emailToList.AddRange(emailTo.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); 263 plmail = Send(emailToList, emailCC, emailBCC, subject, perText + "<br/><br/>" + streamGSKU.ReadToEnd(), 264 attachment); 265 } 266 } 267 } 268 } 269 catch (Exception ex) 270 { 271 logger.Error(ex.ToString()); 272 } 273 } 274 } 275 }