ELMAH - 从 Azure 应用程序设置获取 SMTP 凭据

Jon*_*yce 4 elmah azure

我有一个使用ELMAH来记录未处理异常的 Azure Web 应用程序。

当我第一次部署它时,web.config 中定义了完整的 SMTP 设置,并且 ELMAH 通过电子邮件发送了例外情况:

<system.net>
    <mailSettings>
        <smtp from="me@mydomain.com">
            <network host="smtp.mailprovider.com"
                 port="123"
                 userName="myUserName"
                 password="p@ssw0rd" />
        </stmp>
    </mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud)

此后,用户名和密码已从 web.config 中删除,它们现在存储为应用程序设置,通过 Azure 门户进行配置。

我发送的大多数电子邮件仍然可以正常工作,因为电子邮件代码可以访问这些应用程序设置并在实例化时使用它们SmtpClient,例如:

var userName = WebConfigurationManager.AppSettings["smtp.userName"];
var password = WebConfigurationManager.AppSettings["smtp.password"];

var credentials = new NetworkCredential(userName, password);

using (var smtpClient = new SmtpClient { Credentials = credentials })
{
    await smtpClient.SendMailAsync(mailMessage);
}
Run Code Online (Sandbox Code Playgroud)

让 ELMAH 使用应用程序设置中存储的凭据的最佳方法是什么?

我可以看到的选项:

  • 有一个页面解释了如何使用 ELMAH 的 ErrorTweetModule 来执行 HTTP 表单发布,其中包含任何 URL 的错误详细信息。然后,接收帖子的控制者可以使用存储的凭据通过电子邮件发送详细信息。
  • WebBase 有一篇文章的链接,建议您无需身份验证即可将电子邮件直接发送到收件人的 SMTP 服务器,但它说如果您设置了 DomainKeys,则这可能不起作用,我就是这样做的。
  • 答案链接到一篇有关拦截事件以自定义消息的文章。Mailing

Jon*_*yce 5

我最终创建了 Elmah 的自定义版本ErrorMailModule,它源自标准版本,但SendMail根据 Atif Aziz 在Google 网上论坛讨论中的一些建议重写了该方法。

唯一需要的更改是创建新模块,并将其切换Web.Config为使用自定义模块而不是标准模块。


模块

using System;
using System.Net.Mail;

namespace Test
{
    public class ErrorMailModule : Elmah.ErrorMailModule
    {
        protected override void SendMail(MailMessage mail)
        {
            if (mail == null) throw new ArgumentNullException(nameof(mail));

            // do what you want with the mail
            // (in my case this fires up the email service, which 
            // gets the credentials from the Azure settings)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

网络配置更改

所需要做的就是将两次出现的 更改Elmah.ErrorLogModule, Elmah为您自己的模块,在本例中为Test.ErrorMailModule

所以,而不是这个...

<system.web>
  <httpModules>
    <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
  </httpModules>
</system.web>
<system.webServer>
  <modules>
    <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
  </modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

...你现在应该有这个:

<system.web>
  <httpModules>
    <add name="ErrorMail" type="Test.ErrorMailModule" />
  </httpModules>
</system.web>
<system.webServer>
  <modules>
    <add name="ErrorMail" type="Test.ErrorMailModule" preCondition="managedHandler" />
  </modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

您仍然需要该errorMail部分,因为 Elmah 仍然负责创建电子邮件。我的看起来像这样:

<elmah>
  <errorMail from="user@domain.com" to="user@domain.com" subject="Custom Email Module"/>
</elmah>
Run Code Online (Sandbox Code Playgroud)