2010-01-27 5 views
1

Je rencontre une erreur mystérieuse (à moi) lors de l'envoi d'e-mails via un serveur SMTP à partir d'une application Web ASP.NET. Je reçois la fameuse erreur "impossible de relayer pour [email protected]". Ce qui est mystérieux pour moi, c'est que lorsque je coupe et colle exactement le même code qui envoie l'e-mail dans une application .NET Windows Forms habituelle, envoyer l'e-mail avec cette application, tout fonctionne très bien. Cela m'a fait penser que le problème est peut-être que l'application ASP.NET s'exécute en tant que SERVICE RÉSEAU pendant que l'application Windows Forms s'exécute sur un compte d'utilisateur de domaine, mais il se trouve que j'ai une autre application ASP.NET Serveur SMTP s'exécutant sous SERVEUR DE RÉSEAU sur le même IIS, et cette application ne rencontre pas ce problème.Pourquoi MailMessage est-il envoyé à n'importe quelle adresse à partir de l'application Windows Forms, mais pas à partir de l'application ASP.NET, lorsque les deux utilisent le même serveur SMTP?

J'ai également essayé d'envoyer des e-mails manuellement via le serveur SMTP en téléservant le serveur SMTP sur le port 25 et en exécutant le protocole SMTP manuellement, et tout fonctionne correctement. Le serveur SMTP n'est configuré avec aucune sorte d'authentification ou SSL. Un autre fait mystérieux est que l'application ASP.NET peut envoyer des e-mails à partir d'une adresse dans le même domaine à une adresse de messagerie dans le même domaine, mais pas à une adresse en dehors du domaine. Mais l'application Windows Forms, qui utilise exactement le même code, peut envoyer des e-mails de n'importe quelle adresse à n'importe quelle adresse à l'intérieur et à l'extérieur du domaine.

Donc, pour résumer:

  • L'application ASP.NET peut envoyer e-mails à partir des adresses dans le domaine à des adresses dans le domaine, mais pas à des adresses en dehors du domaine .
  • Une application Windows Forms exécutant le même code sur le même ordinateur peut envoyer des e-mails de N'IMPORTE quelle adresse à n'importe quelle adresse.
  • Une autre application ASP.NET sur le même IIS fonctionnant sous le même compte (service réseau) peut envoyer e-mails en utilisant la même adresse SMTP de QUELQUE serveur à toute adresse. Il n'y a pas d'authentification configurée sur le serveur SMTP.
  • Tant l'application ASP.NET et le application Windows Forms utilise la classe System.Net.Mail.SmtpClient d'envoyer un System.Net.Mail.MailMessage.

Le code qui envoie le massage e-mail est:

private void button1_Click(object sender, EventArgs e) 
     { 
      MailMessage mesasge = new MailMessage(txtFrom.Text, txtTo.Text, "Test mail", txtBody.Text); 
      SmtpClient client = new SmtpClient(); 
      if (!(string.IsNullOrEmpty(txtUserName.Text))) //Is false since txtUserName.Text is empty 
       client.Credentials = new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text); 
      client.EnableSsl = false; 
      client.Host = txtServer.Text; 
      client.Port = 25; 
      try 
      { 
       client.Send(mesasge); 
      } 
      catch (Exception ex) 
      { 
       txtResponse.Text = ex.Message; 
      } 
     } 

Pour autant que je peux comprendre, cela devrait être une question de configuration plutôt que des problèmes de codage. Quelqu'un at-il une idée de ce que pourrait être le problème, et peut-être comment cela pourrait-il être résolu? Merci!

+0

Au risque de paraître débile, quel serveur smtp utilisez-vous? – ChadT

+0

Avez-vous testé avec le même De l'adresse –

+0

Oui j'ai fait un test en utilisant le même De l'adresse. Malheureusement, je ne sais pas quels sont les serveurs SMTP utilisés. Je parierais sur celui dans IIS thoe .... –

Répondre

1

Cela semble certainement comme un problème d'authentification ou, vous utilisez différents serveurs 2 par mégarde SMTP.

Je vous recommande d'activer la connexion dans les deux applications et d'afficher le journal. Lorsque vous affichez le journal, vous devriez être en mesure de voir les différences et, espérons-le, remonter à votre code. Pour vous connecter à System.Net.Mail, vous devez ajouter des entrées dans votre fichier .config.

<configuration> 
    <system.diagnostics> 
    <trace autoflush="true" /> 

    <sources> 

     <source name="System.Net" > 
     <listeners> 
      <add name="MyTraceFile"/> 
     </listeners> 
     </source> 

     <source name="System.Net.Sockets"> 
     <listeners> 
      <add name="MyTraceFile"/> 
     </listeners> 
     </source> 

    </sources> 


    <sharedListeners> 
     <add 
     name="MyTraceFile" 
     type="System.Diagnostics.TextWriterTraceListener" 
     initializeData="System.Net.trace.log"    /> 
    </sharedListeners> 

    <switches> 
     <add name="System.Net" value="Verbose" /> 
     <add name="System.Net.Sockets" value="Verbose" /> 
    </switches> 
</configuration> 

est ici un lien avec plus d'informations:

http://systemnetmail.com/faq/4.10.aspx

+0

Merci pour cette suggestion, c'était nouveau pour moi et je suis Bien sûr, je trouverai une utilisation pour de nombreuses occasions, ce qui a fonctionné très bien sur ma machine de développement, mais cela ne fonctionnait pas dans l'environnement de production de mes clients, car aucun journal n'était écrit sur le système de fichiers. Serveur Server 2003 sur IIS 6. L'application s'exécute dans un pool d'applications sous la forme NETWORK SERCVICE, peut-être que cela a un rapport avec le fichier journal qui n'est pas écrit? –

+0

Il est possible que votre fichier journal soit terminé dans votre répertoire System32. Essayez de coder le chemin. Donc, plutôt que d'utiliser System.Net.trace.log, essayez: c: \ System.Net.trace.log Si cela ne fonctionne pas, créez manuellement le fichier dans le bloc-notes et donnez au service réseau l'autorisation d'y écrire . –

+0

Merci pour le conseil. J'ai vérifié dans le répertoire System32, mais ce n'est pas là. J'ai aussi c: \ System.Net.trace.log, mais pas de succès. J'ai également essayé de créer manuellement le fichier dans le bloc-notes et de donner des autorisations de service réseau pour écrire, mais toujours pas de succès. –

0

Avez-vous impersonate = true dans le fichier web.config?

Faire ceci:

new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text); 

Pour autant que je sais exige que le web.config être configuré pour permettre usurper l'identité.

Essayez d'ajouter ceci à vous web.config (si vous ne l'avez pas là-bas)

<system.web> 
    <identity impersonate="true" /> 
+0

Je ne spécifie aucune information d'identification. Le if (! (String.IsNullOrEmpty (txtUserName.Text))) est faux donc ces lignes ne sont jamais touchées. Cependant, j'ai fait l'entrée suggérée dans le fichier web.config. Cependant, le problème est resté. Merci pour le conseil quand même! –

+0

Ok :(Eh bien ce qui se passe normalement de mon côté, si vous utilisez cette méthode pour vous authentifier et vous n'avez pas l'identité impersonate = true, alors le ticket Active Directory est invalide, et vous donnera des erreurs d'utilisateur/mot de passe invalide. J'ai aussi souvent résolu des problèmes SMTP, avec juste des commandes telnet, mais cela ne semble pas du tout vous aider, parce que cela fonctionne via l'application Windows –