블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday




 보통 서버에 SMTP 설치/설정해서 .NET에서 지원하는 SmtpClient객체를 이용해서 메일을 보냈을 것 이다. 이렇게 해도 메일을 발송하는데는 별 문제가 없다. 하지만, 간혹 메일을 보내면 포탈사이트 메일을 사용하는 사용자들에게는 스펨으로 빠지는 경우가 있다. 그 이유는 메일보내는 도메인이 화이트리스트에 등록이 안되있어서 그런데 이를 해결하기 위해서는 KISA RBL에 등록을 해야한다. (자세한 내용은 사이트를 확인 바람.) 아무튼 귀찮은 작업이다. 

 이를 간단하게 해결하는 방법으로 Gmail과 Live(둘중 선택) SMTP를 이용하면 될 것이다. Gmail과 Live는 외부에서 접근이 가능하게 SMTP주소와 포트를 오픈해 놨다. 그래서 간단하게 예제 소스를 만들어 봤다. 

 Visual Studio를 이용해서 웹프로젝트를 하나 생성해서 Default.aspx에 아래 코드를 작성해 보자.

Default.aspx

<body>

    <form id="form1" runat="server">

    <div>

        ㅁ 메일 작성!!<br />

        <br />

        SMTP 선택 :

        <asp:DropDownList runat="server" ID="ddlSmtpList">

            <asp:ListItem Text="Gmail" Value="1" />

            <asp:ListItem Text="Live" Value="0" />

        </asp:DropDownList>

        <br />

        받는 사람 :

        <asp:TextBox runat="server" ID="txtToMailAddress" /><br />

        제목 :

        <asp:TextBox runat="server" ID="txtTitle" Style="width: 560px" /><br />

        <asp:TextBox runat="server" ID="txtBody" Style="width: 600px; height: 400px;" TextMode="MultiLine" /><br />

        <asp:Button runat="server" ID="btnSend" OnClick="btnSend_Click" Text="전송" />

    </div>

    </form>

</body>


간단한 코드다. Gmail 또는 Live SMTP를 사용지에 대한 DropDownList와 수신자 메일을 지정할 텍스트박스, 제목을 적을 텍스트박스, 내용을 적을 텍스트박스 그리고 전송위한 버튼...간단하게 5개 컨트롤들을 지정해 봤다. 그럼 .cs 코드를 보자.

