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\#프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.