it-swarm.com.de

"Daten von der Transportverbindung können nicht gelesen werden: net_io_connectionclosed." - Windows Vista Business und SMTP

Das Senden von E-Mails aus .NET-Code in Windows Vista Business konnte nicht getestet werden.

Ich schreibe Code, den ich auf ein SSIS-Paket migrieren werde, sobald es sich bewährt hat. Der Code besteht darin, eine Fehlermeldung per E-Mail an eine Liste von Empfängern zu senden.

Der Code ist unten, aber ich bekomme eine Ausnahme, wenn ich den Code ausführe.

Ich habe eine einfache Klasse für das Mailing erstellt. Das Design könnte besser sein. Ich teste die Funktionalität, bevor ich robustere Funktionen, Methoden usw. implementiere.

namespace LabDemos
{
    class Program
    {
        static void Main(string[] args)
        {
            Mailer m = new Mailer();
            m.test();    
        }
    }
}

namespace LabDemos
{
    class MyMailer
    {    
        List<string> _to = new List<string>();
        List<string> _cc = new List<string>();
        List<string> _bcc = new List<string>();
        String _msgFrom = "";
        String _msgSubject = "";
        String _msgBody = "";            

        public void test(){
        //create the mail message
        MailMessage mail = new MailMessage();

        //set the addresses
        mail.From = new MailAddress("[email protected]");            

        //set the content
        mail.Subject = "This is an email";
        mail.Body = "this is a sample body";
        mail.IsBodyHtml = false;    

        //send the message
        SmtpClient smtp = new SmtpClient();
        smtp.Host = "emailservername";
        smtp.Port = 25;
        smtp.UseDefaultCredentials = true;
        smtp.Send(mail);            
    }
}

Ausnahmemeldung

Inner Exception
{"Unable to read data from the transport connection: net_io_connectionclosed."}

Stack Trace
"   at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)\r\n   at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)\r\n   at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)\r\n   at System.Net.Mail.SmtpConnection.GetConnection(String Host, Int32 port)\r\n   at System.Net.Mail.SmtpTransport.GetConnection(String Host, Int32 port)\r\n   at System.Net.Mail.SmtpClient.GetConnection()\r\n   at System.Net.Mail.SmtpClient.Send(MailMessage message)"


Outer Exception
  System.Net.Mail.SmtpException was unhandled
  Message="Failure sending mail."
  Source="System"
  StackTrace:
       at System.Net.Mail.SmtpClient.Send(MailMessage message)
       at LabDemos.Mailer.test() in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Mailer.cs:line 40
       at LabDemos.Program.Main(String[] args) in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Program.cs:line 48
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
       at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
       at System.Activator.CreateInstance(ActivationContext activationContext)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.IO.IOException
       Message="Unable to read data from the transport connection: net_io_connectionclosed."
       Source="System"
       StackTrace:
            at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)
            at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
            at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
            at System.Net.Mail.SmtpConnection.GetConnection(String Host, Int32 port)
            at System.Net.Mail.SmtpTransport.GetConnection(String Host, Int32 port)
            at System.Net.Mail.SmtpClient.GetConnection()
            at System.Net.Mail.SmtpClient.Send(MailMessage message)
       InnerException: 
37
John DaCosta

Es gibt verschiedene Ursachen für dieses Problem, und hier sind einige der Dinge, die ich gefunden habe. Fragen: Sie erwähnen "Exchange" - Ist dies ein Exchange-Server? Benötigt der Host eine Authentifizierung (möglicherweise müssen Sie dem Client eine Authentifizierung hinzufügen)? Zunächst würde ich versuchen, den Host der statischen IP-Adresse anstelle des Hostnamens zuzuweisen, um zu prüfen, ob dies zuerst funktioniert. Wenn dies der Fall ist, liegt höchstwahrscheinlich ein Problem mit der DNS-Zuordnung vor.

