SmtpClient
다음을 사용하여 이메일을 보내기 위해 라이브러리를 사용하고 있습니다.
SmtpClient client = new SmtpClient();
client.Host = "hostname";
client.Port = 465;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.EnableSsl = true;
client.Credentials = new NetworkCredential("User", "Pass);
client.Send("from@hostname", "to@hostname", "Subject", "Body");
테스트 환경에서는 코드가 제대로 작동하지만 프로덕션 SMTP 서버를 사용하면 SmtpException
“메일 전송 실패” 와 함께 코드가 실패합니다 . 내부 IOException
“전송 연결에서 데이터를 읽을 수 없습니다 : net_io_connectionclosed”.
방화벽이 문제가 아님을 확인했습니다. 포트는 클라이언트와 서버 사이에서 잘 열립니다. 이 오류가 발생할 수있는 다른 방법을 모르겠습니다.
답변
편집 : Super Redux 버전
465 대신 포트 587을 사용해보십시오. 포트 465는 기술적으로 더 이상 사용되지 않습니다.
많은 패킷 스니핑 후 나는 그것을 알아 냈습니다. 먼저, 짧은 대답은 다음과 같습니다.
.NET 은 STARTTLS를 통한 암호화 SmtpClient
만 지원합니다. 는 IF EnableSsl
플래그를 설정하는 STARTTLS로 EHLO에 서버 필수의 응답은, 그렇지 않으면 예외가 발생합니다. 자세한 내용은 MSDN 설명서를 참조하십시오.
둘째, 향후이 문제에 직면 한 사람들을위한 간단한 SMTP 기록 강의 :
예전에는 서비스가 암호화를 제공하기를 원했을 때 다른 포트 번호가 할당되었으며 해당 포트 번호에서 즉시 SSL 연결을 시작했습니다. 시간이 지남에 따라 그들은 하나의 서비스에 대해 두 개의 포트 번호를 낭비하는 것이 어리 석다는 것을 깨달았고 STARTTLS를 사용하여 동일한 포트에서 일반 텍스트와 암호화를 허용하는 서비스 방법을 고안했습니다. 통신은 일반 텍스트를 사용하여 시작한 다음 STARTTLS 명령을 사용하여 암호화 된 연결로 업그레이드합니다. STARTTLS는 SMTP 암호화의 표준이되었습니다. 안타깝게도 새로운 표준이 구현 될 때 항상 발생하는 것처럼 모든 클라이언트 및 서버와의 호환성이 뒤죽박죽입니다.
제 경우에는 사용자가 즉시 SSL 연결을 강제하는 서버에 소프트웨어를 연결하려고했습니다. 이는 Microsoft에서 .NET에서 지원하지 않는 레거시 방법입니다.
답변
포트를 465에서 587로 변경하면 작동합니다.
답변
솔루션을 찾고 있으며 Azure를 통해 SMTP sendgrid를 설정 한이 게시물을 우연히 발견 한 사람을 위해.
사용자 이름은 Azure에서 sendgrid 개체를 만들 때 설정 한 사용자 이름이 아닙니다. 사용자 이름을 찾으려면
- Azure에서 sendgrid 개체를 클릭하고 관리를 클릭합니다. SendGrid 사이트로 리디렉션됩니다.
- 이메일을 확인한 다음 거기에 표시된 사용자 이름을 복사합니다. 자동 생성 된 사용자 이름입니다.
- SendGrid의 사용자 이름을 web.config 파일의 SMTP 설정에 추가합니다.
도움이 되었기를 바랍니다!
답변
Gmail 계정에서 “보안 수준이 낮은 앱”설정을 변경해야 할 수도 있습니다. EnableSsl, 포트 587을 사용하고 “보안 수준이 낮은 앱”을 활성화합니다. 보안 수준이 낮은 앱 부분을 Google에 검색하는 경우 계정 페이지로 바로 연결되는 Google 도움말 페이지가 있습니다. 그게 내 문제 였지만 위의 모든 답변 덕분에 모든 것이 작동하고 있습니다.
답변
위의 모든 답변을 시도했지만 Office 365 계정에서 여전히이 오류가 발생합니다. 보안 수준이 낮은 앱을 허용하면 코드가 Google 계정 및 smtp.gmail.com에서 제대로 작동하는 것 같습니다.
시도해 볼 수있는 다른 제안이 있습니까?
내가 사용하는 코드는 다음과 같습니다.
int port = 587;
string host = "smtp.office365.com";
string username = "smtp.out@mail.com";
string password = "password";
string mailFrom = "noreply@mail.com";
string mailTo = "to@mail.com";
string mailTitle = "Testtitle";
string mailMessage = "Testmessage";
using (SmtpClient client = new SmtpClient())
{
MailAddress from = new MailAddress(mailFrom);
MailMessage message = new MailMessage
{
From = from
};
message.To.Add(mailTo);
message.Subject = mailTitle;
message.Body = mailMessage;
message.IsBodyHtml = true;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Host = host;
client.Port = port;
client.EnableSsl = true;
client.Credentials = new NetworkCredential
{
UserName = username,
Password = password
};
client.Send(message);
}
업데이트 및 해결 방법 :
Smtp Client를 Mailkit으로 변경하여 문제를 해결했습니다. System.Net.Mail Smtp 클라이언트는 이제 보안 문제로 인해 Microsoft에서 사용하지 않는 것이 좋으며 대신 MailKit을 사용해야합니다. Mailkit을 사용하면 문제의 근본 원인 (라이선스 문제)을 찾을 수있는 명확한 오류 메시지가 표시되었습니다. 메일 킷을 Nuget 패키지 로 다운로드하여 얻을 수 있습니다 .
자세한 내용은 Smtp 클라이언트에 대한 설명서를 참조하십시오.
https://docs.microsoft.com/es-es/dotnet/api/system.net.mail.smtpclient?redirectedfrom=MSDN&view=netframework-4.7.2
MailKit으로 SmtpClient를 구현 한 방법은 다음과 같습니다.
int port = 587;
string host = "smtp.office365.com";
string username = "smtp.out@mail.com";
string password = "password";
string mailFrom = "noreply@mail.com";
string mailTo = "mailto@mail.com";
string mailTitle = "Testtitle";
string mailMessage = "Testmessage";
var message = new MimeMessage();
message.From.Add(new MailboxAddress(mailFrom));
message.To.Add(new MailboxAddress(mailTo));
message.Subject = mailTitle;
message.Body = new TextPart("plain") { Text = mailMessage };
using (var client = new SmtpClient())
{
client.Connect(host , port, SecureSocketOptions.StartTls);
client.Authenticate(username, password);
client.Send(message);
client.Disconnect(true);
}
답변
SMTP 라이브러리가 암호화 된 연결을 지원합니까? 메일 서버는 보안 TLS 연결을 예상 할 수 있으므로 TLS 핸드 셰이크없이 연결을 닫을 수 있습니다.
답변
같은 상자에서 SMTP 서버를 사용하고 있고 SMTP가 “Any Assigned”대신 IP 주소에 바인딩 된 경우 SMTP가 현재 작동하지 않는 IP 주소 (예 : 127.0.0.1)를 사용하려고하므로 실패 할 수 있습니다. 의 위에.