ASP.NET 身份确认电子邮件是纯文本而不是 HTML

ASP.NET Identity Confirmation Email Is Plain Text Instead of HTML

在 ASP.NET MVC5 C# 应用程序中,我使用标准代码在用户注册时发送确认电子邮件,这是我在多个项目中做过的事情:

var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

通常当收件人收到邮件时,其内容类型是text/html。但是,在这个应用程序中,电子邮件以内容类型 text/plain 到达并且内容未呈现为 html,而是呈现为纯文本。它应该是这样的:

请点击 here

确认您的帐户

但看起来像这样:

Please confirm your account by clicking <a href="https://localhost:44309/Account/ConfirmEmail?userId=8b126243-1f78-4e42-87d2-ab3c7c350f99&code=tokengoeshere">here</a>

我搜索了文档,但找不到任何信息来说明为什么会这样或者如何改变这种行为。

我也更新到最新版本的 Microsoft ASP.NET Identity Core (2.2.1) 认为这可能会有所帮助,但它对问题没有任何影响。

我还测试了从另一个组织的 Google Apps 电子邮件帐户发送(我将其用于具有完全相同代码的其他应用程序以发送此确认电子邮件,并且知道它发送为 html ) 如果其中有一些重要的设置。

关于为什么发送为 text/plain 以及如何解决这个问题有什么想法吗?

谢谢!

问题很可能与您的身份无关,可能只是邮件功能本身的问题。您是否将 MailMessage.IsBodyHtml 属性 设置为 true?

MailMessage message = new MailMessage(fromEmail, toEmail, subject, body);
message.IsBodyHtml = true; // here

这会将电子邮件正文设置为 HTML。默认情况下,属性 为假,因此您需要显式声明它为真。

问题可能出在您使用的 service/api 邮件上。我已经使用了几个,它们通常有一个可选的 htmlBody 参数或一个 isBodyHtml 参数。如果您指定您使用的是哪个,或者在 EmailService class(在 IdentityConfig.cs 中)中提供 SendAsync 方法的代码,可能很容易为您指明正确的方向。

如果您坚持使用纯文本,您可以发送带有 url 的纯文本,客户端通常会为用户将其转换为 link。 Outlook 和 gmail 执行此操作。

所以,它看起来像这样:

await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account:" + callbackUrl);

您可以使用 SendGrid API 发送 HTML 类型的电子邮件,它们还提供交易模板。

链接

https://sendgrid.com/

甚至在 Asp.net 核心文档中提出建议

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/accconfirm?view=aspnetcore-2.2&tabs=visual-studio