SmtpException: Daten von der Transportverbindung können nicht gelesen werden: net_io_connectionclosed

102

Ich verwende die SmtpClientBibliothek, um E-Mails wie folgt zu senden:

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");

Der Code funktioniert in meiner Testumgebung einwandfrei, aber wenn ich Produktions-SMTP-Server verwende, schlägt der Code mit einem SmtpException"Fehler beim Senden von E-Mails" fehl . mit einem inneren IOException"Daten können nicht von der Transportverbindung gelesen werden: net_io_connectionclosed".

Ich habe bestätigt, dass Firewalls kein Problem darstellen. Der Port öffnet sich einwandfrei zwischen dem Client und dem Server. Ich bin nicht sicher, was diesen Fehler sonst noch auslösen könnte.

Jake C.
quelle

Antworten:

189

EDIT: Super Redux Version

Versuchen Sie es mit Port 587 anstelle von 465. Port 465 ist technisch veraltet.


Nach ein paar Päckchen schnüffelte ich es heraus. Hier ist zunächst die kurze Antwort:

Das .NET unterstützt SmtpClient nur die Verschlüsselung über STARTTLS. Wenn das EnableSslFlag gesetzt ist, muss der Server mit einem STARTTLS auf EHLO antworten, andernfalls wird eine Ausnahme ausgelöst. Weitere Informationen finden Sie in der MSDN- Dokumentation.

Zweitens eine kurze Lektion zur SMTP-Geschichte für diejenigen, die in Zukunft auf dieses Problem stoßen:

Früher, als Dienste auch Verschlüsselung anbieten wollten, wurde ihnen eine andere Portnummer zugewiesen, und an dieser Portnummer wurde sofort eine SSL-Verbindung hergestellt. Im Laufe der Zeit wurde ihnen klar, dass es dumm war, zwei Portnummern für einen Dienst zu verschwenden, und sie entwickelten eine Möglichkeit für Dienste, mit STARTTLS Klartext und Verschlüsselung auf demselben Port zu ermöglichen. Die Kommunikation beginnt mit der Verwendung von Klartext und verwendet dann den Befehl STARTTLS, um ein Upgrade auf eine verschlüsselte Verbindung durchzuführen. STARTTLS wurde zum Standard für die SMTP-Verschlüsselung. Leider gibt es, wie immer bei der Implementierung eines neuen Standards, eine Vielzahl von Kompatibilitäten mit allen Clients und Servern.

In meinem Fall hat mein Benutzer versucht, die Software mit einem Server zu verbinden, der eine sofortige SSL-Verbindung erzwingt. Dies ist die Legacy-Methode, die von Microsoft in .NET nicht unterstützt wird.

Jake C.
quelle
Wie kann ich feststellen, ob der Server, mit dem ich eine Verbindung herstelle, dieselben Probleme aufweist? Ich versuche, SmtpClient mit Yahoo und / oder Google Mail zu verwenden und erhalte den beschriebenen Fehler. Wenn ich es mit einem 2013 Exchange Server versuche, funktioniert mein Code einwandfrei.
Raider33
11
Der einfachste Weg zum Testen besteht darin, Port 587 und nicht 465 zu verwenden. Während einige SMTP-Server TLS auf 465 (und manchmal sogar 25) unterstützen, ist nur Port 587 erforderlich, um TLS zu unterstützen. Darüber hinaus ist die Verwendung von Port 465 seit 1998 veraltet ( en.wikipedia.org/wiki/SMTPS ), obwohl dies in der Praxis auf vielen Servern für ältere Clients aktiviert ist.
Jake C
1
Ja, der Wechsel zu 587 hat es geschafft. Danke, dass du mich in die richtige Richtung gelenkt hast.
Raider33
2
587 funktioniert, obwohl smtp.att.yahaoo.com sagt, verwenden Sie 465. Danke Mann.
Sam
1
Eine aktuelle Lösung finden Sie unter stackoverflow.com/a/1014876/247702 zur Verwendung der (veralteten) System.Web.Mail, die implizites SSL unterstützt.
user247702
20

Ändern Sie den Port von 465 auf 587 und es wird funktionieren.