Wenn Sie Ihren Exchange-Server mit Virtualisierung ausführen, müssen Sie den SmtpClient auf die Host-IP des virtuellen Servers konfigurieren, nicht auf den Namen oder die IP des physischen Hostservers. Klicken Sie mit der rechten Maustaste auf Virtueller Standardserver für SMTP, wählen Sie Eigenschaften aus, wechseln Sie zur Registerkarte Zugriff, klicken Sie auf Weiterleiten, und fügen Sie die IP-Adresse des Computers hinzu, der die SMTP-Anforderung an den SMTP-Server sendet. (ASP.net-Site)

Wenn dies nicht funktioniert, blockiert der Server das Senden von SMTP-Paketen. Sie müssen sicherstellen, dass Sie die Box hinzufügen, von der Sie die SMTP-Nachrichten an den SMTP-Server senden. Dies erfolgt über die Registerkarte "Authentifizierung" von IIS.

Ich möchte auch darauf hinweisen, dass Sie den Mail-Client entsorgen oder den Client in einer "using" -Anweisung verwenden sollten. Dadurch wird sichergestellt, dass "QUIT" an den Server gesendet wird, und die Verbindung ordnungsgemäß geschlossen.

using(SmtpClient smtp = new SmtpClient())
{
    smtp.Host = "emailservername";
    smtp.Port = 25;
    smtp.UseDefaultCredentials = true;
    smtp.Send(mail)
}
16
Joe Fairchild

Starten Sie IIS neu. Ich weiß, das hört sich albern an, für alles einen Neustart durchzuführen. (und tut mir leid, einen alten Thread anzustoßen). Aber manchmal funktioniert ein Neustart von IIS) wie von Zauberhand. Ich hatte genau dasselbe Problem und ein Neustart löste es.

Könnte vorübergehend passiert sein, weil der Name 'localhost' nicht geklärt werden konnte. Ich poste hier nur, damit jemand, der sich jetzt damit auseinandersetzt, diese schnelle Lösung probiert, bevor er versucht, weitere Nachforschungen anzustellen. Ich hoffe es hilft

7
JohnSM

Wenn Sie localhost (Use Localhost) in IIS 7 verwenden, ändern Sie es in die IP-Adresse des Computers anstelle von localhost oder 127.0.0.1

Folgen Sie auch dem folgenden Link, um Ihr Mail-Server-Relay entsprechend zu aktualisieren:

Mailbox nicht verfügbar. Die Serverantwort lautete: 5.7.1 Relay für [email protected] nicht möglich

6
Sujit Senapati

Wenn Sie in den SMTP-Diensteinstellungen eine IP-Adresse angegeben haben, stellen Sie sicher, dass Sie diese IP-Adresse des Computers in IIS7 angeben und nicht localhost eingeben.

IIS7 erleichtert die Auswahl von 'localhost'. Dies führt jedoch zu diesem Fehler, wenn die IP beispielsweise 10.0.0.1 lautet

6
Simon_Weaver

In Vista und Windows 7 gibt es keinen SMTP-Server. Diese Funktion wurde seit Windows XP entfernt. Sie müssen also Ihren SMTP-Server explizit einrichten. Dafür stehen verschiedene Tools auf dem Markt zur Verfügung. Sie können dies überprüfen. Denken Sie auch daran, nach dem Konfigurieren von SMTP den Servernamen zu überprüfen, den Sie zum Senden der E-Mail verwenden würden.

3
Joy

Ich hatte das gleiche Problem, da ich mehrere IP-Adressen auf meinem Server (virtuelle Server) hatte und mein Host auf localhost zeigte, während mein virtueller SMTP-Server einer bestimmten IP-Adresse zugewiesen wurde:

 <smtp deliveryMethod="Network">
       <network Host="localhost" port="25" defaultCredentials="false"/>
 </smtp>

Hierfür gibt es 2 Lösungen:

  1. Ändern Sie Ihren Code und stellen Sie Host auf die bestimmte IP ein, die von SMTP Virtual Server anstelle von localhost verwendet wird.
  2. Ändern Sie die IP des virtuellen SMTP-Servers in Alle nicht zugewiesen

So können Sie die IP-Adresse des virtuellen SMTP-Servers anzeigen/ändern: Klicken Sie mit der rechten Maustaste auf Virtueller SMTP-Standardserver, wählen Sie Eigenschaften, und ändern Sie auf der Registerkarte Allgemein die IP-Adresse.

