一個簡易郵件群發軟體設計與實現

  • 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 emailList ???????????????????????????????????????????????????????

        /// <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

????