asp.net net.mail-すべての電子メールをデバッグモードで別の電子メールアドレスにルーティングします。

StackOverflow https://stackoverflow.com/questions/638768

  •  10-07-2019
  •  | 
  •  

質問

System.Web.HttpContext.Current.IsDebuggingEnabled がtrueの場合、とにかくすべてのメールを別のアドレスに送信することはできますか?または、どこにでもメールを送信するために使用する新しいクラスが必要ですか?

役に立ちましたか?

解決

tvanfossonが詳述したMailProxyメソッドと同様のソリューションを使用します。ただし、言及する価値があると思ういくつかの違いがあります。 1つ目は、開発環境またはテスト環境でSmtpClientクラスを拡張し、Sendメソッドをオーバーライドするだけです。環境を決定するために設定ファイルを使用します。その後、メールを送信する必要があるときはいつでもこのクラスを使用します。このクラスは、アプリケーションに現在ログインしているユーザーを特定し、生成されたすべての電子メールをリダイレクトします。ログインユーザーが何らかの理由で利用できない場合は、受信者の標準リストにフェールオーバーします。これは、テストまたは開発を行う複数の人がいる場合に役立ちます。彼らが生成した電子メールのみを受け取るからです。また、メッセージの元の受信者をメッセージの本文の先頭に追加します。これも、ワークフロータイプのメッセージをテストして、正しい個人に送信されることを確認するときに役立ちます。最後に、[DEV]または[QA]タグをメッセージの件名に追加すると、メールクライアントですべてのテストメッセージを処理するルールを設定できるので便利です。

他のヒント

SMTPサーバーをセットアップし、webappにそれを送信メールサーバーとして使用させます(何らかの構成で指定)。実稼働サイトの場合、サーバーは正常に動作しますが、デバッグの場合、SMTPサーバーを構成して、選択したアドレスにすべてのメールをルーティングできます。これには、アプリをまったく変更しないという利点があります。これは、動作を変更することで、再現しようとしているバグの発生を防ぐ場合などに役立ちます。 >

これをコードのどこにでも使用できます:

if (System.Web.HttpContext.Current.IsDebuggingEnabled)
{
 mail.To = "debug@debug.com";
}
else
{
 mail.To = recipientAddress;
}

または、単に電子メールアドレスを取得するための単純なラッパー(受信者アドレスのメソッドのgetterで何かが機能する場合でも)またはsmtpclientまたはmailmessageクラス全体のラッパーを作成します。

私は古き良き時代を使用している正直である必要があります

#if DEBUG
    Mail.To("debug@debugaddress.com");
#else
    Mail.To("actualrecipient@destinationaddress.com");
#endif

本番アプリでデバッグコードが浮遊するのを防ぐため。データベースアクセスに使用するアプローチは、dnsエントリ、つまりdatabase1.domain.comを使用し、devマシンのhostsファイルでローカルシステムを指し、本番マシンではデータベースサーバーを指します。デバッグメールサーバーと本番メールサーバーを使用するのに似たものを使用できますが、上記の最初のソリューションと比較すると過剰に思えます。

これを処理する最良の方法は、メールクライアントのプロキシクラスを使用することだと思います。プロキシクラスを作成するときは、デバッグモードで動作するかどうかを示すパラメーターを使用します。プロキシがメールクライアントと同じインターフェイスをサポートするようにしますが、デバッグモードで動作している場合は送信メールアドレスをサイレントに置き換えます。

public class MailProxy
{
     private bool IsDebug { get; set; }
     private string DebugAddress { get; set; }
     private SmtpClient Client { get; set; }

     public MailProxy( SmtpClient client,
                       bool debugging,
                       string debugAddress )
     {
         this.IsDebug = debugging;
         this.DebugAddress = debugAddress;
     }

     public void Send( MailMessage message )
     {
         if (this.IsDebug)
         {
             message.To = new MailAddress(this.DebugAddress);
         }
         this.Client.Send( message );
     }

     ...
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top