SmtpException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed
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);
}
업데이트 및 해결 방법 :
Solved problem by changing Smtp Client to Mailkit. The System.Net.Mail Smtp Client is now not recommended to use by Microsoft because of security issues and you should instead be using MailKit. Using Mailkit gave me clearer error messages that I could understand finding the root cause of the problem (license issue). You can get Mailkit by downloading it as a Nuget Package.
Read documentation about Smtp Client for more information: https://docs.microsoft.com/es-es/dotnet/api/system.net.mail.smtpclient?redirectedfrom=MSDN&view=netframework-4.7.2
Here is how I implemented SmtpClient with MailKit
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);
}
Does your SMTP library supports encrypted connection ? The mail server might be expecting secure TLS connection and hence closing the connection in absence of a TLS handshake
If you are using an SMTP server on the same box and your SMTP is bound to an IP address instead of "Any Assigned" it may fail because it is trying to use an IP address (like 127.0.0.1) that SMTP is not currently working on.
In case if all above solutions don't work for you then try to update following file to your server (by publish i mean, and a build before that would be helpful).
bin-> projectname.dll
After updating you will see this error. as i have solved with this solution.
To elevate what jocull mentioned in a comment, I was doing everything mention in this thread and striking out... because mine was in a loop to be run over and over; after the first time through the loop, it would sometimes fail. Always worked the first time through the loop.
To be clear: the loop includes the creation of SmtpClient, and then doing .Send with the right data. The SmtpClient was created inside a try/catch block, to catch errors and to be sure the object got destroyed before the bottom of the loop.
In my case, the solution was to make sure that SmtpClient was disposed after each time in the loop (either via using() statement or by doing a manual dispose). Even if the SmtpClient object is being implicitly destroyed in the loop, .NET appears to be leaving stuff lying around to conflict with the next attempt.
Try this : Here is the code which i'm using to send emails to multiple user.
public string gmail_send()
{
using (MailMessage mailMessage =
new MailMessage(new MailAddress(toemail),
new MailAddress(toemail)))
{
mailMessage.Body = body;
mailMessage.Subject = subject;
try
{
SmtpClient SmtpServer = new SmtpClient();
SmtpServer.Credentials =
new System.Net.NetworkCredential(email, password);
SmtpServer.Port = 587;
SmtpServer.Host = "smtp.gmail.com";
SmtpServer.EnableSsl = true;
mail = new MailMessage();
String[] addr = toemail.Split(','); // toemail is a string which contains many email address separated by comma
mail.From = new MailAddress(email);
Byte i;
for (i = 0; i < addr.Length; i++)
mail.To.Add(addr[i]);
mail.Subject = subject;
mail.Body = body;
mail.IsBodyHtml = true;
mail.DeliveryNotificationOptions =
DeliveryNotificationOptions.OnFailure;
// mail.ReplyTo = new MailAddress(toemail);
mail.ReplyToList.Add(toemail);
SmtpServer.Send(mail);
return "Mail Sent";
}
catch (Exception ex)
{
string exp = ex.ToString();
return "Mail Not Sent ... and ther error is " + exp;
}
}
}
//Try this out... Port 465 is not there anymore for use
string emailFrom = "sender email here";
string recieverEmail ="reciever email here";
string subject = "subject here";
string body = "message here";
MailMessage maile = new MailMessage(emailFrom, recieverEmail, subject,body);
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.Credentials = new System.Net.NetworkCredential("senders gmail account username here", "senders gmail account password here");
client.EnableSsl = true;
For outlook use following setting that is not giving error to me
SMTP server name smtp-mail.outlook.com
SMTP port 587
This error is very generic .It can be due to many reason such as The mail server is incorrect. Some hosting company uses mail.domainname format. If you just use domain name it will not work. check credentials host name username password if needed Check with hosting company.
<smtp from="info@india.uu.com">
<!-- Uncomment to specify SMTP settings -->
<network host="domain.com" port="25" password="Jin@" userName="info@india.xx.com"/>
</smtp>
</mailSettings>
In my case, the customer forgot to add new IP address in their SMTP settings. Open IIS 6.0 in the server which sets up the smtp, right click Smtp virtual server, choose Properties, Access tab, click Connections, add IP address of the new server. Then click Relay, also add IP address of the new server. This solved my issue.
Change your port number to 587 from 465
Prepare: 1. HostA is SMTP virtual server with default port 25 2. HostB is a workstation on which I send mail with SmtpClient and simulate unstable network I use clumsy
Case 1 Given If HostB is 2008R2 When I send email. Then This issue occurs.
Case 2 Given If HostB is 2012 or higher version When I send email. Then The mail was sent out.
Conclusion: This root cause is related with Windows Server 2008R2.
'developer tip' 카테고리의 다른 글
nltk 또는 python을 사용하여 불용어를 제거하는 방법 (0) | 2020.08.26 |
---|---|
"java.security.cert.CertificateException : 제목 대체 이름 없음"오류를 수정하는 방법은 무엇입니까? (0) | 2020.08.26 |
Java에서 URL 확인 (0) | 2020.08.26 |
파일을 WPF로 끌어서 놓기 (0) | 2020.08.26 |
@Transactional (propagation = Propagation.REQUIRED) (0) | 2020.08.26 |