我只想拥有一个功能,它将向不同的人发送邮件。
我写了一封电子邮件服务,就像这样:
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
未使用,我不知道如何做得更好。
是否有必要写一个电子邮件工作???
欢迎提出一些更好的建议: - )
答案 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中出现的警告