C\#시스템 방법 으로 비동기 메 일 전체 인 스 턴 스 를 보 냅 니 다.

6793 단어 C#보내다우편물
본 고 는 C\#시스템 방법 으로 비동기 메 일 을 보 내 는 것 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
프로젝트 배경:
최근 몇 년 전 프로젝트 를 재 구성 한 결과 메 일 발송 기능 은 일정 시간 이 걸 리 고 발송 이 동기 화 되 어 메 일 을 보 낼 때 후속 작업 을 수행 할 수 없 음 을 발견 했다.
실제로 메 일 을 보 낸 후 보 낸 결 과 를 시스템 로그 에 기록 하면 다른 업무 에 영향 을 주지 않 기 때문에 보 낸 메 일 작업 을 비동기 로 변경 하기 로 했 습 니 다.
C\#메 일 라 이브 러 리 를 사용 하기 때문에 C\#자체 가 비동기 로 보 내 는 기능 을 제공 합 니 다.즉,Send 방법 을 SendAsync 로 바 꾸 면 됩 니 다.방법 명 을 바 꾸 는 것 은 어렵 지 않 지만 보 낸 후에 로 그 를 쓰 는 것 은 어렵 습 니 다.
프로젝트 에서 메 일 을 보 내 는 것 은 단독 구성 요소 이기 때문에 메 일 라 이브 러 리 에 로그 쓰기 동작 을 직접 추가 할 수 없습니다.(같은 라 이브 러 리 에 있 지 않 습 니 다.네트워크 와 MSDN 의 예 는 같은 구성 요소 아래 에 있 습 니 다)
그러나 C\#의뢰 를 통 해 방법 을 매개 변수 로 전달 할 수 있 기 때문에 저 는 메 일 을 보 내 는 방법 에 리 셋 방법 을 추가 할 수 있 습 니 다.비동기 로 메 일 을 보 낸 후에 리 셋 방법 을 실행 하면 됩 니 다.
전체 코드:

/******************************************************************
 *    :HTL
 *   :C#       Demo
 *******************************************************************/
using System;
using System.Net.Mail;
namespace SendAsyncEmailTest
{
  class Program
  {
    const string dateFormat = "yyyy-MM-dd :HH:mm:ss:ffffff";
    static void Main(string[] args)
    {
      Console.WriteLine("        ,  :" + DateTime.Now.ToString(dateFormat));
      new MailHelper().SendAsync("Send Async Email Test", "This is Send Async Email Test", "[email protected]", emailCompleted);
      Console.WriteLine("        ,  :" + DateTime.Now.ToString(dateFormat));
      Console.ReadKey();
      Console.WriteLine();
    }
    /// <summary>
    ///           
    /// </summary>
    /// <param name="message"></param>
    static void emailCompleted(string message)
    {
      //  1 
      System.Threading.Thread.Sleep(1000);
      Console.WriteLine();
      Console.WriteLine("      :\r
" + (message == "true" ? " " : " ") + ", :" + DateTime.Now.ToString(dateFormat)); // } } /// <summary> /// /// </summary> public class MailHelper { public delegate int MethodDelegate(int x, int y); private readonly int smtpPort = 25; readonly string SmtpServer = "smtp.baidu.com"; private readonly string UserName = "[email protected]"; readonly string Pwd = "baidu.com"; private readonly string AuthorName = "BaiDu"; public string Subject { get; set; } public string Body { get; set; } public string Tos { get; set; } public bool EnableSsl { get; set; } MailMessage GetClient { get { if (string.IsNullOrEmpty(Tos)) return null; MailMessage mailMessage = new MailMessage(); // foreach (string _str in Tos.Split(',')) { mailMessage.To.Add(_str); } mailMessage.From = new System.Net.Mail.MailAddress(UserName, AuthorName); mailMessage.Subject = Subject; mailMessage.Body = Body; mailMessage.IsBodyHtml = true; mailMessage.BodyEncoding = System.Text.Encoding.UTF8; mailMessage.SubjectEncoding = System.Text.Encoding.UTF8; mailMessage.Priority = System.Net.Mail.MailPriority.High; return mailMessage; } } SmtpClient GetSmtpClient { get { return new SmtpClient { UseDefaultCredentials = false, Credentials = new System.Net.NetworkCredential(UserName, Pwd), DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network, Host = SmtpServer, Port = smtpPort, EnableSsl = EnableSsl, }; } } // Action<string> actionSendCompletedCallback = null; ///// <summary> ///// ///// </summary> ///// <param name="subject"> </param> ///// <param name="body"> </param> ///// <param name="to"> , , </param> //// <param name="_actinCompletedCallback"> </param> ///// <returns></returns> public void SendAsync(string subject, string body, string to, Action<string> _actinCompletedCallback) { if (string.IsNullOrEmpty(to)) return; Tos = to; SmtpClient smtpClient = GetSmtpClient; MailMessage mailMessage = GetClient; if (smtpClient == null || mailMessage == null) return; Subject = subject; Body = body; EnableSsl = false; // actionSendCompletedCallback = _actinCompletedCallback; smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); try { smtpClient.SendAsync(mailMessage, "true");// , "true" } catch (Exception e) { throw new Exception(e.Message); } finally { smtpClient = null; mailMessage = null; } } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void SendCompletedCallback(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { // , // //return; if (actionSendCompletedCallback == null) return; string message = string.Empty; if (e.Cancelled) { message = " "; } else if (e.Error != null) { message = (string.Format("UserState:{0},Message:{1}", (string)e.UserState, e.Error.ToString())); } else message = (string)e.UserState; // actionSendCompletedCallback(message); } } }
실행 효과 그림 은 다음 과 같 습 니 다:

더 많은 C\#관련 내용 에 관심 이 있 는 독 자 는 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 C\#프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기