电子邮件发送.NET Core

时间:2017-08-14 08:35:24

标签: email asp.net-core

我只想拥有一个功能,它将向不同的人发送邮件。

我写了一封电子邮件服务,就像这样:

 public void SendEMail(EMail mail)
    {
        var body = JObject.FromObject(settings);
        body.Merge(JObject.FromObject(mail));

        GlobalTelemetry.TrackDependency("E-Mail Service", "Send", () =>
        {
            var result = AsyncHelper.RunSync(() => httpClient.PostAsync(azureFunctionUrl,
                new StringContent(body.ToString(), Encoding.UTF8, "application/json")));
            if (!result.IsSuccessStatusCode)
            {
                throw new InvalidOperationException(
                    $"E-Mail Service failed to send mails. Http Status {result.StatusCode}. Please check if the Url '{azureFunctionUrl}' is correct. Env: {Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}");
            }
        });
    }

以及希望使用此邮件服务的所有其他功能,请执行以下操作:

 SendMail = mail =>
        {
            var fireAndForgetTask = Task.Run(() =>
            {
                try
                {
                    eMailService.SendEMail(mail);
                }
                catch (Exception e)
                {
                    Log.Fatal(e, $"Fail to send  E-Mail to: '{mail.To}'");
                }
            });
        };

它确实有效,但fireAndForgetTask未使用,我不知道如何做得更好。 是否有必要写一个电子邮件工作???

欢迎提出一些更好的建议: - )

1 个答案:

答案 0 :(得分:0)

我有一个similar issue in my app for sending a password reset email,我不想等待电子邮件发送的延迟,因为如果黑客试图找出是否存在电子邮件地址的帐户,则延迟可能表明该帐户存在存在。所以我想毫不拖延地解雇并忘记电子邮件。

所以我在一个单独的静态类based on this so question中实现了一个名为忘记的简单扩展方法:

public static void Forget(this Task task)
{

}

然后我发送我的电子邮件异步并使用它。忘记扩展而不是等待它:

emailSender.SendPasswordResetEmailAsync(
Site,
model.Email,
sr["Reset Password"],
resetUrl).Forget();

请注意,当我调用此异步方法时,我没有使用“await”,并且.Forget消除了在没有await关键字的情况下调用异步方法时在Visual Studio中出现的警告