Warum wird gesendet Mailmessage an eine beliebige Adresse aus dem Windows Forms-Anwendung, aber nicht von ASP.NET-Anwendung, wenn beide den gleichen SMTP-Server verwenden?

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

Frage

Ich erlebe einen mysteriösen (für mich) Fehler bei der E-Mail über einen SMTP-Server von einer ASP.NET Web-Anwendung zu senden. Ich erhalte den berühmten Fehler „nicht in der Lage für xxx@yyy.zzz weiterzuleiten“. Was mir mysteriös ist, dass, wenn ich geschnitten und den exakt gleichen Code einfügen, der die E-Mail in einen üblichen .NET sendet Windows Forms-Anwendung, die E-Mail mit dieser Anwendung senden, es ist alles ganz gut funktioniert. Das machte ich denke, dass vielleicht das Problem ist, dass die ASP.NET-Anwendung läuft als NETWORK SERVICE, während die Windows-Anwendung läuft Forms auf einem Domänenbenutzerkonto, aber es stellt sich heraus, dass ich einen andere ASP.NET-Anwendung habe das Senden von E-Mail über die gleichen SMTP-Server unter NETWORK SERVER auf dem gleichen IIS ausgeführt wird, und diese Anwendung nicht dieses Problem auftritt.

Ich habe weiter versucht, E-Mails über den SMTP-Server per Telnet auf Port den SMTP-Server manuell versenden 25 und Ausführen des SMTP-Protokolls manuell, und es funktioniert gut. Der SMTP-Server nicht mit jeder Art von Authentifizierung oder SSL konfiguriert.

Eine weitere mysteriöse Tatsache ist, dass die ASP.NET-Anwendung kann E-Mails von einer Adresse innerhalb der gleichen Domäne an eine E-Mail-Adresse innerhalb der gleichen Domäne, aber nicht zu jeder Adresse außerhalb der Domäne senden. Aber die Windows Forms-Anwendung, die genau die gleichen Code verwendet, kann E-Mails von einem beliebigen Adresse an jede Adresse senden sowohl innerhalb als auch außerhalb der Domäne.

Um es zusammenzufassen:

  • Die ASP.NET-Anwendung kann senden E-Mails von Adressen innerhalb der Domain-Adressen innerhalb der Domäne, aber nicht an Adressen außerhalb der Domäne.
  • Eine Windows Forms-Anwendung läuft der gleiche Code auf demselben Computer kann von einer beliebigen Adresse E-Mails senden ANY Adresse.
  • Eine andere ASP.NET-Anwendung auf die gleiche IIS unter dem gleichen Lauf Konto (SERVICE NETWORK) kann senden E-Mails des gleichen SMTP-Server mit von einer beliebigen Adresse an jede gewünschte Adresse.
  • Es gibt keine Authentifizierung konfiguriert auf dem SMTP-Server.
  • Sowohl die ASP.NET-Anwendung und die Windows Forms-Anwendung nutzt die System.Net.Mail.SmtpClient Klasse senden ein System.Net.Mail.MailMessage.

Der Code, der die E-Mail-Massage sendet, ist:

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

Soweit ich verstehen kann, sollte dies eine Frage der Konfiguration anstatt Probleme Codierung. Sie jemand eine Idee, was das Problem sein könnte, und vielleicht, wie diese gelöst werden könnten? Thanx!

War es hilfreich?

Lösung

Dieses definitiv klingt wie ein Authentifizierungsproblem oder, Sie sind zwei verschiedene SMTP-Server versehentlich verwendet wird.

Ich empfehle Ihnen, die Protokollierung in beiden Anwendungen zu ermöglichen, und zeigen Sie das Protokoll. Wenn Sie das Protokoll anzeigen, sollten Sie in der Lage sein, die Unterschiede zu sehen, und es hoffentlich wieder zu Ihrem Code verfolgen.

Um enalbe Protokollierung in System.Net.Mail, müssen Sie einige Einträge zur CONFIG-Datei hinzuzufügen.

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

Hier ist ein Link mit weiteren Informationen:

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

Andere Tipps

Haben Sie impersonate im web.config = true?

Auf diese:

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

Soweit ich weiß, erfordert, dass die web.config impersonate ermöglichen eingestellt werden.

Versuchen Sie, den Sie hinzufügen web.config (wenn Sie nicht es haben dort)

    <system.web>
    <identity impersonate="true"  />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top