Pourquoi est-MailMessage envoyé à une adresse à partir de Windows Formulaires de demande, mais pas d'une application ASP.NET, lorsque les deux utilisent le même serveur SMTP?

StackOverflow https://stackoverflow.com/questions/2145437

Question

Je rencontre un mystérieux (pour moi) erreur lors de l'envoi d'e-mails via un serveur SMTP à partir d'une application Web ASP.NET. Je reçois la fameuse erreur « incapable de relais pour xxx@yyy.zzz ». Ce qui est mystérieux pour moi est que quand je copier et coller 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 peut-être le problème est que l'application ASP.NET fonctionne comme SERVICE RÉSEAU alors que l'application Windows Forms fonctionne sur un compte d'utilisateur de domaine, mais il se trouve que j'ai une autre application ASP.NET l'envoi d'e-mail par le même en cours d'exécution SMTP serveur sous serveur réseau au même IIS, et cette application ne connaît pas ce problème.

J'ai encore essayé d'envoyer des e-mails via le serveur SMTP manuellement par telnet le serveur SMTP sur le port 25 et l'exécution du protocole SMTP manuellement, et tout fonctionne très bien. Le serveur SMTP n'est pas configuré avec tout type 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 e-mail dans le même domaine, mais pas à une adresse en dehors du domaine. Mais l'application Windows Forms, qui utilise le même code, peuvent envoyer des e-mails depuis une adresse à une adresse à la fois à l'intérieur et à l'extérieur du domaine.

Donc, pour résumer:

  • L'application ASP.NET peut envoyer e-mails à partir d'adresses dans le domaine à des adresses dans le domaine, mais pas à des adresses en dehors du domaine.
  • Une exécution d'applications Windows Forms le même code sur le même ordinateur peuvent envoyer des e-mails de toute adresse à Toute adresse.
  • Une autre application ASP.NET sur la mêmes IIS fonctionnant sous le même compte (service réseau) peut envoyer e-mails en utilisant le même serveur SMTP de toute adresse à toute adresse.
  • Il n'y a pas d'authentification configuré sur le serveur smtp.
  • Tant l'application ASP.NET et Windows Forms application 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. Ne quelqu'un a une idée de ce que le problème pourrait être, et peut-être comment cela pourrait être résolu? Thanx!

Était-ce utile?

La solution

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 journalisation dans les deux applications, et de visualiser le journal. Lorsque vous affichez le journal, vous devriez être en mesure de voir les différences, et nous espérons remonter à votre code.

Pour enalbe l'enregistrement à System.Net.Mail, vous devez ajouter des entrées à 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>

Voici un lien avec plus d'informations:

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

Autres conseils

Avez-vous usurper l'identité = true dans le 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à)

    <system.web>
    <identity impersonate="true"  />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top