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?
-
23-09-2019 - |
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!
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:
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" />