You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC密码重置邮件超链接无法正常显示问题求助

问题根源:代码问题(邮件内容编码与视图配置错误)

你遇到的问题完全是代码层面的问题,主要有两个核心错误导致超链接被当成纯文本显示:


1. 邮件内容被重复转义

首先看你生成邮件内容的代码:

await UserManager.SendEmailAsync(user.Id, "Holiday Tracker Reset Password", "Please reset your password by using the following link. Copy and paste it into the url. <a href=\"" + callbackUrl + "\">here</a>");

你手动用了&lt;和&gt;(HTML实体)代替<和>,这已经是一次转义了;然后在sendMail方法里,又对整个message.Body做了HttpUtility.HtmlEncode,相当于把这些实体又转义了一次——最终邮件里的链接会变成&amp;lt;a href=&amp;quot;...&amp;quot;&amp;gt;here&amp;lt;/a&amp;gt;,邮件客户端自然会把它当成纯文本显示。

2. 邮件视图配置错误

你的sendMail方法里重复添加了两次HTML视图,却没有提供纯文本 fallback,更关键的是对HTML内容做了不必要的编码,直接破坏了HTML标签的结构:

html += HttpUtility.HtmlEncode(@"" + message.Body);

HttpUtility.HtmlEncode会把所有HTML特殊字符转成实体,比如<变成&lt;,这直接让<a>标签失去了作用。


修复步骤

第一步:修正邮件内容的生成

把手动转义的实体换成真实的HTML标签,因为我们要发送HTML格式的邮件,不需要提前转义:

// 用字符串插值更简洁易读
string emailBody = $"Please reset your password by clicking the following link: <a href=\"{callbackUrl}\">here</a>";
await UserManager.SendEmailAsync(user.Id, "Holiday Tracker Reset Password", emailBody);

第二步:重构sendMail方法

去掉不必要的HTML编码,同时区分纯文本视图和HTML视图(兼容不同邮件客户端):

void sendMail(IdentityMessage message)
{
    // 纯文本版本(给不支持HTML的邮件客户端用)
    var callbackUrl = message.Body.Split(new[] { "<a href=\"" }, StringSplitOptions.None)[1].Split(new[] { "\">" }, StringSplitOptions.None)[0];
    string plainTextContent = $"Please reset your password by copying and pasting this link into your browser: {callbackUrl}";
    
    // HTML版本直接使用原始的message.Body(已经是正确的HTML格式)
    string htmlContent = message.Body;

    MailMessage msg = new MailMessage();
    msg.From = new MailAddress(ConfigurationManager.AppSettings["Email"].ToString());
    msg.To.Add(new MailAddress(message.Destination));
    msg.Subject = message.Subject;

    // 添加纯文本视图
    var plainView = AlternateView.CreateAlternateViewFromString(plainTextContent, null, MediaTypeNames.Text.Plain);
    msg.AlternateViews.Add(plainView);

    // 添加HTML视图
    var htmlView = AlternateView.CreateAlternateViewFromString(htmlContent, null, MediaTypeNames.Text.Html);
    msg.AlternateViews.Add(htmlView);

    SmtpClient smtpClient = new SmtpClient("smtp-mail.outlook.com", 587);
    NetworkCredential credentials = new NetworkCredential(
        ConfigurationManager.AppSettings["Email"].ToString(), 
        ConfigurationManager.AppSettings["Password"].ToString());
    smtpClient.Credentials = credentials;
    smtpClient.EnableSsl = true;
    smtpClient.Send(msg);
}

额外提示

如果修复后还是有问题,检查你的邮件客户端是否开启了“显示HTML邮件”的设置——不过绝大多数现代客户端默认都是开启的,所以主要问题还是代码里的转义和视图配置错误。

内容的提问来源于stack exchange,提问作者Conor8630

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:37:05