.NET 개발/C#

C# MailMessage 클래스로 네이버 메일 이용하기.

Hoya0415 2015. 11. 10. 16:00

도구 : Visual Studio 2013 Community, MSSQL


사전 지식 준비 : 

EntityFrameWork, Email 간단한 지식


.NET에는 System.Net.Mail DLL을 제공하고 있는데 Mail을 보낼 수 있는 기능이다. 

메일을 보내려면 Mail SMTP Server가 필요하다.


EmailModel 클래스를 보면, 생성자에서 인자를 받는데 Company를 이용해서 

FromEmail에 있는 SMTP 서버와 Port를 가져올것이고 IsSSL 을 사용할지도 데이터로 미리 넣어놔서 가져올 것이다.

그리고 나머지 제목, 내용, BodyHTML 여부로 인자를 줄 것인데, 굳이.. DB를 안하겠다면 Class로 만들어서 사용해도 된다..


1. 네이버 같은 경우는 로그인 후 메일 탭으로 이동하면 제일 하단에 [환경설정] 이라는 곳이 있다. 

2. 눌러보면 [POP3/SMTP 설정] 이 있는데 눌러보면 SMTP 서버와 PORT 가 있을 것이다. 이 정보가 SMTP 서버가 될것고, 이 네이버 서버를 이용하려면 사용자 정보가 필요하다. 

NetworkCredential(fromEmail.MailID, fromEmail.Password);

인증 관련해서 객체를 넣어주는 구문인데 본인 계정을 쓰면 되겠다. ㅎ


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 public class EmailModel : IDisposable
    {
        public FromEmail fromEmail { get; set; }
        public List<ToEmail> toMails { get; set; }
        public string Header { get; set; }
        public string Body { get; set; }
        public bool IsBodyHTML { get; set; }
        public MailMessage message { get; set; }
        public SendEmailResult _result;
        public event EventHandler<SendEmailResult> EmailSendCompleted;
 
        public EmailModel(string Company, string Header, string Body, bool IsBodyHTML)
        {
            this.Header = Header;
            this.Body = Body;
            this.IsBodyHTML = IsBodyHTML;
 
            try
            {
                using (var db = new DeepViewEntities(ConnectStringBuilder.DeepViewConnectionString().ToString()))
                {
                    var fromMails = db.FromEmail.Where(email => email.Company.ToLower() == Company);
 
                    if (fromMails.Count() > 0)
                        fromEmail = fromMails.First();
                    else
                        throw new Exception("formMail에 일치하는 Company가 없습니다.");
 
                    if (fromEmail != null)
                    {
                        var toMailList = db.ToEmail.Where(tomail => tomail.ServiceID == fromEmail.ID &&
                            tomail.IsActive == true).ToList();
 
                        if (toMailList.Count > 0)
                            toMails = toMailList;
                        else
                            throw new Exception("toMail에 해당하는 유저 정보가 없습니다.");
                    }
                }
            }
            catch (Exception ex)
            {
                _result = new SendEmailResult(false, ex);
            }
 
 
        }
 
        public void MailSend()
        {
 
 
            string smtpServer = fromEmail.Smtp;
 
            message = new MailMessage();
            message.Subject = Header;
            message.Body = Body;
            message.BodyEncoding = System.Text.Encoding.UTF8;
            message.Priority = MailPriority.High;
            if (IsBodyHTML)
                message.IsBodyHtml = true;
 
            toMails.ForEach(to => message.To.Add(to.MailID));
 
            // Credentials 계정이랑 From 계정이랑 동일 해야한다.
            message.From = new MailAddress(fromEmail.MailID);
 
            SmtpClient client = new SmtpClient(smtpServer);
            client.Port = fromEmail.SmtpPort;
            client.UseDefaultCredentials = true;
            client.Credentials = new NetworkCredential(fromEmail.MailID, fromEmail.Password);
 
            try
            {
                if (_result != null)
                    throw _result.Exception;
 
                client.Send(message);
            }
            catch (Exception ex)
            {
                _result = new SendEmailResult(false, ex);
                if (EmailSendCompleted != null)
                    EmailSendCompleted(this, _result);
            }
        }
 
        public void Dispose()
        {
            message.Dispose();
            GC.Collect(2);
            GC.WaitForPendingFinalizers();
        }
    }

cs




MSSQL DB