반응형

프로그램을 개발할때 많이 쓰는 것 중에는 사용자에게 어떤 알림메시지를 보내는 것입니다.

사용자에게 메시지를 보내는 방법은 크게

SMS(문자) 발송, 이메일 발송, 우리나라 기준 한정으로 카카오 메시지 발송이 있을 것입니다.

 

이번 포스트에서는 그중에서도 이메일 발송에 대해 알아보도록 하겠습니다.

 

대개 email을 발송하기 위해서는 

이메일을 발송하는 이메일 서버(SMTP)와 이메일을 발송할 이메일 계정이 필요합니다.

 

C#에서는

.Net 라이브러리 중 System.Net.Mail 라이브러리 내

 

SmtpClient 클래스로 SMTP와 연결하고,

MailMessage 클래스로 이메일을 작성할 수 있습니다.

다만 이 포스트에서는 메일서버 구축이 아닌 보내기에 초점을 두었기 때문에 SMTP서버의 구축 관련한 내용은 다루지 않겠습니다.

 

참고로 무료로 풀려있는 SMTP 서버들이라 하더라도 일정 갯수가 넘어가게 발송하게되면 상업적용도로 간주되어 결제를 요구하기도 하니, 상업적용도로 사용하실 분들은 SMTP서버를 제공하는 각 기업에 절차에 맞게 결제 등을 하여 사용하시면 됩니다. c# 개발자 또는 엔지니어라면 아마도 Microsoft, 한국에서는 역시 naver, 그리고 kakao도 daum을 인수했기 때문에 smtp서버가 있을 것이라 판단됩니다. 

 

SqlClient도 그렇고 호출을 담당하는 클래스들은 ~Client로 명명하는 것이 규칙으로 보입니다.

먼저, SmtpClient를 선언합니다.

    using SmtpClient SmtpServer = new(smtpAddress)
    {
        Port = smtpPort,
        EnableSsl = true,
        UseDefaultCredentials = false,
        DeliveryMethod = SmtpDeliveryMethod.Network,
        Credentials = new NetworkCredential(mailSender, mailSenderPassword)
    };

smtpAddress 자리에는 SMTP Server의 주소를 입력하면되고

smtpPort에는 SMTP Server의 열려있는 포트를 이용하면 됩니다. 보통 암호화 보안연결을 사용하면 465나 587, 사용하지 않으면 25가 기본값으로 알려져있습니다.(https가 443, http가 80 인 것과 동일하게 생각하시면 되겠습니다.)

SMTP서버를 직접 구축하신 경우에는 네트워크에 지정한 포트번호를 이용하시면 되겠습니다.

 

SMTP에 연결할 계정은 NetworkCredential() 클래스에 (계정, 비밀번호) 형태의 생성자가 있으므로, SmtpClient 클래스의 인스턴스 필드 중 Credentials로 입력해주면 됩니다.

 

SmtpClient는 IDisposabled이 구현되어있어서 선언부 앞에 using을 붙여주면 사용하지 않을때 메모리를 해체할 수 있습니다.

 

Visual Studio 기준으로 ctrl버튼을 누른채로 작성한 SmtpClient를 클릭하면, 해당 클래스를 모두 보실 수 있는데요.

이외에도 여러 필드가 있지만 포스트의 예제에서는 저 정도만 사용하도록 하겠습니다.

 

SMTP를 연결했으면 이제는 이메일을 작성해야겠죠.

    using MailMessage email = new()
    {
        From = new MailAddress(mailSender),
        Subject = emailSubject,
        BodyEncoding = Encoding.UTF8,
        IsBodyHtml = true,
        Body = "본문 내용",
    };

 

만일 받는이가 1명이라면 MailMessge(string from, string to)라는 생성자가 존재하기 때문에 아래와 같이 선언하는 방법도 있습니다.

    using MailMessage email = new(mailSender, mailReceiver)
    {
        Subject = emailSubject,
        BodyEncoding = Encoding.UTF8,
        IsBodyHtml = true,
        Body = "본문 내용",
    };

 

 

왜 선언부에 To, Cc, Bcc를 안적으셨냐고 물으실 수 있는데요, 여러명한테 보낼 수 있다보니 세 변수는 컬렉션으로 구성되어있어요. (class MailAddressCollection : Collection ) 한명한테만 보낸다면 모르겠지만, 여러명한테도 보낼 상황이 있는 작업물이라면 선언하고 추가하는 방식이 좋습니다.

email.To.Add(받을사람1);
email.To.Add(받을사람2);
email.Cc.Add(참조1);
email.Bcc.Add(숨은참조1);

 

실제로 사용하실때는 받을 사람 자체가 컬렉션에 있어서 루프문을 통해서 Add하는 방식으로 가게 되곤 합니다.

 

BodyEncoding을 UTF.8 로 해줘야 영어가 아닌 문자가 깨지는 것을 방지할 수 있고,

IsBodyHtml = true 를 사용하게 되면, <div></div> <p></p> 등 html을 이메일 본문 내에 사용하면 랜더링 해줍니다.

false를 사용하면 글자 그대로 나오게 됩니다.

 

이메일을 다 작성했다면 메일 보내기를 해야겠죠?

 

SmtpServer.Send(email);

비동기 방식의 SendMailAsync(MailMessage email) 도 존재하고, cancellationToken을 사용하신다면, SendAsync(MailMessage email, CancellationToken  cancellationToken) 도 있습니다.

 

저같은 경우에는 email Body에 html을 넣어서 테이블로 어떤 데이터를 정리해서 보내주는 형식으로 개발을 많이 해서 Body에 엄청난 노가다를 하곤 했었는데요. 여러분의 상황에 맞게 잘 활용하시길 바라겠습니다.

반응형

+ Recent posts