【问题标题】:ASP.NET MVC Forget Password email link not formatting as HtmlASP.NET MVC 忘记密码电子邮件链接未格式化为 Html
【发布时间】:2019-10-11 03:30:03
【问题描述】:

我正在尝试设置忘记密码功能,但无法获取带有链接格式的电子邮件正文。我认为电子邮件没有为 Html 设置。

 void sendMail(IdentityMessage message)
    {
        #region formatter
        string text = string.Format("", message.Subject, message.Body);
        string html = "";

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

        MailMessage msg = new MailMessage();
        msg.From = new MailAddress(ConfigurationManager.AppSettings["Email"].ToString());
        msg.To.Add(new MailAddress(message.Destination));
        msg.IsBodyHtml = true;
        msg.Subject = message.Subject;
        msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html));
        msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html));

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

        smtpClient.Send(msg);
    }

我如何使用它:

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

我希望代码能够正常工作,这样电子邮件就有一个可点击的链接,而不仅仅是 URL 的长字符串。

【问题讨论】:

  • UserManager 是如何知道调用 sendMail 的?

标签: c# html email smtp mailmessage


【解决方案1】:

您没有提供任何邮件正文数据示例,或生成的电子邮件的示例源标记,因此很难 100% 成为根本原因,但这里有一些小问题可能会造成影响:

1) 您从未真正设置过电子邮件的正文。您设置替代视图,但不设置基体。因此,即使您设置了 IsBodyHtml 选项,它也没有任何作用。

2) 您添加了两个相同的替代视图。这可能无关紧要,但显然是多余的。如果您已将正文设置为 HTML,然后实际包含正文,则无论如何您都不需要这些替代视图。

3) 以上是小问题,但我认为这是关键:我强烈怀疑你误解了 HttpUtility.HtmlEncode() 的作用。

考虑以下示例:

string myString = "<b>Hello World</b>";
// Encode the string.
string myEncodedString = HttpUtility.HtmlEncode(myString);

Console.WriteLine($"HTML Encoded string is: {myEncodedString}");
StringWriter myWriter = new StringWriter();

// Decode the encoded string.
HttpUtility.HtmlDecode(myEncodedString, myWriter);
string myDecodedString = myWriter.ToString();
Console.Write($"Decoded string of the above encoded string is: {myDecodedString}");

这将输出:

HTML Encoded string is: &lt;b&gt;Hello World&lt;/b&gt;
Decoded string of the above encoded string is: <b>Hello World</b>

现场演示:https://dotnetfiddle.net/9j46WN

如您所见,对包含 HTML 的字符串进行编码会将 HTML 控制字符转换为其编码表示。这通常用于确保字符在查看时被视为 HTML(即,它们被视为要显示在屏幕上的文本片段,而不是解释为 HTML 文档标记的一部分)。这与您想要的完全相反。

例如当我将这两个字符串作为原始标记(而不是“代码”块)放入 this HTML 页面时,结果如下:


HTML 编码字符串为:Hello World

上述编码字符串的解码字符串为:Hello World


注意编码后的 HTML 如何显示而不是使用它?

所以我认为你可以放弃 Html 编码。假设您已经在 message.Body 中为您的方法提供了 HTML 标记,那么您可以按原样使用它。如果您以正常方式设置消息正文,您应该也可以省去替代视图。以下是我认为您的代码应该更改为的内容:

void sendMail(IdentityMessage message)
{
    MailMessage msg = new MailMessage();
    msg.From = new MailAddress(ConfigurationManager.AppSettings["Email"].ToString());
    msg.To.Add(new MailAddress(message.Destination));
    msg.IsBodyHtml = true;
    msg.Body = message.Body;
    msg.Subject = message.Subject;

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

    smtpClient.Send(msg);
}

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 2017-11-12
    • 2015-06-22
    • 2013-03-04
    • 2013-06-24
    • 2016-08-31
    • 2013-06-23
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多