web-dev-qa-db-fra.com

"Impossible de lire les données de la connexion de transport: net_io_connectionclosed." - Windows Vista Professionnel et SMTP

Impossible de tester l'envoi d'e-mails à partir du code .NET dans Windows Vista Professionnel.

J'écris du code que je migrerai vers un package SSIS une fois qu'il aura fait ses preuves. Le code consiste à envoyer un message d'erreur par e-mail à une liste de destinataires.

Le code est ci-dessous, mais je reçois une exception lorsque j'exécute le code.

J'ai créé une classe simple pour faire le mailing ... la conception pourrait être meilleure, je teste des fonctionnalités avant d'implémenter des fonctionnalités, méthodes, etc. plus robustes.

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

Message d'exception

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

Il y a plusieurs choses qui peuvent causer ce problème, et voici certaines des choses que j'ai trouvées. Questions: Vous mentionnez "Exchange" - S'agit-il d'un serveur d'échange? L'hôte nécessite-t-il une authentification (vous devrez peut-être ajouter une authentification au client)? Ce que j'essaierais de faire en premier, c'est d'attribuer l'hôte à l'adresse IP statique au lieu du nom d'hôte pour voir si cela fonctionne en premier. Si c'est le cas, c'est probablement un problème avec le mappage DNS.

Si vous exécutez votre serveur d'échange avec Virtualization, vous devez configurer le SmtpClient sur l'IP hôte du serveur virtuel, et non sur le nom du serveur d'hébergement physique ou IP. Cliquez avec le bouton droit sur le serveur virtuel SMTP par défaut, sélectionnez Propriétés, puis accédez à l'onglet Accès, cliquez sur Relais, puis ajoutez l'adresse IP de l'ordinateur qui envoie la demande SMTP au serveur SMTP. (Site ASP.net)

Si cela ne fonctionne pas, c'est parce que le serveur vous empêche d'envoyer des paquets SMTP. Vous devez vous assurer d'ajouter la boîte à partir de laquelle vous envoyez les messages SMTP au serveur SMTP. Cela se fait via l'onglet d'authentification d'IIS.

Je voudrais également souligner que vous devez disposer du client de messagerie ou utiliser le client dans une instruction "using". Cela garantira que le "QUIT" est envoyé au serveur et fermera gracieusement la connexion.

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

Redémarrez IIS. Je sais que cela semble idiot, pour faire un redémarrage pour tout. (et désolé de remonter un vieux fil). Mais parfois, redémarrer IIS fonctionne comme par magie. J'ai rencontré exactement le même problème et le redémarrage l'a résolu.

Il se peut que cela se soit produit car le nom "localhost" n'a pas pu être résolu temporairement. Je publie simplement ici pour que quelqu'un qui y fait face maintenant puisse probablement essayer cette solution rapide avant d'essayer d'enquêter plus avant. J'espère que cela aide

7
JohnSM

Si vous utilisez localhost (Utiliser Localhost) dans IIS 7, changez-le en adresse IP de la machine au lieu de localhost ou 127.0.0.1

Suivez également le lien ci-dessous pour mettre à jour votre relais de serveur de messagerie en conséquence:

Boîte aux lettres indisponible. La réponse du serveur était: 5.7.1 Impossible de relayer pour [email protected]

6
Sujit Senapati

Si vous avez spécifié une adresse IP dans les paramètres du service SMTP, assurez-vous de spécifier cette adresse IP de la machine dans IIS7 et de ne pas mettre localhost.

IIS7 facilite la sélection de 'localhost' mais cela conduira à cette erreur si l'IP par exemple est 10.0.0.1

6
Simon_Weaver

Vista et Windows 7 n'ont pas de serveur SMTP, cette fonctionnalité a été supprimée depuis Windows XP, vous devez donc configurer votre serveur SMTP de manière explicite, plusieurs outils sont disponibles sur le marché pour cela, vous pouvez le vérifier. De plus, une fois que vous avez configuré le SMTP, n'oubliez pas de vérifier le nom du serveur que vous utiliseriez pour envoyer l'e-mail.

