2012-06-06 2 views
3

Я пытаюсь отправить электронную почту через SMTP-сервер домена, который использует встроенную проверку подлинности Windows. При явном указании учетных данных, все работает отлично: журналы сервераПочему SmtpClient.UseDefaultCredentials игнорируется?

using (var client = new SmtpClient("<Server>")) 
{ 
    client.Credentials = new NetworkCredential("<User name>", "<Password>"); 
    client.EnableSsl = true; 
    client.Send(...); 
} 

SMTP показать EHLO, STARTTLS, STARTTLS и EHLO, затем AUTH, почта и т.д.

Когда, с другой стороны, учетные данные по умолчанию являются используется:

using (var client = new SmtpClient("<Server>")) 
{ 
    client.UseDefaultCredentials = true; 
    client.EnableSsl = true; 
    client.Send(...); 
} 
  • SmtpException отбрасывается с сообщением, «Ошибка отправки почты.»

  • внутренний IOException сообщение: «Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным узлом.», А

  • внутренняя-внутренняя SocketException является: «Существующий соединение было принудительно закрыто удаленным хостом ».

Журналы SMTP-сервера показывают EHLO, STARTTLS, STARTTLS и EHLO, а затем ничего.

Результат такой же (успех для первого образца, отказ для второго), если параметры перемещены из исходного кода в App.config configuration/system.net/mailSettings/smtp/network и всякий раз, когда указан номер порта или нет.

Учитывая, что:

  • according to the documentation, SmtpClient.UseDefaultCredentials «[G] ETS или задает логическое значение, которое управляет ли DefaultCredentials посылается с запросами», что

  • «Для стороны клиента приложение, [CredentialCache.DefaultCredentials] обычно являются учетными данными Windows (имя пользователя, пароль и домен) пользователя, выполняющего приложение », и что

  • проверено c ода это на стороне клиента приложение, работающее с той же учетной записи, чьи учетные данные были указаны в первом примере выше Windows Forms,

почему второй образец терпит неудачу, в то время как первый из них работает?


На форуме it was suggested, что проблема может быть причиной SMTP-сервер не поддерживает NTLM. Посредством EHLOing сервера, похоже, что NTLM поддерживается, одна из линий ответа - 250-AUTH GSSAPI NTLM.

ответ

3

Думаю, вам действительно нужно указать учетные данные. UseDefaultCredentials - это просто флаг, указывающий SMTPClient использовать учетные данные, предоставленные для свойства Credentials.

client.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 

Вот некоторые другие вещи, чтобы попробовать:

  • Является ли это с помощью .NET 4? This Connect bug report предлагает проблемы с этой версией (хотя она старая и не разрешена). Вы можете попробовать .NET v3.5 или v4.5
  • Может ли это быть cross zone issue?
  • Постарайтесь указать настройки, используя app.config file instead, о том, что что-то изменит.
+0

Это имеет смысл, поскольку учетные данные могут быть установлены в значение null, если вы этого не сделаете – BumbleB2na

+0

Это помогает. Частично. Теперь возникает новое исключение: «Для SMTP-сервера требуется защищенное соединение или клиент не прошел аутентификацию. Ответ сервера: 5.7.3 Клиент не был аутентифицирован. » –

+0

Вы указали EnableSsl? –

0

Если UseDefaultCredentials установлена ​​истина, это не значит использовать значения в полномочий собственности. Вместо этого это означает использование учетных данных «в настоящее время вошедшего в систему пользователя», который в случае веб-приложений IIS, как правило, является идентификатором пула приложений, а в случае службы Windows - идентификация службы и в случае настольного приложения это идентификатор пользователя, зарегистрированного в Windows.

Смотрите документ Microsoft (https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.usedefaultcredentials(v=vs.110).aspx), где говорится, что если UseDefaultCredentials ложно (по умолчанию), и вы не дают ничего в полномочий собственности, "тогда почта отправляется на сервер анонимно ».