【问题标题】:asp.net net.mail - route all emails to a different email address in debug modeasp.net net.mail - 在调试模式下将所有电子邮件路由到不同的电子邮件地址
【发布时间】:2009-03-12 14:09:37
【问题描述】:

当System.Web.HttpContext.Current.IsDebuggingEnabled 为真时,是否有让所有电子邮件发送到不同地址的方法?还是我需要一个新的类来在任何地方发送电子邮件?

【问题讨论】:

    标签: .net asp.net system.net.mail


    【解决方案1】:

    我会设置一个 SMTP 服务器并让您的 web 应用程序将其用作其发送邮件服务器(在某种配置中指定)。对于生产站点,服务器会正​​常运行,但对于调试,您可以配置 SMTP 服务器以将所有邮件路由到您选择的地址。这具有根本不更改您的应用程序的优点,如果更改行为可以防止发生您试图重现的错误等,这可能很有用。我的公司使用这种方法进行质量检查并且效果很好。

    【讨论】:

    • 我正在考虑这个,但我不知道它在共享生产环境中的效果如何
    • “共享生产”是指在生产系统上进行测试吗?如果是这样,那是一个重大的禁忌。不小心向您的客户发送垃圾邮件不会为您赢得任何积分。如果您的意思是与其他开发人员共享测试服务器,我们通过共享测试邮箱来解决这个问题。
    【解决方案2】:

    你可以把它放在你使用它的任何地方的代码中:

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

    或者只是为获取电子邮件地址构建一个简单的包装器(即使是收件人地址方法的 getter 中的某些东西也可以),或者为整个 smtpclient 或 mailmessage 类构建一个包装器。

    【讨论】:

      【解决方案3】:

      老实说,我用的是好旧的

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

      为了阻止我的生产应用程序中出现调试代码。我用于数据库访问的一种方法是使用 dns 条目,即 database1.domain.com,在我的开发机器上的 hosts 文件中它指向我的本地系统,在我的生产机器上它指向数据库服务器。您可以使用类似的东西来拥有一个调试邮件服务器和一个生产邮件服务器,但与上面的第一个解决方案相比,这似乎有点过头了。

      【讨论】:

        【解决方案4】:

        我们使用与 tvanfosson 详述的 MailProxy 方法类似的解决方案。然而,我们有一些我觉得值得一提的差异。第一个是我们在开发或测试环境中简单地扩展 SmtpClient 类并覆盖 Send 方法。我们使用配置文件来确定环境。然后我们在需要发送电子邮件的任何时候使用这个类。此类将确定谁当前登录到应用程序,并将生成的所有电子邮件重定向给他们,如果登录用户由于某种原因不可用,则故障转移到标准收件人列表。如果您有几个人正在测试或开发,这会有所帮助,因为他们只会收到他们生成的电子邮件。我们还将邮件的原始收件人添加到邮件正文中。这在测试工作流类型消息以确保它们发送给正确的个人时再次很有用。最后,我发现在邮件主题中添加 [DEV] 或 [QA] 标记很有用,这样我就可以在我的邮件客户端中设置一个规则来处理所有测试邮件。

        【讨论】:

        • 我想过这个,但是这些方法被标记为虚拟的,如果对象被转换为 SmtpClient 可能会给你带来问题。
        【解决方案5】:

        我认为最好的处理方法是通过邮件客户端的代理类。创建代理类时,使用参数指示是否在调试模式下运行。让代理支持与邮件客户端相同的接口,但在调试模式下运行时静默替换外发电子邮件地址。

        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 );
             }
        
             ...
        }
        

        【讨论】:

          猜你喜欢
          • 2018-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多