Por que o MailMessage é enviado para algum endereço do aplicativo Windows Forms, mas não do aplicativo ASP.NET, quando ambos estão usando o mesmo SMTP-Server?

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

Pergunta

Estou experimentando um erro misterioso (para mim) ao enviar e-mails através de um SMTP-Server de um aplicativo da Web ASP.NET. Recebo o famoso erro "incapaz de transmitir xxx@yyy.zzzz". O que é misterioso para mim é que, quando cortei e colo exatamente o mesmo código que envia o e-mail para um aplicativo usual .NET Windows Forms, envie o e-mail com este aplicativo, tudo funciona muito bem. Isso me fez pensar que talvez o problema seja que o aplicativo ASP.NET seja executado como serviço de rede enquanto o aplicativo Windows Forms é executado em uma conta de usuário de domínio, mas acontece que tenho outro aplicativo ASP.NET enviando e-mail através do mesmo SMTP-Server em execução no servidor de rede no mesmo IIS, e este aplicativo não enfrenta esse problema.

Eu tentei ainda enviar e-mails através do SMTP-Server manualmente pelo SMTP-Server na porta 25 e executando o SMTP-Protocol manualmente, e tudo funciona bem. O SMTP-Server não está configurado com nenhum tipo de autenticação ou SSL.

Outro fato misterioso é que o aplicativo ASP.NET pode enviar e-mails de um endereço dentro do mesmo domínio para um endereço de e-mail dentro do mesmo domínio, mas não para nenhum endereço fora do domínio. Mas o aplicativo Windows Forms, que usa exatamente o mesmo código, pode enviar e-mails de qualquer endereço para qualquer endereço dentro e fora do domínio.

Então, para resumir:

  • O aplicativo ASP.NET pode enviar e-mails de endereços dentro do domínio para os endereços dentro do domínio, mas não para endereços fora do domínio.
  • Um aplicativo Windows Forms executando o mesmo código no mesmo computador pode enviar e-mails de qualquer endereço para qualquer endereço.
  • Outro aplicativo ASP.NET no mesmo IIS em execução na mesma conta (serviço de rede) pode enviar e-mails usando o mesmo smtp-server de qualquer endereço para qualquer endereço.
  • Não há autenticação configurada no SMTP-Server.
  • O aplicativo ASP.NET e o aplicativo Windows Forms utilizam a classe System.net.mail.smtpclient para enviar um system.net.mail.mailmessage.

O código que envia a massagem por 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;
            }
        }

Tanto quanto eu posso entender, isso deve ser uma questão de configuração, em vez de problemas de codificação. Alguém tem uma ideia de qual pode ser o problema e talvez como isso pode ser resolvido? Thanx!

Foi útil?

Solução

Definitivamente, isso parece um problema de autenticação ou você está usando 2 servidores SMTP diferentes.

Eu recomendo que você ative o log nos dois aplicativos e visualize o log. Quando você visualiza o log, você poderá ver as diferenças e, esperançosamente, rastreá -lo de volta ao seu código.

Para envolver o login no System.net.mail, você precisa adicionar algumas entradas ao seu arquivo .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>

Aqui está um link com mais informações:

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

Outras dicas

Você tem impessoe = true no web.config?

Fazendo isso:

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

Até onde eu sei, exige que o web.config seja definido para permitir o impesso.

Tente adicionar isso a você web.config (se você não tiver lá)

    <system.web>
    <identity impersonate="true"  />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top