Назад | Перейти на главную страницу

Как отправлять письма с использованием пользовательского приложения .NET и проверки подлинности Windows в список рассылки, который разрешает только проверенных отправителей?

Это в основном кросс-пост от моего StackOverflow вопрос чтобы увидеть, смогу ли я получить перспективу на стороне сервера.

Я пытаюсь отправить автоматические электронные письма из консольного приложения C # с компьютеров клиентам, находящимся в одном домене, через наш внутренний сервер Exchange 2007 (с использованием SMTP), но у меня возникает проблема со списками рассылки, которые разрешают только аутентифицированных отправителей. В основном письма, которые я отправляю, отклоняются Exchange с помощью:

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;AuthTESTGroup@example.com

я использую System.Net.Mail.SmtpClient и установив для свойства Credentials значение System.Net.CredentialCache.DefaultNetworkCredentials (который должен проходить через учетные данные Windows текущего пользователя, запускающего процесс), но где-то по ходу дела учетные данные учетной записи, в которой запущена эта программа (я, действительный пользователь домена с действующим почтовым ящиком), не передаются в Exchange правильно.

я использую System.Net.CredentialCache.DefaultNetworkCredentials потому что я не хочу жестко закодировать имя пользователя или пароль (ни в самом коде, ни в каком-либо файле конфигурации); Я хочу, чтобы процесс аутентифицировался на нашем SMTP-сервере с использованием аутентификации Windows.

Вот тестовая программа, которую я использовал для воспроизведения проблемы (доменные имена анонимизированы):

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("AuthTESTGroup@example.com");

            smtpClient.Send(mailMessage);
        }
    }
}

Всякий раз, когда я запускаю это от себя (опять же, я действующий пользователь в домене с существующим почтовым ящиком на сервере Exchange), я получаю недоставленное сообщение о недоставке от Exchange с ответом:

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;AuthTESTGroup@example.com

Я поговорил с нашим администратором сервера Exchange, и он увидел следующую ошибку в журнале событий сервера 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

По-видимому, этот код состояния и код дополнительного статуса переводятся как:

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

Итак, опять же, это как если бы где-то по ходу дела мои учетные данные Windows не передаются на сервер Exchange, даже если я устанавливаю SmtpClient.Credentials к System.Net.CredentialCache.DefaultNetworkCredentials

Любые идеи?

Или возможно каким-то образом настроить списки рассылки в Exchange 2007, чтобы требовать аутентифицированных отправителей, кроме случаев, когда этот отправитель находится в том же домене? (Я предполагаю, что у Exchange нет возможности гарантировать, что почта отправляется через SMTP, но я очень мало знаю об администрировании Exchange)

Заранее спасибо!

Попробуйте установить smtpClient.UseDefaultCredentials = true.

Значение по умолчанию для этого свойства - false. Я не знаю наверняка, решит ли это вашу проблему, но, похоже, попробовать это легко.

Ниже приведены настройки SMTP в Google.

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

Вместо SMTP вы можете использовать CDOSYS, Collaboration Data Objects (CDO) для библиотеки Windows 2000 (Cdosys.dll). Библиотека Cdosys.dll также известна как CDOSYS. Перейди по ссылке : Электронная почта C # CDO

С давних пор я вспоминаю, что вход в систему SMTP должен был быть включен для каждой учетной записи в Exchange, поэтому, хотя вы можете подключиться к Exchange с использованием собственного протокола (на основе RPC?), Ваша учетная запись может быть не настроена для разрешения доступа SMTP.