一個簡易郵件群發軟體設計與實現
- 2019 年 10 月 3 日
- 筆記
1 ????
????????????????????????
2 ????
- ???????????????
- ??????
- ????????
3 ????
- ?????
- ???????
- ????
- ?????
4 ????
.Net 4.0 C# Winform
5 ??
5.1 ????
- ????? SimpleEmailSender
5.2 ??????????
- ????????
<configuration> <appSettings> <add key="email_stmp" value="smtp.****.com"/> <add key="send_user_email" value="****@****"/> <add key="send_user_pass" value="??"/> <add key="send_user_disp" value="?????" /> </appSettings> </configuration>
5.3 ????
????????????????
5.4 ???????
???????????????????????
?????????????? System.Configuration ???????
?? MailHelper ??????????????????????? SendMail?
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Net.Mail; using System.Text; namespace SimpleEmailSender { public class MailHelper { public static String EMAIL_USERNAME = ConfigurationManager.AppSettings["send_user_email"]; public static String EMAIL_DISPNAME = ConfigurationManager.AppSettings["send_user_disp"]; public static String EMAIL_PASSWORD = ConfigurationManager.AppSettings["send_user_pass"]; public static String EMAIL_SMTP = ConfigurationManager.AppSettings["email_stmp"]; public static ValidateResult SendMail(string email, string name, string content) { return SendMail("????", email, name, content); } /// <summary> /// ???? /// </summary> /// <param name="title">????</param> /// <param name="email">?????</param> /// <param name="name">?????</param> /// <param name="content">????</param> public static ValidateResult SendMail(string title, string email, string name, string content) { MailAddress from = new MailAddress(EMAIL_USERNAME, EMAIL_DISPNAME); //?????? MailMessage mail = new MailMessage(); //??????? mail.Subject = title; //???????? //Pass:?????????????????????mail???????????mail??????????????????? mail.From = from; //???????? mail.To.Add(new MailAddress(email, name)); //??????? mail.Body = content; //??????? mail.BodyEncoding = System.Text.Encoding.UTF8; mail.IsBodyHtml = true; //????????? mail.Priority = MailPriority.Normal; mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess; SmtpClient client = new SmtpClient(); //???? SMTP ??????????IP?????? client.Host = EMAIL_SMTP; //???? SMTP ?????????? 25 client.Port = 25; client.UseDefaultCredentials = false; //??????????????? client.Credentials = new System.Net.NetworkCredential(EMAIL_USERNAME, EMAIL_PASSWORD); client.DeliveryMethod = SmtpDeliveryMethod.Network; //?????????????????? ValidateResult vr = new ValidateResult(true, "?????"); try { client.Send(mail); return vr; } catch (Exception e) { vr.IsValid = false; vr.Message = e.Message; return vr; } } } public class ValidateResult { public bool IsValid { get; set; } public string Message { get; set; } public ValidateResult() { } public ValidateResult(bool v, string m) { IsValid = v; Message = m; } } }
5.5 ????
????????????????????????? List
/// <summary> /// ?????? /// </summary> /// <param name="mails"></param> /// <returns></returns> private List<string> ParseEmailList(string mails) { List<string> list = new List<string>(); var mc = Regex.Matches(mails, @"w+([.-]?w+)*@w+([.-]?w+)*(.w{2,3})+", RegexOptions.IgnoreCase); foreach (Match c in mc) { list.Add(c.Value); } return list; }
5.6 ????????
??????????????????????? Invoke ?????
/// <summary> /// ??????????? /// </summary> /// <param name="message"></param> private void Log(string message) { Invoke(new MethodInvoker(delegate { txtLog.AppendText(message + "rn"); })); }
5.7 ????
- ??????
??????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace SimpleEmailSender { public class EmailSender { #region ????? // ???? private List<string> _EmailList = new List<string>(); // ???? private volatile int _OverCount = 0; // ???? private string _Title; // ???? private string _Content; // ?????????????? private Action<string> _Callback; #endregion /// <summary> /// ?????? /// </summary> /// <returns></returns> public bool IsOver() { return _OverCount == _EmailList.Count; } /// <summary> /// ?????????????????? false? /// </summary> /// <param name="emails"></param> /// <param name="title"></param> /// <param name="content"></param> /// <param name="callback"></param> /// <returns></returns> public bool Send(List<string> emails, string title, string content, Action<string> callback) { if (!IsOver()) { return false; } _EmailList = emails; _OverCount = 0; _Title = title; _Content = content; _Callback = callback; Start(); return true; } /// <summary> /// ???? /// /// ?????????????????????1??????? /// </summary> private void Start() { foreach (string email in _EmailList) { var _email = email; ThreadPool.QueueUserWorkItem(t => { var vr = MailHelper.SendMail(_Title, _email, "", _Content); _OverCount++; _Callback(String.Format("??[{3}/{4}] {0} ?? {1}????{2}", _email, vr.IsValid ? "??" : "??", vr.Message, _OverCount, _EmailList.Count)); }); } } } }
5.8 ????
????????????????????????????????????????????????????????????
private EmailSender _Sender = new EmailSender(); // ???? private void btnSend_Click(object sender, EventArgs e) { if (!_Sender.IsOver()) { Log("????????????????"); return; } // 1. ???????????? string mails = txtEmailList.Text.Trim(); var list = ParseEmailList(mails); // 2. ??????? txtEmailList.Clear(); foreach (var mail in list) { txtEmailList.AppendText(mail + "rn"); } // 3. ???? var b = _Sender.Send(list, txtTitle.Text.Trim(), txtContent.Text, Log); Log(b ? "????" : "????"); }
6 ????
6.1 ???????
6.2 ???????
7 ?????
https://github.com/triplestudio/SimpleEmailSender