Como enviar e-mails usando um aplicativo .NET personalizado e a autenticação do Windows para uma lista de distribuição que permite apenas remetentes autenticados?

3

Este é basicamente um post do meu StackOverflow question para ver se consigo obter uma perspectiva do lado do servidor.

Estou tentando enviar e-mails automatizados de um aplicativo de console C # de máquinas para clientes no mesmo domínio através de nosso servidor interno do Exchange 2007 (usando SMTP), mas estou atingindo um problema com listas de distribuição que só permitem autenticado remetentes. Basicamente, os e-mails que estou enviando estão sendo rejeitados pelo Exchange com:

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;[email protected]

Estou usando System.Net.Mail.SmtpClient e definindo a propriedade Credentials como System.Net.CredentialCache.DefaultNetworkCredentials (que deve passar pelas credenciais do Windows do usuário atual que está executando o processo), mas em algum lugar ao longo da linha, as credenciais da conta que está executando este programa (eu, um usuário de domínio válido com uma caixa de correio válida) não estão sendo passados para o Exchange corretamente.

Estou usando System.Net.CredentialCache.DefaultNetworkCredentials porque não quero codificar um nome de usuário ou senha (seja no próprio código ou em qualquer tipo de arquivo de configuração); Eu quero o processo para autenticar com o nosso servidor SMTP usando a autenticação do Windows.

Aqui está um programa de teste que estou usando para reproduzir o problema (os nomes de domínio foram anonimizados):

using System;
using System.Net.Mail;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            var smtpClient = new SmtpClient
                {
                    Host = "MAIL",
                    Port = 25,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    Credentials = System.Net.CredentialCache.DefaultNetworkCredentials
                };

            var mailMessage = new MailMessage
                {
                    Body = "Testing",
                    From = new MailAddress(Environment.UserName + "@example.com"),
                    Subject = "Testing",
                    Priority = MailPriority.Normal
                };

            mailMessage.To.Add("[email protected]");

            smtpClient.Send(mailMessage);
        }
    }
}

Sempre que eu executo isso como eu (novamente, sou um usuário válido no domínio, com uma caixa de correio existente no servidor do Exchange) recebo uma mensagem de devolução não entregue do Exchange com a resposta:

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;[email protected]

Falei com nosso administrador do servidor do Exchange e ele viu o seguinte erro no log de eventos do servidor do Exchange:

Account For Which Logon Failed:
  Security ID: NULL SID
  Account Name: 
  Account Domain: 

Failure Information:
  Failure Reason: Unknown user name or bad password.
  Status:         0xc000006d
  Sub Status:     0xC0000064

Aparentemente, esse código de status e código de sub-status traduzem para:

0xc000006d This is either due to a bad username or authentication information.  Usually logged as status code with 0xc0000064 as substatus

0xC0000064 user name does not exist

Então, novamente, é como se, em algum lugar ao longo da linha, minhas credenciais do Windows não estivessem sendo passadas para o servidor Exchange, embora eu esteja definindo o SmtpClient.Credentials para System.Net.CredentialCache.DefaultNetworkCredentials

Alguma idéia?

Ou é possível configurar de alguma forma listas de distribuição no Exchange 2007 para exigir remetentes autenticados, exceto quando o remetente está no mesmo domínio? (Eu estou supondo que não há nenhuma maneira para o Exchange garantir que quando os e-mails são enviados via SMTP, mas eu sei muito pouco sobre a administração do Exchange)

Obrigado antecipadamente!

    
por russcollier 05.03.2012 / 16:10

3 respostas

1

Tente definir smtpClient.UseDefaultCredentials = true.

O valor padrão para essa propriedade é falso. Eu não sei ao certo se isso vai resolver o seu problema, mas parece fácil tentar.

    
por 20.12.2012 / 23:36
0

Há muito tempo, lembro que os logins SMTP tinham que ser habilitados por conta no Exchange, portanto, embora você possa se conectar ao Exchange usando seu protocolo nativo (baseado em RPC?), sua conta pode não estar configurada para permitir Acesso SMTP.

    
por 06.03.2012 / 05:50
0

As seguintes são da configuração do google smtp

SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
SmtpServer.EnableSsl = true;

Em vez de SMTP, você pode usar CDOSYS, Collaboration Data Objects (CDO) para a biblioteca do Windows 2000 (Cdosys.dll). A biblioteca Cdosys.dll também é conhecida como CDOSYS. Siga o link: E-mail C # CDO

    
por 23.10.2013 / 08:02