3
Joy

J'ai eu le même problème car j'avais plusieurs IP sur mon serveur (serveurs virtuels) et mon hôte pointait vers localhost alors que mon serveur virtuel SMTP était assigné à une IP particulière:

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

Il existe 2 solutions pour cela:

  1. Modifiez votre code et définissez Host sur l'adresse IP particulière utilisée par le serveur virtuel SMTP au lieu de localhost.
  2. Modifiez l'adresse IP du serveur virtuel SMTP en Tous non attribués

Pour voir/modifier l'IP du serveur virtuel SMTP: Cliquez avec le bouton droit sur le serveur virtuel SMTP par défaut, sélectionnez Propriétés, dans l'onglet Général changer/voir l'adresse IP.

J'espère que cela sauve la journée de quelqu'un avec le même problème.

2
Amir Chatrbahr

J'ai développé une application de service Windows en VB en utilisant .NET Framework v4.5 et j'ai récemment rencontré ce problème.

Tout d'abord, un peu de contexte - j'ai rencontré l'erreur de l'OP après avoir essayé de traiter l'erreur "Service non disponible, fermeture du canal de transmission. La réponse du serveur était: Erreur: trop de messages dans une session" qui a été résolue en appelant la méthode Dispose sur l'objet SmtpClient après chaque e-mail envoyé. Juste pour être ultra sûr, j'ai également appelé Dispose sur l'objet MailMessage.

D'accord, alors maintenant le problème "trop de messages dans une session" est résolu mais maintenant j'ai parfois l'erreur "Impossible de lire les données de la connexion de transport: net_io_connectionclosed". Impressionnant. Il s'avère que je n'avais pas implémenté mon cours de messagerie de manière cohérente - dans un cas, il était éliminé alors que dans l'autre il ne l'était pas.

Voici un exemple de ce qui a résolu les deux problèmes pour moi (c'est dans VB mais vous avez l'idée):

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

Ma classe de messagerie possède, entre autres, 2 propriétés - Message (System.Net.Mail.MailMessage) et Server (System.Net.Mail.SmtpClient), ce qui est supprimé dans cet exemple.

Je n'ai pas eu un seul problème après des centaines d'e-mails une fois que chaque instance qui envoie des e-mails dans mon service a été implémentée de cette manière.

1
Joshua Barker

Votre code est-il incomplet? Le tiret est correct pour l'identifier. A part cela, le composant de vérification smtp est installé ou non texte du lien

1
Kamran Shahid

Je fais face à ce problème au cours des 6 dernières heures et je suis nouveau à ce sujet, donc j'essaie de résoudre ce problème de la manière suivante

1) J'ai ouvert l'invite de commande (par exemple, Ctrl + R tapez cmd et entrez).
2) Et vérifiez le ping du serveur SMTP et vérifiez la réponse.
3) S'il obtient une réponse, alors ça va et pour passer à l'étape 4, un autre nom smtp sage est incorrect.
4) Ensuite, je vérifie que le port smtp telnet (par exemple 25) est ouvert ou non.
5) À l'aide de cette cmd, nous vérifions la réponse SMTP.
6) telnet "votresmtpname" "portno" (par exemple telnet smtp.gmail.com 25)
7) Si telnet ne fonctionne pas, veuillez installer ou ajouter à partir du panneau de configuration pour ajouter de nouvelles fonctionnalités.
8) Si cela fonctionne, le résultat de passage est comme.
9) 220 mx.google.com ESMTP.

En utilisant les étapes ci-dessus, nous pouvons découvrir que la connexion smtp est prête ou non pour l'envoi de courrier.

1
Amol Shiledar

J'ai constaté que le système d'exploitation Vista Business n'est pas livré avec IIS SMTP. Je soupçonne que c'est la pièce manquante du puzzle. Quelqu'un a-t-il eu de la chance avec ce problème?

1
John DaCosta

mettre à niveau vers .NET 4.0 et appliquer toutes les mises à jour de sécurité

0
rus