Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 7개 있습니다.)
기타: 58. Outlook에 설정한 SMTP/POP3(예:천리안 메일) 계정 암호를 잊어버린 경우
; https://www.sysnet.pe.kr/2/0/11010

기타: 59. outlook.live.com 메일 서비스의 아웃룩 POP3 설정하는 방법
; https://www.sysnet.pe.kr/2/0/11011

.NET Framework: 761. C# - SmtpClient로 SMTP + SSL/TLS 서버를 이용하는 방법
; https://www.sysnet.pe.kr/2/0/11537

개발 환경 구성: 454. Azure 가상 머신(VM)에서 SMTP 메일 전송하는 방법
; https://www.sysnet.pe.kr/2/0/11994

.NET Framework: 848. C# - smtp.daum.net 서비스(Implicit SSL)를 이용해 메일 보내는 방법
; https://www.sysnet.pe.kr/2/0/11995

오류 유형: 757. 구글 메일 - 아웃룩에서 메일 전송 시 Sending' reported error (0x800CCC0F, 0x800CCC92)
; https://www.sysnet.pe.kr/2/0/12784

닷넷: 2328. C# - MailKit: SMTP, POP3, IMAP 지원 라이브러리
; https://www.sysnet.pe.kr/2/0/13908




C# - smtp.daum.net 서비스(Implicit SSL)를 이용해 메일 보내는 방법

다음(Daum) 메일을 위한 SMTP 설정은 홈페이지에 접속 후 아래의 경로를 통해 확인할 수 있습니다.

IMAP / SMTP 설정값 안내
; https://mail.daum.net/#setting/POP3IMAP

위의 설정을 바탕으로 지난 글의 소스 코드에서 사용한,

Azure 가상 머신(VM)에서 SMTP 메일 전송하는 방법
; https://www.sysnet.pe.kr/2/0/11994

SmtpClient를 이용하면,

smtp.Host = "smtp.daum.net";
smtp.Port = 465;
smtp.EnableSsl = true;
smtp.Credentials = new NetworkCredential("...", "...");

다음과 같은 식으로 timed-out 예외가 발생합니다.

Unhandled Exception: System.Net.Mail.SmtpException: The operation has timed out.
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at Program.Main(String[] args) in c:\temp\ConsoleApp1\Program.cs:line 23

검색해 보면 이것은 daum 측의 메일 서버가 ("Explicit SSL"이 아닌) "Implicit SSL"을 사용하기 때문이라고 하며, 이 방식은 근래에 잘 사용하지 않는다고 합니다. 두 가지 방식의 차이점은 아래의 자료에서,

INFO: TLS/SSL implicit and explicit modes difference
; https://www.rebex.net/kb/tls-ssl-explicit-implicit/

자세한 설명과 함께 포트 정리까지 잘 다루고 있습니다.

[표 출처: https://www.rebex.net/kb/tls-ssl-explicit-implicit/]
smtp_implicit_ssl_1.png

따라서 C#에서 Daum 메일 서비스를 이용하려면 "Implicit SSL"을 사용해야 하는데 아쉽게도 System.Net.Mail.SmtpClient는 "Explicit SSL" 방식만 지원한다고 합니다. 이 문제를 해결하기 위해 검색해 보면,

smtp 사용 - 막 검색해도 답이 안나와요
; http://cafe.daum.net/aspdotnet/5wZX/4461

CDO COM 객체를 이용하면 된다고 합니다.

GMail SMTP via C# .Net errors on all ports
; https://stackoverflow.com/questions/1082216/gmail-smtp-via-c-sharp-net-errors-on-all-ports/3845907#3845907

하지만 그보다는 다음의 글에서 제시한,

C# send email using implicit ssl
; https://stackoverflow.com/questions/8878309/c-sharp-send-email-using-implicit-ssl

System.Net.Mail with SSL to authenticate against port 465
; https://learn.microsoft.com/en-us/archive/blogs/webdav_101/system-net-mail-with-ssl-to-authenticate-against-port-465

System.Web.Mail의 MailMessage와 SmtpMail 객체를 이용하는 것이 더 낫습니다. 결국, smtp.daum.net을 이용한 코드를 다음과 같이 정리할 수 있습니다.

using System.Web.Mail; // System.Web 어셈블리 참조 필요

class Program
{
    static void Main(string[] args)
    {
#pragma warning disable 0618
        System.Web.Mail.MailMessage msg = new System.Web.Mail.MailMessage();

        msg.Body = "Test is good";
        msg.Subject = "Test mail";
        msg.To = "from@chol.net";
        msg.From = "to@hanmail.net";

        int cdoBasic = 1;

        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", true);
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 465);
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", cdoBasic);
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "...[다음_사용자_계정]...");
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "...[다음_사용자_암호]...");

        SmtpMail.SmtpServer = "smtp.daum.net";
        SmtpMail.Send(msg);
#pragma warning restore 0618

    }
}




그나저나, SmtpClient/SmtpMail 클래스를 다루면서 알게 된 사실이라면 국내 메일 서비스가 은근히 발전 속도가 느리다는 점입니다. daum의 경우에는 그나마 괜찮지만, 천리안 같은 경우에는 여전히 SMTP/POP3에 SSL 연결을 지원하지 않는 데다,