Ich hoffe, das erspart jemandem den Tag mit dem gleichen Problem.

2
Amir Chatrbahr

Ich habe eine Windows-Dienstanwendung in VB mit .NET Framework v4.5 entwickelt und bin kürzlich auf dieses Problem gestoßen.

Zunächst ein wenig Hintergrundwissen - Nachdem ich versucht hatte, den Fehler "Dienst nicht verfügbar, Übertragungskanal wird geschlossen" zu beheben, trat beim OP ein Fehler auf. Die Serverantwort lautete: Fehler: zu viele Nachrichten in einer Sitzung. Dieser Fehler wurde durch Aufrufen der Dispose-Methode behoben auf dem SmtpClient-Objekt nach jeder gesendeten E-Mail. Aus Sicherheitsgründen habe ich auch Dispose on the MailMessage-Objekt aufgerufen.

Okay, jetzt ist das Problem "zu viele Nachrichten in einer Sitzung" behoben, aber jetzt habe ich gelegentlich den Fehler "Daten von der Transportverbindung können nicht gelesen werden: net_io_connectionclosed". Genial. Es stellte sich heraus, dass ich meine E-Mail-Klasse nicht konsequent implementiert hatte - in einem Fall wurde sie entsorgt, in dem anderen nicht.

Hier ist ein Beispiel dafür, was beide Probleme für mich gelöst hat (es ist in VB, aber Sie haben die Idee):

With New clsEmail(True)
    With .Message
        .To.Add("[email protected]")
        .Subject = msgSubject
        .Body = msgContents
    End With

    .Server.Send(.Message)
    .Server.Dispose()
    .Message.Dispose()
End With

Meine E-Mail-Klasse verfügt unter anderem über zwei Eigenschaften: "Nachricht" (System.Net.Mail.MailMessage) und "Server" (System.Net.Mail.SmtpClient).

Ich hatte nach Hunderten von E-Mails kein einziges Problem, nachdem jede einzelne Instanz, die E-Mails in meinem Dienst sendet, auf diese Weise implementiert wurde.

1
Joshua Barker

Ist Ihr Code unvollständig? Der Text ist korrekt, um ihn zu identifizieren. Ist die SMTP-Komponente nicht installiert, überprüfen Sie Linktext

1
Kamran Shahid

Ich stehe vor diesem Problem in den letzten 6 Stunden und bin neu in diesem Bereich. Daher versuche ich, dieses Problem auf folgende Weise zu lösen

1) Ich habe die Eingabeaufforderung geöffnet (z. B. Strg + R, geben Sie cmd ein und drücken Sie die Eingabetaste).
2) Überprüfen Sie, ob der SMTP-Server pingt, und überprüfen Sie die Antwort.
3) Wenn es eine Antwort erhält, ist es in Ordnung, mit Schritt 4 fortzufahren. Ein anderer SMTP-Name ist falsch.
4) Dann überprüfe ich per Telnet, ob der SMTP-Port (z. B. 25) offen ist oder nicht.
5) Mit diesem Befehl überprüfen wir die SMTP-Antwort.
6) telnet "yoursmtpname" "portno" (z. B. telnet smtp.gmail.com 25)
7) Wenn Telnet nicht funktioniert, installieren oder fügen Sie über die Systemsteuerung neue Funktionen hinzu.
8) Wenn es funktioniert, ist das Ergebnis wie.
9) 220 mx.google.com ESMTP.

Mithilfe der obigen Schritte können wir feststellen, ob die SMTP-Verbindung zum Senden von E-Mails bereit ist oder nicht.

1
Amol Shiledar

Ich habe festgestellt, dass das Vista Business-Betriebssystem nicht mit IIS SMTP) geliefert wird. Ich vermute, dies ist das fehlende Puzzleteil. Hat jemand mit diesem Problem Glück gehabt?

1
John DaCosta

aktualisieren Sie auf .NET 4.0, und wenden Sie alle Sicherheitsupdates an

0
rus