EINGESTEHEN
quelle
3
Ich bin nicht sicher, was passiert ist, aber das funktioniert mit Google Mail SMTP. Kannst du erklären, warum das funktioniert?
Crismogram
20

Für alle, die über diesen Beitrag stolpern und nach einer Lösung suchen und SMTP sendgrid über Azure eingerichtet haben.

Der Benutzername ist nicht der Benutzername, den Sie beim Erstellen des sendgrid-Objekts in Azure eingerichtet haben. Um Ihren Benutzernamen zu finden;

  • Klicken Sie in Azure auf Ihr Sendgrid-Objekt und dann auf Verwalten. Sie werden zur SendGrid-Site weitergeleitet.
  • Bestätigen Sie Ihre E-Mail-Adresse und kopieren Sie den dort angezeigten Benutzernamen. Es handelt sich um einen automatisch generierten Benutzernamen.
  • Fügen Sie den Benutzernamen von SendGrid zu Ihren SMTP-Einstellungen in der Datei web.config hinzu.

Hoffe das hilft!

kein Logo
quelle
2
Dies mag albern erscheinen, aber Sie sollten auch überprüfen, ob das Kennwort für das SMTP-SendGrid-Setup korrekt ist. Unser Setup funktionierte ursprünglich und eines Tages erhielten wir die Ausnahmemeldung des OP. Die Suche im WWW deutete hauptsächlich darauf hin, dass andere SMTP-Serverkonfigurationen untersucht wurden, als sich herausstellte, dass das Kennwort falsch war. Jemand im Team hatte das Kennwort in der Konfigurationsdatei in eine Variante geändert, bei der der erste Buchstabe nicht groß geschrieben wurde.
Methon.dagger
1
In meinem Fall war der Benutzername falsch und hatte einen Tippfehler. Ein falsches Passwort kann jedoch auch dazu führen, dass "Daten von der Transportverbindung nicht gelesen werden können: net_io_connectionclosed". Error. Überprüfen Sie also sowohl den Benutzernamen als auch das Passwort. Und für Azure-Benutzer hat der Benutzername die Form "[email protected]" (z. B. [email protected])
Raj Rao
10

Möglicherweise müssen Sie auch die Einstellung "Weniger sichere Apps" in Ihrem Google Mail-Konto ändern. EnableSsl, verwenden Sie Port 587 und aktivieren Sie "weniger sichere Apps". Wenn Sie den Teil mit den weniger sicheren Apps googeln, gibt es Google-Hilfeseiten, die Sie direkt mit der Seite für Ihr Konto verknüpfen. Das war mein Problem, aber dank aller obigen Antworten funktioniert jetzt alles.

Bill Mahoney
quelle
Danke Bill. Dies funktioniert immer noch mit meinem Standard-Google Mail-Konto. Wenn Sie die Einstellung "Weniger sichere Apps" nicht verwenden, müssen Sie die zweiteilige OAuth2-Authentifizierung verwenden. Dies ist nicht praktisch, wenn Sie nur eine Bestätigungs-E-Mail von einer Website senden möchten.
Dan Randolph
1
Wo sind die "weniger sicheren Apps" angesiedelt? Ich bin in meinem Google Mail-Konto und suche danach.
Sam
1
Ich habe die Einstellung "Weniger sichere Apps" gefunden - sie befindet sich nicht in den Google Mail-Einstellungen, sondern in den Google-Kontoeinstellungen: Mein Konto> Anmeldung
HFloyd
9

Ich habe alle oben genannten Antworten ausprobiert, erhalte jedoch immer noch diesen Fehler mit dem Office 365-Konto. Der Code scheint mit dem Google-Konto und smtp.gmail.com gut zu funktionieren, wenn weniger sichere Apps zugelassen werden.

Irgendwelche anderen Vorschläge, die ich versuchen könnte?

Hier ist der Code, den ich verwende

int port = 587;
string host = "smtp.office365.com";
string username = "[email protected]";
string password = "password";
string mailFrom = "[email protected]";
string mailTo = "[email protected]";
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);
}

UPDATE UND WIE ICH ES GELÖST HABE:

Problem durch Ändern des SMTP-Clients in Mailkit behoben. Der System.Net.Mail Smtp-Client wird aus Sicherheitsgründen jetzt nicht mehr von Microsoft empfohlen. Sie sollten stattdessen MailKit verwenden. Die Verwendung von Mailkit gab mir klarere Fehlermeldungen, dass ich verstehen konnte, die Hauptursache des Problems zu finden (Lizenzproblem). Sie können Mailkit erhalten, indem Sie es als Nuget- Paket herunterladen .

Weitere Informationen finden Sie in der Dokumentation zum Smtp-Client: https://docs.microsoft.com/es-es/dotnet/api/system.net.mail.smtpclient?redirectedfrom=MSDN&view=netframework-4.7.2

So habe ich SmtpClient mit MailKit implementiert

        int port = 587;
        string host = "smtp.office365.com";
        string username = "[email protected]";
        string password = "password";
        string mailFrom = "[email protected]";
        string mailTo = "[email protected]";
        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);
        }
Martin Jaensson
quelle
3

Unterstützt Ihre SMTP-Bibliothek eine verschlüsselte Verbindung? Der Mailserver erwartet möglicherweise eine sichere TLS-Verbindung und schließt die Verbindung, wenn kein TLS-Handshake vorliegt

1234varun
quelle
Es ist nur die Standard-.NET- SmtpClientBibliothek, sie unterstützt die Verschlüsselung, der Server erfordert eine Verschlüsselung, und ich habe festgelegt client.EnableSssl = true;. Obwohl ich denke, dass ich das mit Wireshark noch ein bisschen weiter verfolgen werde.
Jake C
3

Wenn Sie einen SMTP-Server auf derselben Box verwenden und Ihr SMTP an eine IP-Adresse anstelle von "Beliebig zugewiesen" gebunden ist, kann dies fehlschlagen, da versucht wird, eine IP-Adresse (wie 127.0.0.1) zu verwenden, die SMTP derzeit nicht funktioniert auf.

Josiah
quelle
2

Um das zu erhöhen, was Jocull in einem Kommentar erwähnt hat, habe ich alles getan, was in diesem Thread erwähnt wurde, und gestrichen ... weil meine in einer Schleife war, die immer wieder ausgeführt werden sollte; Nach dem ersten Durchlaufen der Schleife schlug dies manchmal fehl. Hat immer beim ersten Mal durch die Schleife gearbeitet.

Um es klar auszudrücken: Die Schleife umfasst die Erstellung von SmtpClient und anschließend das Senden mit den richtigen Daten. Der SmtpClient wurde in einem try / catch-Block erstellt, um Fehler abzufangen und sicherzustellen, dass das Objekt vor dem Ende der Schleife zerstört wurde.

In meinem Fall bestand die Lösung darin, sicherzustellen, dass SmtpClient nach jedem Mal in der Schleife entsorgt wurde (entweder über die Anweisung using () oder durch manuelle Entsorgung). Selbst wenn das SmtpClient-Objekt implizit in der Schleife zerstört wird, scheint .NET Dinge herumliegen zu lassen, um mit dem nächsten Versuch in Konflikt zu geraten.

Andy
quelle
2

Ändern Sie Ihre Portnummer von 465 auf 587

Abdus Salam Azad
quelle
2

entfernen

client.UseDefaultCredentials = false; 

schien es für mich zu lösen.

Goner Doug
quelle
1

Falls alle oben genannten Lösungen für Sie nicht funktionieren, versuchen Sie, die folgende Datei auf Ihrem Server zu aktualisieren (mit "veröffentlichen" meine ich, und ein Build davor wäre hilfreich).

bin-> projectname.dll 

Nach dem Update wird dieser Fehler angezeigt. wie ich mit dieser Lösung gelöst habe.

Ajay Kumar
quelle
1
Erstaunlicherweise hat das bei mir funktioniert! Unsichere Apps zulassen war aktiviert und der Port wurde bereits auf 587 eingestellt.
TechyGypo
Danke, ich habe gerade festgestellt, dass ich nicht der einzige mit diesem Problem war. freue mich zu helfen.
Ajay Kumar
1