Outlook에 설정한 SMTP/POP3(예:천리안 메일) 계정 암호를 잊어버린 경우
; https://www.sysnet.pe.kr/2/0/11010

심지어 홈페이지조차도 HTTPS를 지원하지 않습니다. 심각하군요... ^^; 이제 서서히 천리안을 떠날 때가 된 것 같습니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/7/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2021-04-29 07시19분
[신현승] 비슷한 문제를 겪고 있습니다 서버는 하이웍스인데요 증상이 같습니다. 문제는 System.Web.Mail 이 현재 framework 4.6.2에 포함되어 있지 않고 이전버전 2.0 ~ 3.5까지 모두 변경해도 네임스페이스를 찾을수가 없다고 합니다
C# 이구요 VS2017 버전을 사용하고 있습니다 혹시 사용하신 버전이나 System.Web.Mail을 추가할 방법을 알수 있을까요 사실 이 문제를 알게된것도 기적에 가깝긴 합니다만 문제를 해결하고 싶네요 감사합니다
[guest]
2021-04-29 08시04분
System.Web.Mail을 찾을 수 없다고 했는데, 본문에도 제가 기록해 놨지만 그것은 System.Web 어셈블리를 참조하면 포함돼 있는 것입니다.

-----------------------------

Sending Emails with Gmail Using MailKit in .NET Web API: The Complete Guide
; https://dev.to/mamun_akand/sending-emails-with-gmail-using-mailkit-in-net-web-api-4lj5
정성태

... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
1756정성태9/23/201427489기타: 48. NVidia 제품의 과다한 디스크 사용 [2]
1755정성태9/22/201434281오류 유형: 241. Unity Web Player를 설치해도 여전히 설치하라는 화면이 나오는 경우 [4]
1754정성태9/22/201424671VC++: 80. 내 컴퓨터에서 C++ AMP 코드가 실행이 될까요? [1]
1753정성태9/22/201420613오류 유형: 240. Lync로 세미나 참여 시 소리만 들리지 않는 경우 [1]
1752정성태9/21/201441071Windows: 100. 윈도우 8 - RDP 연결을 이용해 VNC처럼 사용자 로그온 화면을 공유하는 방법 [5]
1751정성태9/20/201438958.NET Framework: 464. 프로세스 간 통신 시 소켓 필요 없이 간단하게 Pipe를 열어 통신하는 방법 [1]파일 다운로드1
1750정성태9/20/201423834.NET Framework: 463. PInvoke 호출을 이용한 비동기 파일 작업파일 다운로드1
1749정성태9/20/201423733.NET Framework: 462. 커널 객체를 위한 null DACL 생성 방법파일 다운로드1
1748정성태9/19/201425386개발 환경 구성: 238. [Synergy] 여러 컴퓨터에서 키보드, 마우스 공유
1747정성태9/19/201428505오류 유형: 239. psexec 실행 오류 - The system cannot find the file specified.
1746정성태9/18/201426106.NET Framework: 461. .NET EXE 파일을 닷넷 프레임워크 버전에 상관없이 실행할 수 있을까요? - 두 번째 이야기 [6]파일 다운로드1
1745정성태9/17/201423039개발 환경 구성: 237. 리눅스 Integration Services 버전 업그레이드 하는 방법 [1]
1744정성태9/17/201431065.NET Framework: 460. GetTickCount / GetTickCount64와 0x7FFE0000 주솟값 [4]파일 다운로드1
1743정성태9/16/201420985오류 유형: 238. 설치 오류 - Failed to get size of pseudo bundle
1742정성태8/27/201426977개발 환경 구성: 236. Hyper-V에 설치한 리눅스 VM의 VHD 크기 늘리는 방법 [2]
1741정성태8/26/201421335.NET Framework: 459. GetModuleHandleEx로 알아보는 .NET 메서드의 DLL 모듈 관계파일 다운로드1
1740정성태8/25/201432525.NET Framework: 458. 닷넷 GC가 순환 참조를 해제할 수 있을까요? [2]파일 다운로드1
1739정성태8/24/201426567.NET Framework: 457. 교착상태(Dead-lock) 해결 방법 - Lock Leveling [2]파일 다운로드1
1738정성태8/23/201422054.NET Framework: 456. C# - CAS를 이용한 Lock 래퍼 클래스파일 다운로드1
1737정성태8/20/201419766VS.NET IDE: 93. Visual Studio 2013 동기화 문제
1736정성태8/19/201425582VC++: 79. [부연] CAS Lock 알고리즘은 과연 빠른가? [2]파일 다운로드1
1735정성태8/19/201418245.NET Framework: 455. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 두 번째 이야기
1734정성태8/13/201419906오류 유형: 237. Windows Media Player cannot access the file. The file might be in use, you might not have access to the computer where the file is stored, or your proxy settings might not be correct.
1733정성태8/13/201426363.NET Framework: 454. EmptyWorkingSet Win32 API를 사용하는 C# 예제파일 다운로드1
1732정성태8/13/201434482Windows: 99. INetCache 폴더가 다르게 보이는 이유
1731정성태8/11/201427087개발 환경 구성: 235. 점(.)으로 시작하는 파일명을 탐색기에서 만드는 방법
... 121  122  123  124  125  126  127  128  129  130  131  [132]  133  134  135  ...