Default.aspx.cs

        /// <summary>

        /// Live smtp서버 주소

        /// </summary>

        private const string LIVESMTP_SERVER = "smtp.live.com";

 

        /// <summary>

        /// Gmail smtp서버 주소

        /// </summary>

        private const string GMAILSMTP_SERVER = "smtp.gmail.com";

 

        /// <summary>

        /// SMTP포트

        /// </summary>

        private const int SMTPPORT = 587;

 

        protected void Page_Load(object sender, EventArgs e)

        {

        }

 

        /// <summary>

        /// 전송버튼 이벤트

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        protected void btnSend_Click(object sender, EventArgs e)

        {

            MailAddress from = new MailAddress()

            {

                Email = "kdw8751@gmail.com",

                DisplayName = "Dongwook"

            };

 

            MailAddress to = new MailAddress()

            {

                Email = txtToMailAddress.Text

            };

 

            bool isGmail = ddlSmtpList.SelectedValue == "1" ? true:false;

 

            SendMail(txtTitle.Text, txtBody.Text, to, from, isGmail);

        }

 

        /// <summary>

        /// 메일을 발송합니다.

        /// </summary>

        /// <param name="title">제목</param>

        /// <param name="body">내용</param>

        /// <param name="to">수신자</param>

        /// <param name="from">발신자</param>

        /// <param name="isGmail">Gmail Smtp 여부</param>

        private void SendMail(string title, string body, MailAddress to, MailAddress from, bool isGmail)

        {

            // SmtpClient 변수 선언

            SmtpClient smtp;

 

            if (isGmail)

            {

                smtp = new SmtpClient(GMAILSMTP_SERVER, SMTPPORT);

                // Gmail메일 ID/ Password 지정

                smtp.Credentials = new NetworkCredential("Gmail아이디@gmail.com", "Gmail Password");

            }

            else

            {

                smtp = new SmtpClient(LIVESMTP_SERVER, SMTPPORT);

                // Live메일 ID/ Password 지정

                smtp.Credentials = new NetworkCredential("Live아이디@live.com", "Live Password");

            }

 

            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

            smtp.EnableSsl = true;

 

            MailMessage message = CreateDefaulMailMessage(from, to, title, body);

            object userState = message;

 

            // 비동기 이벤트

            smtp.SendCompleted += new SendCompletedEventHandler(smtp_SendCompleted);

            // 비동기 호출

            smtp.SendAsync(message, userState);

            // 동기호출

            //smtp.Send(message);

        }

 

        /// <summary>

        /// 비동기 호출 이벤트

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void smtp_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)

        {

            if (e.Error != null)

                return;

        }

 

        /// <summary>

        /// 기본적인 메일 메세지를 생성하여 반환합니다.

        /// </summary>

        /// <param name="from">발신자 이메일</param>

        /// <param name="to">수신자 이메일</param>

        /// <param name="subject">메일 제목</param>

        /// <param name="body">메일 본문</param>

        /// <returns>메일 메세지 객체</returns>

        private MailMessage CreateDefaulMailMessage(MailAddress from, MailAddress to, string subject, string body)

        {

            // 메일 메세지 객체 생성

            MailMessage message = new MailMessage();

 

            //// 보내는 사람

            message.From = from.ConvertToBuiltInMailAddress();

 

            // 수신자 지정합니다.

            message.To.Add(to.ConvertToBuiltInMailAddress());

 

            // 제목 인코딩

            message.SubjectEncoding = System.Text.Encoding.UTF8;

            // 제목

            message.Subject = subject;

 

            // 본문 인코딩

            message.BodyEncoding = System.Text.Encoding.UTF8;

            // 본문

            message.Body = body;

 

            // HTML 허용

            message.IsBodyHtml = true;

 

            // 우선순위

            message.Priority = MailPriority.Normal;

            return message;

        }

    }

 

    /// <summary>

    /// 메일 정보

    /// </summary>

    public class MailAddress

    {

        /// <summary>

        /// 메일주소를 지정/반환합니다.

        /// </summary>

        public string Email { get; set; }

 

        /// <summary>

        /// 이름을 지정/반환합니다.

        /// </summary>

        public string DisplayName { get; set; }

 

        /// <summary>

        /// 빌트인 MailAddress 객체를 만들어 반환합니다.

        /// </summary>

        /// <returns></returns>

        public System.Net.Mail.MailAddress ConvertToBuiltInMailAddress()

        {

            return new System.Net.Mail.MailAddress(this.Email, this.DisplayName);

        }

    }


위 코드에서 주석을 보면서 보면 이해하기 쉬울것 이다. 내용을 다 입력한후 전송버튼을 클릭하면 btnSend_Click로 이벤트로 들어 올것이다. 여기서 드롭다운리스트에서 선택되어 있는 SMTP주소를 지정한다. 그리고 제목, 내용, 수진자지정, 보낸 사람지정후 메일을 보내진다. 코드는 아주 간단하다. 실행해 보면 잘 될 것이다. (소스는 버리기 아까우니 첨부파일로 올려놓겠다.)

주요 내용은 Live SMTP주소가 smtp.live.com 이고, Gmail SMTP주소는 smtp.gmail.com 이다. 포트는 둘다 587로 되어 있다. 그리고 메일을 보내기 위해서는 Live, Gmail 계정이 반드시 있어야 한다. 

참고 )
Live SMTP를 이용하면 메일을 발송할수 있는 건수가 제한이 되어 있다. 총 몇건인지 자세히 알아 보진 않았지만... 테스트로 20건 정도 반복해서 보내봤는데... 계정이 막혀버렸다. 그래서 Live에 다시 직접 로그인해서 풀어줘야하는 번거로운이 있엇다.  그에 비해 Gmail은 계정이 막히거나 그러지 않았다. Gmail의 메일 발송 한도는 아래 링크를 확인 하기 바란다.
(http://mail.google.com/support/bin/answer.py?hl=ko&answer=22839)


Posted by happydong
, |