it-swarm.com.de

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

Ich verwende die SmtpClient-Bibliothek zum Senden von E-Mails mit folgendem Befehl:

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("[email protected]", "[email protected]", "Subject", "Body");

Der Code funktioniert gut in meiner Testumgebung, aber wenn ich Produktions-SMTP-Server verwende, schlägt der Code mit einer SmtpException-Fehlermeldung fehl. mit innerer IOException "Daten der Transportverbindung können nicht gelesen werden: net_io_connectionclosed".

Ich habe bestätigt, dass Firewalls kein Problem sind. Der Port wird zwischen Client und Server problemlos geöffnet. Ich bin nicht sicher, was sonst diesen Fehler werfen könnte.

83
Jake C

EDIT: Super Redux Version

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


Nach ein paar Paketen schnüffelte ich es heraus. Zunächst einmal die kurze Antwort:

Die .NET-Variable SmtpClientonly unterstützt die Verschlüsselung über STARTTLS. Wenn das Flag EnableSsl gesetzt ist, muss der Server EHLO mit einem STARTTLS antworten, andernfalls wird eine Ausnahme ausgelöst. Weitere Informationen finden Sie in der Dokumentation zu MSDN .

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

Damals, als die Dienste auch Verschlüsselung anbieten wollten, wurde ihnen eine andere Portnummer zugewiesen, und auf 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 einen Weg für Dienste, mit denen Klartext und Verschlüsselung an demselben Port mit STARTTLS zugelassen werden. Die Kommunikation begann mit der Verwendung von Klartext und anschließend mit dem Befehl STARTTLS auf eine verschlüsselte Verbindung. STARTTLS wurde zum Standard für die SMTP-Verschlüsselung. Da dies immer dann der Fall ist, wenn ein neuer Standard implementiert wird, ist die Kompatibilität mit allen Clients und Servern auf dem Markt sehr unterschiedlich.

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

150
Jake C

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

15
ADM-IT

Für alle, die in diesem Beitrag auf der Suche nach einer Lösung stolpern und SMTP-Sendegrid über Azure eingerichtet haben.  

Der Benutzername ist nicht der Benutzername, den Sie beim Erstellen des Sendgrid-Objekts in Azure festgelegt 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 und kopieren Sie den dort angezeigten Benutzernamen. Dies ist ein automatisch generierter Benutzername. 
  • Fügen Sie den Benutzernamen von SendGrid zu Ihren SMTP-Einstellungen in der Datei web.config hinzu.

Hoffe das hilft!

13
nologo

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 weniger sicheren Apps-Teil bei Google suchen, gibt es Google-Hilfeseiten, die Sie direkt mit der Seite Ihres Kontos verknüpfen. Das war mein Problem, aber dank der obigen Antworten funktioniert jetzt alles.

7
Bill Mahoney

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

3
1234varun

Iv'e hat alle obigen Antworten ausprobiert, aber dieser Fehler wird beim Office 365-Konto trotzdem angezeigt. Der Code scheint mit dem Google-Konto und mit 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 für die Verwendung durch Microsoft empfohlen. Sie sollten stattdessen MailKit verwenden. Die Verwendung von Mailkit gab mir klarere Fehlermeldungen, die ich verstehen konnte, um die Ursache des Problems zu finden (Lizenzproblem). Sie können Mailkit erhalten, indem Sie es als Nuget Package 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);
        }
3
Martin Jaensson

Wenn Sie einen SMTP-Server in derselben Box verwenden und Ihr SMTP an eine IP-Adresse anstelle von "Any Assigned" gebunden ist, schlägt dies möglicherweise fehl, da SMTP versucht, eine IP-Adresse (z. B. 127.0.0.1) zu verwenden auf. 

2
flickerfly

Um das zu zitieren, was jocull in einem Kommentar erwähnt hat, habe ich alles erwähnt, was in diesem Thread erwähnt wurde, und aufgestrichen ... weil meine in einer Schleife war, um immer wieder überlaufen zu werden; Nach dem ersten Durchlauf der Schleife würde es manchmal fehlschlagen. Immer beim ersten Mal durch die Schleife gearbeitet.

Um es klar zu sagen: Die Schleife beinhaltet die Erstellung von SmtpClient und das Ausführen von .Send 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 jedes Mal in der Schleife entsorgt wurde (entweder über using () - Anweisung oder durch manuelle Beseitigung). Selbst wenn das SmtpClient-Objekt implizit in der Schleife zerstört wird, scheint .NET das herumliegende Material zu verlassen, um mit dem nächsten Versuch in Konflikt zu geraten.

1
Andy
//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;
1
SelakaN

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

bin-> projectname.dll 

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

1
Ajay Kumar

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

SMTP-Servername smtp-mail.Outlook.com

SMTP-Port 587

0
Hisham shahid

Ändern Sie Ihre Portnummer von 465 auf 587

0

Dieser Fehler ist sehr allgemein. Er kann viele Ursachen haben, z. B. Der Mailserver ist falsch . Einige Hosting-Unternehmen verwenden das Format mail.domainname . Wenn Sie nur den Domänennamen verwenden, funktioniert er nicht. Überprüfen Sie die Berechtigungsnachweise Hostname Benutzername, falls erforderlich Überprüfen Sie das Hosting-Unternehmen.

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

In meinem Fall hat der Kunde vergessen, in den SMTP-Einstellungen eine neue IP-Adresse hinzuzufügen. Öffnen Sie IIS 6.0 auf dem Server, der die SMTP einrichtet. Klicken Sie mit der rechten Maustaste auf Smtp Virtual 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 Relay, und fügen Sie auch die IP-Adresse des neuen Servers hinzu. Das hat mein Problem gelöst.

0
Nora

Versuchen Sie Folgendes: Hier ist der Code, den ich zum Senden von E-Mails an mehrere Benutzer verwende. 

 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;
            }
        }
    }
0
yasmuru