최근 작업 때문에 ASP.NET 1.1 프로그램을 유지관리해야 합니다. 예전에는 C# 2.0 System.Net.Mail 네임스페이스를 사용하여 이메일을 잘 보냈으나 ASP.NET에서는 System.Web.Mail에 문제가 많습니다. 1.1이므로 다른 전략을 선택했습니다. 이 전략은 이메일 전송을 위한 인터페이스를 캡슐화한 다음 다른 방법으로 이메일 전송을 구현하므로 다음과 같은 말이 있습니다.
모든 구현을 캡슐화하기 위해 추상 인터페이스를 정의합니다
.
System.Web.Mail
네임스페이스 YywMail
사용
{
공개 추상 클래스 MySmtpMail
{
Fields#region 필드
개인 문자열 _defaultCharset = "GB2312";
25
;
Properties#region 속성
protected string DefaultCharset
{
get { return this._defaultCharset }
}
protected int DefaultSmtpPort
{
get { return this._defaultSmtpPort;}
}
#endregion
메소드#region 메소드
/**//// <summary>
/// 기본 인스턴스를 가져옵니다.
/// </summary>
/// <반환></반환>
공개 정적 MySmtpMail GetDefaultInstance()
{
// 여기에서 외부 구성 파일을 통해 특정 구현 유형을 정의할 수 있습니다.
// Activator.CreateInstance()를 통해 유형 인스턴스를 가져옵니다.
}
/**//// <요약>
/// 초기화 작업 수행
/// </summary>
공개 추상 무효 Open()
/**//// <요약>
/// 객체 파괴
/// </summary>
공개 추상 무효 Close()
/**//// <요약>
/// 이메일 보내기
/// </summary>
/// <param name="메시지"></param>
/// <param name="smtpServer"></param>
/// <param name="serverUsername"></param>
/// <param name="serverPassword"></param>
/// <반환></반환>
public bool Send(MailMessage 메시지, 문자열 smtpServer, 문자열 serverUsername, 문자열 serverPassword)
{
return Send(message, smtpServer, serverUsername, serverPassword, this._defaultSmtpPort);
}
public abstract bool Send(MailMessage 메시지, 문자열 smtpServer, 문자열 serverUsername, 문자열 serverPassword, int smtpPort)
public static string[] GetTo(MailMessage 메시지);
{
if (메시지 == null)
throw new ArgumentNullException("message");
if (Globals.IsNullorEmpty(message.To))
null 반환;
메시지 반환.To.Split(';');
}
공개 정적 문자열[] GetCc(MailMessage 메시지)
{
if (메시지 == null)
throw new ArgumentNullException("message");
if (Globals.IsNullorEmpty(message.Cc))
null 반환;
메시지 반환.Cc.Split(';');
}
공개 정적 문자열[] GetBcc(MailMessage 메시지)
{
if (메시지 == null)
throw new ArgumentNullException("message");
if (Globals.IsNullorEmpty(message.Bcc))
null 반환;
메시지 반환.Bcc.Split(';');
}
#끝지역
}
}
참고: 상식적으로 사용 전 Open(), 사용 후 Close()를 잊지 마세요.
구현 계획 1(Jmail 구성 요소):
.NET에서 Jmail을 사용하려면 다음 설정이 필요합니다.
1. jmail을 설치합니다.
2. jmail.dll을 찾으세요.
3. Jmail.dll 구성 요소를 등록하려면 jmail.dll 파일을 system32 디렉터리에 복사한 다음 "regsvr32 jmail.dll" 명령을 실행합니다(인용 부호 제외). 제거하려면 "regsvr32 /u jmail.dll"을 실행합니다. ;
4. Program FilesMicrosoft Visual Studio .NETFrameworkSDKBinildasm.exe(Visual Studio .Net 2003 명령 프롬프트를 사용할 수 있음)를 실행합니다.
형식은 다음과 같습니다: tlbimp c:Program FilesDimacw3JMail4jmail.dll /out:MyJmail.dll /namespace:MyJmail
MyJmail.dll을 생성한 후 이를 프로젝트에 참조합니다.
구성 요소를 다운로드한
후다음 단계는 구현 클래스를 작성하는 것입니다.
using System;
System.Web.Mail
네임스페이스 YywMail
사용
{
공개 클래스 JMailSmtpMail : MySmtpMail
{
Fields#region 필드
MyJmail.Message jmail = null
#endregion
메소드#region 메소드
공개 재정의 void Open()
{
jmail = 새로운 MyJmail.Message();
}
공개 재정의 bool Send(MailMessage 메시지, 문자열 smtpServer, 문자열 serverUsername, 문자열 serverPassword, int smtpPort)
{
if (jmail == null)
throw new Exception("smtp가 닫혔습니다!");
if (메시지 == null)
throw new ArgumentNullException("message");
DateTime t = DateTime.Now;
//Silent 속성: true로 설정하면 JMail.Send(()는 작업 결과에 따라 true 또는 false를 반환합니다.
jmail.Silent = false;
//logging 속성이 true로 설정된 경우 jmail에 의해 생성된 로그
jmail.Logging = true;
//문자 집합, 기본값은 "US-ASCII"입니다.
jmail.Charset = base.DefaultCharset;
//문자의 내용 유형입니다. 기본값은 "text/plain"입니다.): String 이메일을 HTML 형식으로 보낼 경우 "text/html"로 변경합니다.
if(message.BodyFormat == MailFormat.Html)
jmail.ContentType = "텍스트/html";
jmail.Priority = GetJmailPriority(message.Priority);
//수신자 추가
string[] toArray = MySmtpMail.GetTo(message);
if (toArray != null && toArray.Length > 0)
{
bool isAddedRecipient = false;
for (int i = 0; i < toArray.Length; i++)
{
if (Globals.IsNullorEmpty(toArray[i]))
계속;
if (!isAddedRecipient)
{
jmail.AddRecipient(toArray[i], String.Empty, String.Empty);
isAddedRecipient = true;
}
또 다른
{
jmail.AddRecipientCC(toArray[i], String.Empty, String.Empty);
}
}
}
string[] ccArray = MySmtpMail.GetCc(message);
if(ccArray != null)
{
foreach(ccArray의 문자열 cc)
{
if (!Globals.IsNullorEmpty(cc))
jmail.AddRecipientCC(cc, String.Empty, String.Empty);
}
}
string[] bccArray = MySmtpMail.GetBcc(message);
if(ccArray != null)
{
foreach(bccArray의 문자열 bcc)
{
if (!Globals.IsNullorEmpty(bcc))
jmail.AddRecipientBCC(bcc, String.Empty);
}
}
jmail.From = message.From
//발신자의 이메일 사용자 이름
jmail.MailServerUserName = 서버사용자이름;
//보내는 사람의 이메일 비밀번호
jmail.MailServerPassWord = 서버비밀번호;
//이메일 제목 설정
jmail.Subject = 메시지.제목;
//이메일에 첨부 파일을 추가합니다(첨부 파일이 여러 개인 경우 jmail.AddAttachment("c:\test.jpg",true,null);)를 추가하면 완료됩니다. [참고]: 첨부파일을 추가한 후 위의 jmail.ContentType="text/html";을 삭제하세요. 그렇지 않으면 이메일에 잘못된 문자가 나타납니다.
//jmail.AddAttachment("c:\test.jpg", true, null);
//이메일 내용
jmail.Body = message.Body;
if (message.BodyFormat == MailFormat.Html)
jmail.Body += "<br><br>";
또 다른
jmail.Body += "rnrn";
jmail.Body += DateTime.Now.ToString();
smtpServer = String.Format("{0}:{1}", smtpServer, smtpPort);
//Jmail 전송 방법
bool result = jmail.Send(smtpServer, false)
결과 반환;
}
공개 재정의 무효 닫기()
{
jmail.Close();
}
개인 정적 바이트 GetJmailPriority(System.Web.Mail.MailPriority 우선 순위)
{
// 메일 수준, 1은 긴급, 3은 보통, 5는 낮은 수준
if (priority == System.Web.Mail.MailPriority.High)
1을 반환합니다.
(우선순위 == System.Web.Mail.MailPriority.Low)
5를 반환하고
3을 반환합니다.
}
#끝지역
}
}
구현 계획 2(OpenSmtp.Net 구성 요소):
OpenSmtp.Net을 먼저 접해 본 적이 없는 분들을 위해 먼저 Google에 검색해 보세요. 동시에 OpenSmtp의 쌍둥이 형제인 OpenPop도 있습니다. .Net. OpenSmtp.Net은 http://sourceforge.net/projects/opensmtp-net/ 에서 다운로드할 수 있습니다. 최신 버전은 1.11입니다.
다음으로 주제를 살펴보겠습니다:
시스템 사용;
System.Web.Mail 사용;
OpenSmtp.Mail
네임스페이스 YywMail
사용
{
공개 클래스 OpenSmtpMail : MySmtpMail
{
Files#region 파일
OpenSmtp.Mail.MailMessage msg = null;
Smtp smtp = null;
#endregion
메서드#region 메서드
공개 재정의 void Open()
{
msg = 새로운 OpenSmtp.Mail.MailMessage();
smtp = 새로운 Smtp();
}
공개 재정의 bool Send(System.Web.Mail.MailMessage 메시지, 문자열 smtpServer, 문자열 serverUsername, 문자열 serverPassword, int smtpPort)
{
if (msg == null || smtp == null)
throw new Exception("smtp가 닫혔습니다!")
if (message == null)
throw new ArgumentNullException("message");
SmtpConfig.VerifyAddresses = false;
EmailAddress from = new EmailAddress(message.From, message.From);
msg.Charset = base.DefaultCharset
msg.From = ;
msg.Priority = GetOpenSmtpPriority(message.Priority);
//수신자 추가
string[] toArray = MySmtpMail.GetTo(message);
if (toArray != null)
{
foreach(toArray에 대한 문자열)
{
if (!Globals.IsNullorEmpty(to))
msg.AddRecipient(to, AddressType.To);
}
}
string[] ccArray = MySmtpMail.GetCc(message);
if(ccArray != null)
{
foreach(ccArray의 문자열 cc)
{
if (!Globals.IsNullorEmpty(cc))
msg.AddRecipient(cc, AddressType.Cc);
}
}
string[] bccArray = MySmtpMail.GetBcc(message);
if(ccArray != null)
{
foreach(bccArray의 문자열 bcc)
{
if (!Globals.IsNullorEmpty(bcc))
msg.AddRecipient(bcc, AddressType.Bcc);
}
}
msg.Subject = message.Subject;
if (message.BodyFormat == System.Web.Mail.MailFormat.Html)
{
msg.HtmlBody = message.Body + "<br><br>" + DateTime.Now.ToString();
}
또 다른
{
msg.Body = message.Body + "rnrn" + DateTime.Now.ToString();;
}
문자열 str1 = msg.HtmlBody;
문자열 str2 = msg.Body;
smtp.Host = smtp서버;
smtp.Username = 서버사용자 이름;
smtp.Password = 서버비밀번호;
smtp.Port = smtpPort;
smtp.SendMail(msg);
반환 true;
}
공개 재정의 무효 닫기()
{
메시지 = null;
smtp = null;
}
개인 정적 문자열 GetOpenSmtpPriority(System.Web.Mail.MailPriority 우선 순위)
{
// 메일 수준, 1은 긴급, 3은 보통, 5는 낮은 수준
if (priority == System.Web.Mail.MailPriority.High)
OpenSmtp.Mail.MailPriority.High를 반환합니다.
if (우선순위 == System.Web.Mail.MailPriority.Low)
OpenSmtp.Mail.MailPriority.Low를 반환하고
OpenSmtp.Mail.MailPriority.Normal을 반환합니다.
}
#끝지역
}
}
구현 계획 3:
(위의 두 구현 계획은 현재 요구 사항을 충족하기에 충분하며 필요한 경우 확장할 수 있습니다.)