Lumisoft.NET 구성 요소 와.NET API 를 깊이 파고 들 어 메 일 발송 기능 에 대한 비교 분석
1..NET 의 메 일 발송 기능 은.NET 자체 에 SmtpClient 류 와 관련 된 메 일 대상 류 를 밀봉 하여 이러한 라 이브 러 리 를 이용 하여 메 일의 발송 기능 을 편리 하 게 실현 할 수 있 습 니 다.
발송인 주소,베 끼 기 주소,암 송 주소(여러 주 소 는 쉼표 로 구분)코드 를 추가 하면 다음 과 같 습 니 다.
string toEmails = mailInfo.ToEmail;
string bcc = "";
mailInfo.RecipientBCC.ForEach(obj => bcc += string.Format("{0},", obj));
bcc = bcc.Trim(',');
string cc = "";
mailInfo.RecipientCC.ForEach(obj => cc += string.Format("{0},", obj));
cc = cc.Trim(',');
MailMessage mail = new MailMessage(settingInfo.MailFrom, toEmails);
if (!string.IsNullOrEmpty(bcc))
{
mail.Bcc.Add(bcc);
}
if (!string.IsNullOrEmpty(cc))
{
mail.CC.Add(cc);
}
.NET 의 첨부 파일 과 내장 형 자원 은 대상 Attachment 와 LinkedResource 에서 관리 합 니 다.그들의 이용 코드 는 다음 과 같 습 니 다.
//
foreach (string fileName in mailInfo.Attachments)
{
mail.Attachments.Add(new Attachment(fileName));
}
//
AlternateView view = AlternateView.CreateAlternateViewFromString(mailInfo.Body, Encoding.UTF8, MediaTypeNames.Text.Html);
foreach (LinkedAttachementInfo link in mailInfo.EmbedObjects)
{
LinkedResource resource = new LinkedResource(link.Stream, link.MimeType);
resource.ContentId = link.ContentId;
view.LinkedResources.Add(resource);
}
mail.AlternateViews.Add(view);
메 일 을 보 내 는 다른 부분 코드 는 다음 과 같 습 니 다
mail.IsBodyHtml = mailInfo.IsBodyHtml;
mail.BodyEncoding = Encoding.UTF8;
mail.Subject = mailInfo.Subject;
mail.SubjectEncoding = Encoding.UTF8;
//
SmtpClient client = new SmtpClient();
client.Host = settingInfo.SmtpServer;
client.Port = settingInfo.SmptPort;
client.UseDefaultCredentials = false;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Credentials = new NetworkCredential(settingInfo.SmtpUser, settingInfo.SmtpPass);
bool success = false;
try
{
client.Send(mail);
success = true;
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
//throw;
}
위 에서.net 의 SmtpClient 를 이용 하여 메 일 을 보 내 는 작업 의 전체 코드 는 다음 과 같 습 니 다.
/// <summary>
/// ( , )
/// </summary>
/// <param name="mailInfo"> </param>
/// <returns></returns>
public CommonResult Send(MailInfo mailInfo)
{
CommonResult result = new CommonResult();
try
{
AppConfig config = new AppConfig();
string MailDomain = config.AppConfigGet("MailDomain");
string MailUsername = config.AppConfigGet("MailUsername");
string MailPassword = config.AppConfigGet("MailPassword");
string MailPort = config.AppConfigGet("MailPort");
string MailFrom = config.AppConfigGet("MailFrom");
int port = 25;
int.TryParse(MailPort, out port);
SmtpSettingInfo settingInfo = new SmtpSettingInfo(MailDomain, port,
MailUsername, MailPassword, MailFrom);
result.Success = PrivateSendEmail(mailInfo, settingInfo);
}
catch (Exception ex)
{
result.ErrorMessage = ex.Message;
throw;
}
return result;
}
/// <summary>
///
/// </summary>
private static bool PrivateSendEmail(MailInfo mailInfo, SmtpSettingInfo settingInfo)
{
string toEmails = mailInfo.ToEmail;
string bcc = "";
mailInfo.RecipientBCC.ForEach(obj => bcc += string.Format("{0},", obj));
bcc = bcc.Trim(',');
string cc = "";
mailInfo.RecipientCC.ForEach(obj => cc += string.Format("{0},", obj));
cc = cc.Trim(',');
MailMessage mail = new MailMessage(settingInfo.MailFrom, toEmails);
if (!string.IsNullOrEmpty(bcc))
{
mail.Bcc.Add(bcc);
}
if (!string.IsNullOrEmpty(cc))
{
mail.CC.Add(cc);
}
//
foreach (string fileName in mailInfo.Attachments)
{
mail.Attachments.Add(new Attachment(fileName));
}
//
AlternateView view = AlternateView.CreateAlternateViewFromString(mailInfo.Body, Encoding.UTF8, MediaTypeNames.Text.Html);
foreach (LinkedAttachementInfo link in mailInfo.EmbedObjects)
{
LinkedResource resource = new LinkedResource(link.Stream, link.MimeType);
resource.ContentId = link.ContentId;
view.LinkedResources.Add(resource);
}
mail.AlternateViews.Add(view);
mail.IsBodyHtml = mailInfo.IsBodyHtml;
mail.BodyEncoding = Encoding.UTF8;
mail.Subject = mailInfo.Subject;
mail.SubjectEncoding = Encoding.UTF8;
//
SmtpClient client = new SmtpClient();
client.Host = settingInfo.SmtpServer;
client.Port = settingInfo.SmptPort;
client.UseDefaultCredentials = false;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Credentials = new NetworkCredential(settingInfo.SmtpUser, settingInfo.SmtpPass);
bool success = false;
try
{
client.Send(mail);
success = true;
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
//throw;
}
string message = string.Format(" 【{0}】 “{1}”,{2}, :{3}",
mailInfo.ToEmail[0], mailInfo.Subject, success ? " " : " ", DateTime.Now);
LogTextHelper.Info(message);
return success;
}
2.Lumisoft.NET 구성 요 소 를 기반 으로 한 메 일 발송 기능 은 Lumisoft.NET 구성 요 소 를 기반 으로 한 메 일 발송 을 실현 하 는 것 도 자주 사용 되 는 것 입 니 다.이 오픈 소스 구성 요소 가 매우 강하 기 때문에 일부 프로그램 에서 자주 사용 할 수 있 습 니 다.이 메 일 을 보 내 는 기능 은 주로 SMTP 를 이용 합 니 다.Client 클래스 에서 실 현 된 것 은 다음 코드 와 같 습 니 다.Authenticate 함수 가 버 려 졌 으 므 로 Auth 방법 으로 검증 할 수 있 습 니 다.그러나 함수 매개 변 수 는 다 릅 니 다.검증 대상 에 따라 검증 방식 을 다 르 게 사용 하고 보통 AUTH 를 선택 합 니 다.SASL_Client_Plain 대상 이면 됩 니 다.
public bool Send()
{
bool sended = false;
using (SMTP_Client client = new SMTP_Client())
{
client.Connect(smtpServer, smtpPort, smtpUseSsl);
client.EhloHelo(smtpServer);
var authhh = new AUTH_SASL_Client_Plain(username, password);
client.Auth(authhh);
//client.Authenticate(username, password);
//string text = client.GreetingText;
client.MailFrom(from, -1);
foreach (string address in toList.Keys)
{
client.RcptTo(address);
}
// Mail_Message Stream
Mail_Message m = Create_PlainText_Html_Attachment_Image(toList, ccList, from, fromDisplay, subject, body, attachments);
using (MemoryStream stream = new MemoryStream())
{
m.ToStream(stream, new MIME_Encoding_EncodedWord(MIME_EncodedWordEncoding.Q, Encoding.UTF8), Encoding.UTF8);
stream.Position = 0;
client.SendMessage(stream);
sended = true;
}
if (m != null)
{
m.Dispose();
}
client.Disconnect();
}
return sended;
}
SMTP 에서 보 내 는 데 이 터 를 구성 하여 Mail 을 사용 할 수 있 습 니 다.Message 대상,Mime 대상 도 사용 할 수 있 습 니 다.읽 어도 발송 기능 이 가능 하지만 Mime 대상 은 버 려 진 대상 입 니 다.구조 MailMessage 대상 을 만 든 후 보 낼 형식 을 Stream 대상 으로 변환 합 니 다.보 낸 스 트림 으로 전환 하 는 동작 은 다음 과 같 습 니 다.
using (MemoryStream stream = new MemoryStream())
{
m.ToStream(stream, new MIME_Encoding_EncodedWord(MIME_EncodedWordEncoding.Q, Encoding.UTF8), Encoding.UTF8);
stream.Position = 0;
client.SendMessage(stream);
sended = true;
}
구조 MailMessage 형식의 메 일 작업 은 다음 과 같 습 니 다.
private Mail_Message Create_PlainText_Html_Attachment_Image(Dictionary<string,string> tomails, Dictionary<string, string> ccmails, string mailFrom, string mailFromDisplay,
string subject, string body, Dictionary<string, string> attachments, string notifyEmail = "", string plaintTextTips = "")
{
Mail_Message msg = new Mail_Message();
msg.MimeVersion = "1.0";
msg.MessageID = MIME_Utils.CreateMessageID();
msg.Date = DateTime.Now;
msg.Subject = subject;
msg.From = new Mail_t_MailboxList();
msg.From.Add(new Mail_t_Mailbox(mailFromDisplay, mailFrom));
msg.To = new Mail_t_AddressList();
foreach (string address in tomails.Keys)
{
string displayName = tomails[address];
msg.To.Add(new Mail_t_Mailbox(displayName, address));
}
msg.Cc = new Mail_t_AddressList();
foreach (string address in ccmails.Keys)
{
string displayName = ccmails[address];
msg.Cc.Add(new Mail_t_Mailbox(displayName, address));
}
//
if (!string.IsNullOrEmpty(notifyEmail) && ValidateUtil.IsEmail(notifyEmail))
{
msg.DispositionNotificationTo.Add(new Mail_t_Mailbox(notifyEmail, notifyEmail));
}
#region MyRegion
//--- multipart/mixed -----------------------------------
MIME_h_ContentType contentType_multipartMixed = new MIME_h_ContentType(MIME_MediaTypes.Multipart.mixed);
contentType_multipartMixed.Param_Boundary = Guid.NewGuid().ToString().Replace('-', '.');
MIME_b_MultipartMixed multipartMixed = new MIME_b_MultipartMixed(contentType_multipartMixed);
msg.Body = multipartMixed;
//--- multipart/alternative -----------------------------
MIME_Entity entity_multipartAlternative = new MIME_Entity();
MIME_h_ContentType contentType_multipartAlternative = new MIME_h_ContentType(MIME_MediaTypes.Multipart.alternative);
contentType_multipartAlternative.Param_Boundary = Guid.NewGuid().ToString().Replace('-', '.');
MIME_b_MultipartAlternative multipartAlternative = new MIME_b_MultipartAlternative(contentType_multipartAlternative);
entity_multipartAlternative.Body = multipartAlternative;
multipartMixed.BodyParts.Add(entity_multipartAlternative);
//--- text/plain ----------------------------------------
MIME_Entity entity_text_plain = new MIME_Entity();
MIME_b_Text text_plain = new MIME_b_Text(MIME_MediaTypes.Text.plain);
entity_text_plain.Body = text_plain;
// , HTML,
string plainTextBody = " HTML , “ ” , ";
if (!string.IsNullOrEmpty(plaintTextTips))
{
plainTextBody = plaintTextTips;
}
text_plain.SetText(MIME_TransferEncodings.QuotedPrintable, Encoding.UTF8, plainTextBody);
multipartAlternative.BodyParts.Add(entity_text_plain);
//--- text/html -----------------------------------------
string htmlText = body;//"<html> ,<img src=\"cid:test.jpg\"> <font color=red><b>LumiSoft.Net</b></font></html>";
MIME_Entity entity_text_html = new MIME_Entity();
MIME_b_Text text_html = new MIME_b_Text(MIME_MediaTypes.Text.html);
entity_text_html.Body = text_html;
text_html.SetText(MIME_TransferEncodings.QuotedPrintable, Encoding.UTF8, htmlText);
multipartAlternative.BodyParts.Add(entity_text_html);
//--- application/octet-stream -------------------------
WebClient client = new WebClient();
foreach (string attach in attachments.Keys)
{
try
{
byte[] bytes = client.DownloadData(attach);
using (MemoryStream stream = new MemoryStream(bytes))
{
multipartMixed.BodyParts.Add(Mail_Message.CreateAttachment(stream, attachments[attach]));
}
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
}
}
#endregion
return msg;
}
구조 Mime 형식의 조작 은 다음 과 같다.
private Mime Create_Html_Attachment_Image(string mailTo, string mailFrom, string mailFromDisplay,
string subject, string body, List<string> attachments, Dictionary<string, string> embedImages, string notifyEmail = "", string plaintTextTips = "",
string replyEmail = "")
{
Mime m = new Mime();
MimeEntity mainEntity = m.MainEntity;
mainEntity.From = new AddressList();
mainEntity.From.Add(new MailboxAddress(mailFromDisplay, mailFrom));
mainEntity.To = new AddressList();
mainEntity.To.Add(new MailboxAddress(mailTo, mailTo));
mainEntity.Subject = subject;
mainEntity.ContentType = MediaType_enum.Multipart_mixed;
//
if (!string.IsNullOrEmpty(notifyEmail) && ValidateUtil.IsEmail(notifyEmail))
{
mainEntity.DSN = notifyEmail;
}
//
if (!string.IsNullOrEmpty(replyEmail) && ValidateUtil.IsEmail(replyEmail))
{
mainEntity.ReplyTo = new AddressList();
mainEntity.ReplyTo.Add(new MailboxAddress(replyEmail, replyEmail));
}
MimeEntity textEntity = mainEntity.ChildEntities.Add();
textEntity.ContentType = MediaType_enum.Text_html;
textEntity.ContentTransferEncoding = ContentTransferEncoding_enum.QuotedPrintable;
textEntity.DataText = body;
//
foreach (string attach in attachments)
{
MimeEntity attachmentEntity = mainEntity.ChildEntities.Add();
attachmentEntity.ContentType = MediaType_enum.Application_octet_stream;
attachmentEntity.ContentDisposition = ContentDisposition_enum.Attachment;
attachmentEntity.ContentTransferEncoding = ContentTransferEncoding_enum.Base64;
FileInfo file = new FileInfo(attach);
attachmentEntity.ContentDisposition_FileName = file.Name;
attachmentEntity.DataFromFile(attach);
}
//
foreach (string key in embedImages.Keys)
{
MimeEntity attachmentEntity = mainEntity.ChildEntities.Add();
attachmentEntity.ContentType = MediaType_enum.Application_octet_stream;
attachmentEntity.ContentDisposition = ContentDisposition_enum.Inline;
attachmentEntity.ContentTransferEncoding = ContentTransferEncoding_enum.Base64;
string imageFile = embedImages[key];
FileInfo file = new FileInfo(imageFile);
attachmentEntity.ContentDisposition_FileName = file.Name;
//string displayName = Path.GetFileNameWithoutExtension(fileName);
attachmentEntity.ContentID = key;//BytesTools.BytesToHex(Encoding.Default.GetBytes(fileName));
attachmentEntity.DataFromFile(imageFile);
}
return m;
}
상기 두 가지 발송 기능 을 종합 하면 메 일의 발송 조작 을 실현 할 수 있 고 다음 화면 은 메 일 을 보 내 는 인터페이스 이다.3.LumiSoft.NET 에 eml 메 일 파일 저장 및 eml 파일 전송 작업
위의 일반 메 일 을 제외 하고 Lumisoft 는 메 일 시리 얼 번 호 를 파일(.eml 메 일 파일)에 저장 한 다음 에 파일 을 스 트림 으로 읽 어 보 내 는 것 도 지원 합 니 다.어떤 경우 에는 메 일 을 eml 파일 에 저장 하 는 것 이 좋 습 니 다.
EML 파일 을 저장 하 는 작업 은 다음 과 같 습 니 다.
private void btnCreateFile_Click(object sender, EventArgs e)
{
string attachFile = Path.Combine(Application.StartupPath, "Attachment/Hotel2.png");
List<string> attachments = new List<string>();
attachments.Add(attachFile);
string subject = " ";
string body = "<html> , <font color=red><b>LumiSoft.Net</b></font></html>";
string bodyEmbedy = "<html> <img src=\"cid:test.jpg\">, <font color=red><b>LumiSoft.Net</b></font></html>";
Dictionary<string, string> embedList = new Dictionary<string, string>();
embedList.Add("test.jpg", "C:\\test.jpg");
// Eml
string path = Path.Combine(Application.StartupPath, "Eml");
DirectoryUtil.AssertDirExist(path);
string emlFile = string.Format("{0}/{1}.eml", path, DateTime.Now.ToFileTime());
Mime m = Create_Html_Attachment_Image(to, from, from, subject, bodyEmbedy, attachments, embedList);
m.ToFile(emlFile);
MessageUtil.ShowTips("OK");
}
EML 파일 을 보 내 는 작업 은 다음 과 같 습 니 다.
private void btnSendFile_Click(object sender, EventArgs e)
{
using (SMTP_Client client = new SMTP_Client())
{
int smtpPort = smtpUseSsl ? WellKnownPorts.SMTP_SSL : WellKnownPorts.SMTP;
client.Connect(smtpServer, smtpPort, smtpUseSsl);
client.EhloHelo(smtpServer);
//var authhh = new AUTH_SASL_Client_Plain(username, password);
//client.Auth(authhh);
client.Authenticate(username, password);
//string text = client.GreetingText;
client.MailFrom(from, -1);
client.RcptTo(to);
string path = Path.Combine(Application.StartupPath, "Eml");
string emlFile = Directory.GetFiles(path)[0];
var msg = Mail_Message.ParseFromFile(emlFile);
MemoryStream stream = new MemoryStream();
msg.ToStream(stream, new MIME_Encoding_EncodedWord(MIME_EncodedWordEncoding.Q, Encoding.UTF8), Encoding.UTF8);
stream.Position = 0;
client.SendMessage(stream);
client.Disconnect();
}
MessageUtil.ShowTips("OK");
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Lumisoft.NET 구성 요소 와.NET API 를 깊이 파고 들 어 메 일 발송 기능 에 대한 비교 분석저 는 다른 글 인 에서 대체적으로 이 Lumisoft.NET 구성 요소 의 사용 에 대해 소 개 했 습 니 다.물론 Lumisoft.NET 구성 요 소 는 메 일 발송 기능 을 제공 하 는 것 외 에 메 일 수신 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.