In meinem Fall hat der Kunde vergessen, in seinen SMTP-Einstellungen eine neue IP-Adresse hinzuzufügen. Öffnen Sie IIS 6.0 auf dem Server, auf dem das SMTP eingerichtet ist, klicken Sie mit der rechten Maustaste auf den virtuellen SMTP-Server, wählen Sie Eigenschaften, Registerkarte Zugriff, klicken Sie auf Verbindungen, fügen Sie die IP-Adresse des neuen Servers hinzu. Klicken Sie dann auf Relais und fügen Sie die IP-Adresse des neuen Servers hinzu. Dies löste mein Problem.

Nora
quelle
0

Versuchen Sie Folgendes: Hier ist der Code, mit dem ich E-Mails an mehrere Benutzer sende.

 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;
            }
        }
    }
Yasmuru
quelle
1
SmtpClientist auch Einweg, so sollte es in einen usingBlock eingewickelt werden
jocull
0

Verwenden Sie für Outlook die folgende Einstellung, die mir keinen Fehler gibt

SMTP-Servername smtp-mail.outlook.com

SMTP-Port 587

Hisham Shahid
quelle
0

Dieser Fehler ist sehr allgemein. Er kann viele Gründe haben, z. B. Der Mailserver ist falsch. Einige Hosting-Unternehmen verwenden das Format mail.domainname. Wenn Sie nur den Domainnamen verwenden, funktioniert dies nicht. Anmeldeinformationen überprüfen Hostname Benutzername Passwort bei Bedarf Bei der Hosting-Firma nachfragen.

<smtp from="[email protected]">
        <!-- Uncomment to specify SMTP settings -->
        <network host="domain.com" port="25" password="Jin@" userName="[email protected]"/>
      </smtp>
    </mailSettings>
Jin Thakur
quelle
0

In meinem Fall wurde die Webserver-IP auf dem Mailserver blockiert. Sie muss von Ihrem Hosting-Unternehmen entsperrt und auf die Whitelist gesetzt werden. Verwenden Sie auch Port Port 587.

Zsolt
quelle
0

Wenn Ihr Mailserver Google Mail (smtp.google.com) ist, wird dieser Fehler angezeigt, wenn Sie das Nachrichtenlimit erreichen. Mit Google Mail können bis zu 2000 Nachrichten pro 24 Stunden über SMTP gesendet werden.

Evgeny Sobolev
quelle
0

Ich bin darauf gestoßen, als ich smtp.office365.com verwendet habe und Port 587 mit SSL verwendet habe. Ich konnte mich über portal.office.com bei dem Konto anmelden und bestätigen, dass das Konto über eine Lizenz verfügt. Aber als ich den Code zum Senden von E-Mails ausgelöst habe, wurde immer wieder der Fehler net_io_connectionclosed angezeigt.

Ich habe einige Zeit gebraucht, um es herauszufinden, aber der Exchange-Administrator hat den Schuldigen gefunden. Wir verwenden O365, aber der Exchange-Server befand sich in einer Hybridumgebung. Obwohl das Konto, das wir verwenden wollten, mit Azure AD synchronisiert wurde und eine gültige O365-Lizenz hatte, befand sich das Postfach aus irgendeinem Grund immer noch auf dem hybriden Exchange-Server - nicht auf Exchange online. Nachdem der Exchange-Administrator den Befehl "Move-Mailbox" verwendet hat, um das Postfach vom hybriden Exchange-Server auf O365 zu verschieben, können wir den Code zum Senden von E-Mails mit o365 verwenden.

iki58762
quelle
-1

Vorbereiten: 1. HostA ist ein virtueller SMTP-Server mit Standardport 25 2. HostB ist eine Workstation, auf der ich E-Mails mit SmtpClient sende und ein instabiles Netzwerk simuliere, das ich ungeschickt verwende

Fall 1 angegeben, wenn HostB 2008R2 ist, wenn ich eine E-Mail sende. Dann tritt dieses Problem auf.

Fall 2 angegeben, wenn HostB eine Version von 2012 oder höher ist, wenn ich eine E-Mail sende. Dann wurde die Mail verschickt.

Schlussfolgerung: Diese Grundursache hängt mit Windows Server 2008R2 zusammen.

Shawn Wang
quelle