39 votes

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

Impossible de tester l'envoi d'un courriel à partir du code .NET dans Windows Vista Business.

J'écris un code que je vais migrer vers un paquet 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 la fonctionnalité avant d'implémenter une fonctionnalité plus robuste, des méthodes, etc.

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("me@domain.com");            

        //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:

0 votes

Je ne fournirai pas de réponse à cette question pour la simple raison que je ne connais pas suffisamment le SMTP pour me sentir bien à ce sujet. Cependant, cela ressemble vraiment à un problème d'environnement (probablement dans les paramètres d'IIS). Utilisez-vous 1) "localhost" pour smtp.Host 2) un serveur distant pour smtp.Host et/ou 3) une IP spécifique plutôt qu'un nom d'hôte ?

0 votes

I mon hébergeur de courrier est désigné par son nom. Exemple "exchange". J'ai testé le DNS en envoyant un ping au serveur. Le test a été concluant. J'ai également testé l'accès au port via telnet sur le port 25. Cela a également fonctionné. J'ai testé le code sur une autre machine et j'ai pu envoyer le message. Il me semble que je dois installer un certain type de service/protocole SMTP sur la machine. La machine sur laquelle le code a échoué est Windows Vista Business. Les tests ont été concluants sur Windows Server 2008 Standard.

0 votes

Veuillez vous référer à : stackoverflow.com/questions/13689265/

16voto

Joe Fairchild Points 81

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

Si vous exécutez votre serveur Exchange avec une virtualisation, vous devez configurer le SmtpClient sur l'IP hôte du serveur virtuel, et non sur le nom ou l'IP du serveur d'hébergement physique. Cliquez avec le bouton droit de la souris sur le serveur virtuel SMTP par défaut, sélectionnez Propriétés, puis allez dans l'onglet Accès, cliquez sur Relais puis ajoutez l'adresse IP de l'ordinateur qui envoie la requête SMTP au serveur SMTP. (site ASP.net)

Si cela ne fonctionne pas, c'est que le serveur vous bloque l'envoi de 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 par le biais de l'onglet d'authentification de IIS.

Je tiens également à signaler que vous devez disposer du client de messagerie, ou utiliser le client dans une déclaration "using". Cela permettra de s'assurer que le "QUIT" est envoyé au serveur et de fermer gracieusement la connexion.

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

1 votes

J'ai du mal à trouver quelque chose qui confirme qu'une instruction using envoie le QUIT lorsqu'elle est terminée. En bref, comment fermer gracieusement la connexion sans instruction using.

0 votes

Si vous regardez la documentation de SmtpClient.Dispose(), vous verrez ceci : "Envoie un message QUIT au serveur SMTP, met fin de manière élégante à l'exécution de la tâche.

7voto

JohnSM Points 61

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

C'est peut-être parce que le nom "localhost" n'a pas pu être résolu. Je poste ici pour que quelqu'un qui est confronté à ce problème puisse essayer cette solution rapide avant de chercher plus loin. J'espère que cela aidera

6voto

Simon_Weaver Points 31141

Si vous avez spécifié une adresse IP dans les paramètres du service SMTP, assurez-vous que vous spécifiez l'adresse IP de la machine dans IIS7 et que vous ne mettez pas l'adresse IP de l'ordinateur dans la liste des adresses IP. localhost .

IIS7 permet de sélectionner facilement "localhost", mais cela entraînera cette erreur si l'adresse IP est par exemple 10.0.0.1.

6voto

Sujit Senapati Points 51

Si vous utilisez localhost (Use 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 le relais de votre serveur de messagerie en conséquence :

Boîte aux lettres indisponible. La réponse du serveur était : 5.7.1 Impossible de relayer pour abc@xyz.com

3voto

Joy Points 35

Vista et Windows 7 n'ont pas de serveur SMTP, cette fonction a été supprimée depuis Windows XP, vous devez donc configurer votre serveur SMTP explicitement, plusieurs outils sont disponibles sur le marché pour cela, vous pouvez les consulter. Une fois que vous avez configuré le SMTP, n'oubliez pas de vérifier le nom du serveur que vous utiliserez pour envoyer l'e-mail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X