web-dev-qa-db-ja.com

カスタム.NETアプリケーションとWindows認証を使用して、認証された送信者のみを許可する配布リストにメールを送信するにはどうすればよいですか?

これは基本的に私の 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.CredentialsSystem.Net.CredentialCache.DefaultNetworkCredentialsに設定していても、どこかでWindows資格情報がExchangeサーバーに渡されていないようです。

何か案は?

または、Exchange 2007で配布リストを構成して、その送信者が同じドメインにある場合を除いて、認証された送信者を要求することは可能ですか? (メールがSMTP経由で送信される場合、Exchangeが保証する方法はないと思いますが、Exchangeの管理についてはほとんど知りません)

前もって感謝します!

3
russcollier

SmtpClient.UseDefaultCredentials = trueを設定してみてください。

このプロパティのデフォルト値はfalseです。それで問題が解決するかどうかはわかりませんが、簡単に試すことができるようです。

1
Jacob Raines

昔から、ExchangeではSMTPログインをアカウントごとに有効にする必要があったことを思い出します。そのため、ネイティブプロトコル(RPCベース?)を使用してExchangeに接続できますが、アカウントがSMTPアクセスを許可するように構成されていない可能性があります。

0
DougN

以下はグーグルの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メール

0
bikithalee