Perché MailMessage inviato a qualsiasi indirizzo da Windows Form, ma non da un'applicazione ASP.NET, quando entrambi utilizzano lo stesso server SMTP?

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

Domanda

sto sperimentando una misteriosa (per me) errore durante l'invio di e-mail attraverso un server SMTP da un'applicazione Web ASP.NET. Ottengo il famoso errore "in grado di trasmettere per xxx@yyy.zzz". Cosa c'è di misterioso per me è che quando ho tagliato e incollare il codice esattamente lo stesso che invia l'e-mail in un usuale NET Windows Form, inviare l'e-mail con questa applicazione, tutto funziona bene. Questo mi ha fatto pensare che forse il problema è che l'applicazione ASP.NET viene eseguito come Servizio di rete mentre l'applicazione Windows Form viene eseguito su un account utente di dominio, ma si scopre che ho un'altra applicazione ASP.NET l'invio di e-mail attraverso la stessa SMTP-server in esecuzione sotto NETWORK SERVER allo stesso IIS, e questa applicazione non si verifichi questo problema.

Ho inoltre cercato di inviare e-mail attraverso il server SMTP manualmente telnet server SMTP sulla porta 25 e il funzionamento della SMTP protocollo manualmente, e tutto funziona bene. Il server SMTP non è configurato con qualsiasi tipo di autenticazione o SSL.

Un altro fatto misterioso è che l'applicazione ASP.NET può inviare e-mail da un indirizzo all'interno dello stesso dominio a un indirizzo di posta elettronica all'interno dello stesso dominio, ma non a qualsiasi indirizzo di fuori del dominio. Ma l'applicazione Windows Form, che utilizza lo stesso codice esatto, in grado di inviare e-mail da qualsiasi indirizzo a qualsiasi indirizzo sia all'interno che all'esterno del dominio.

Quindi, per riassumere:

  • L'applicazione ASP.NET può inviare le e-mail provenienti da indirizzi all'interno del dominio a indirizzi all'interno del dominio, ma non agli indirizzi di fuori del dominio.
  • Un'applicazione Windows Form in esecuzione lo stesso codice sullo stesso computer possono inviare e-mail da qualsiasi indirizzo a Qualsiasi indirizzo.
  • Un'altra applicazione ASP.NET sul stessi IIS in esecuzione sotto lo stesso conto (servizio di rete) può inviare e-mail che utilizzano lo stesso server SMTP da qualsiasi indirizzo a qualsiasi indirizzo.
  • Non v'è alcuna autenticazione configurato sul server SMTP.
  • Sia l'applicazione ASP.NET e la Windows Form utilizza applicativi la classe System.Net.Mail.SmtpClient per inviare un System.Net.Mail.MailMessage.

Il codice che invia il massaggio e-mail è:

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

Per quanto posso capire, questo dovrebbe essere una questione di configurazione, piuttosto che problemi di codifica. Fare chiunque ha un'idea che cosa potrebbe essere il problema, e forse come questo potrebbe essere risolto? Grazie!

È stato utile?

Soluzione

Questo suona sicuramente come un problema di autenticazione o, si sta accidentalmente utilizzando 2 diversi server SMTP.

Vi consiglio si attiva la registrazione in entrambe le applicazioni, e visualizzare il registro. Quando si visualizza il registro, si dovrebbe essere in grado di vedere le differenze, e, auspicabilmente, risalire al codice.

Per enalbe registrazione in System.Net.Mail, è necessario aggiungere alcune voci al file .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>

Ecco un link con ulteriori informazioni:

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

Altri suggerimenti

Hai impersonare = true nel web.config?

In questo modo:

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

Per quanto ne so richiede che il web.config essere impostato per consentire impersonate.

Prova ad aggiungere questo a voi web.config (se non avete lì)

    <system.web>
    <identity impersonate="true"  />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top