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

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 어셈블리를 참조하면 포함돼 있는 것입니다.
정성태

1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13507정성태1/2/20242816닷넷: 2191. C# - IPGlobalProperties를 이용해 netstat처럼 사용 중인 Socket 목록 구하는 방법파일 다운로드1
13506정성태12/29/20232371닷넷: 2190. C# - 닷넷 코어/5+에서 달라지는 System.Text.Encoding 지원
13505정성태12/27/20232909닷넷: 2189. C# - WebSocket 클라이언트를 닷넷으로 구현하는 예제 (System.Net.WebSockets)파일 다운로드1
13504정성태12/27/20232495닷넷: 2188. C# - ASP.NET Core SignalR로 구현하는 채팅 서비스 예제파일 다운로드1
13503정성태12/27/20232363Linux: 67. WSL 환경 + mlocate(locate) 도구의 /mnt 디렉터리 검색 문제
13502정성태12/26/20232459닷넷: 2187. C# - 다른 프로세스의 환경변수 읽는 예제파일 다운로드1
13501정성태12/25/20232275개발 환경 구성: 700. WSL + uwsgi - IPv6로 바인딩하는 방법
13500정성태12/24/20232328디버깅 기술: 194. Windbg - x64 가상 주소를 물리 주소로 변환
13498정성태12/23/20233012닷넷: 2186. 한국투자증권 KIS Developers OpenAPI의 C# 래퍼 버전 - eFriendOpenAPI NuGet 패키지
13497정성태12/22/20232430오류 유형: 885. Visual Studiio - error : Could not connect to the remote system. Please verify your connection settings, and that your machine is on the network and reachable.
13496정성태12/21/20232415Linux: 66. 리눅스 - 실행 중인 프로세스 내부의 환경변수 설정을 구하는 방법 (gdb)
13495정성태12/20/20232380Linux: 65. clang++로 공유 라이브러리의 -static 옵션 빌드가 가능할까요?
13494정성태12/20/20232525Linux: 64. Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency) - 두 번째 이야기
13493정성태12/19/20232617닷넷: 2185. C# - object를 QueryString으로 직렬화하는 방법
13492정성태12/19/20232305개발 환경 구성: 699. WSL에 nopCommerce 예제 구성
13491정성태12/19/20232241Linux: 63. 리눅스 - 다중 그룹 또는 사용자를 리소스에 권한 부여
13490정성태12/19/20232363개발 환경 구성: 698. Golang - GLIBC 의존을 없애는 정적 빌드 방법
13489정성태12/19/20232147개발 환경 구성: 697. GoLand에서 ldflags 지정 방법
13488정성태12/18/20232079오류 유형: 884. HTTP 500.0 - 명령행에서 실행한 ASP.NET Core 응용 프로그램을 실행하는 방법
13487정성태12/16/20232395개발 환경 구성: 696. C# - 리눅스용 AOT 빌드를 docker에서 수행 [1]
13486정성태12/15/20232210개발 환경 구성: 695. Nuget config 파일에 값 설정/삭제 방법
13485정성태12/15/20232094오류 유형: 883. dotnet build/restore - error : Root element is missing
13484정성태12/14/20232170개발 환경 구성: 694. Windows 디렉터리 경로를 WSL의 /mnt 포맷으로 구하는 방법
13483정성태12/14/20232310닷넷: 2184. C# - 하나의 resource 파일을 여러 프로그램에서 (AOT 시에도) 사용하는 방법파일 다운로드1
13482정성태12/13/20232894닷넷: 2183. C# - eFriend Expert OCX 예제를 .NET Core/5+ Console App에서 사용하는 방법 [2]파일 다운로드1
13481정성태12/13/20232280개발 환경 구성: 693. msbuild - .NET Core/5+ 프로젝트에서 resgen을 이용한 리소스 파일 생성 방법파일 다운로드1
1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...