これは基本的に私の StackOverflowの質問 からのクロスポストであり、サーバー側の視点を得ることができるかどうかを確認します。
内部のExchange2007サーバー(SMTPを使用)を介して、C#コンソールアプリケーションからマシンからすべての同じドメインのクライアントに自動化された電子メールを送信しようとしていますが、認証された送信者のみを許可する配布リストで問題が発生しています。基本的に、私が送信しているメールは、Exchangeによって拒否されています。
#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;[email protected]
System.Net.Mail.SmtpClient
を使用し、CredentialsプロパティをSystem.Net.CredentialCache.DefaultNetworkCredentials
に設定しています(これは、プロセスを実行している現在のユーザーのWindows資格情報を通過する必要があります)が、どこかで、これを実行しているアカウントの資格情報プログラム(私、有効なメールボックスを持つ有効なドメインユーザー)がExchangeに正しく渡されていません。
ユーザー名またはパスワードを(コード自体または任意の種類の構成ファイルに)ハードコーディングしたくないため、System.Net.CredentialCache.DefaultNetworkCredentials
を使用しています。プロセスがWindows認証を使用してSMTPサーバーで認証されるようにしたい。
これは私が問題を再現するために使用しているテストプログラムです(ドメイン名は匿名化されています):
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);
}
}
}
これを自分で実行するたびに(ここでも、私はドメインの有効なユーザーであり、Exchangeサーバーに既存のメールボックスがあります)、Exchangeから配信不能のバウンスメッセージが返されます。
#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;[email protected]
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
繰り返しになりますが、SmtpClient.Credentials
をSystem.Net.CredentialCache.DefaultNetworkCredentials
に設定していても、どこかでWindows資格情報がExchangeサーバーに渡されていないようです。
何か案は?
または、Exchange 2007で配布リストを構成して、その送信者が同じドメインにある場合を除いて、認証された送信者を要求することは可能ですか? (メールがSMTP経由で送信される場合、Exchangeが保証する方法はないと思いますが、Exchangeの管理についてはほとんど知りません)
前もって感謝します!
SmtpClient.UseDefaultCredentials = trueを設定してみてください。
このプロパティのデフォルト値はfalseです。それで問題が解決するかどうかはわかりませんが、簡単に試すことができるようです。
昔から、ExchangeではSMTPログインをアカウントごとに有効にする必要があったことを思い出します。そのため、ネイティブプロトコル(RPCベース?)を使用してExchangeに接続できますが、アカウントがSMTPアクセスを許可するように構成されていない可能性があります。
以下はグーグルのSMTP設定からのものです
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
SmtpServer.EnableSsl = true;
SMTPの代わりに、CDOSYS、Windows 2000ライブラリ用のコラボレーションデータオブジェクト(CDO)(Cdosys.dll)を使用できます。 Cdosys.dllライブラリはCDOSYSとも呼ばれます。リンクをたどる: C#CDOメール