ASP.NET MVC 忘记密码电子邮件 link 未格式化为 Html
ASP.NET MVC Forget Password email link not formatting as Html
我正在尝试设置忘记密码功能,但我无法获取 link 格式的电子邮件正文。我认为没有为 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> ");
我希望代码能够工作,以便电子邮件具有可点击的 link,而不仅仅是 url 的长字符串。
您没有提供任何消息正文数据样本,也没有提供生成电子邮件的样本源标记,因此很难 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: <b>Hello World</b>
Decoded string of the above encoded string is: <b>Hello World</b>
现场演示:https://dotnetfiddle.net/9j46WN
如您所见,对包含 HTML 的字符串进行编码会将 HTML 控制字符转换为其编码表示形式。这通常用于确保字符在查看时 而不是 被视为 HTML (即它们被视为要在屏幕上显示的文本片段,而不是解释为HTML 文档的标记)。这与你想要的完全相反。
例如当我将这两个字符串作为原始标记放入 this HTML 页面时(而不是在 "code" 块中),结果为:
HTML 编码字符串为:Hello World
上述编码字符串的解码字符串为:Hello World
注意编码后的 如何显示 HTML 而不是 使用 吗?
所以我认为您可以删除 Html-encoding。假设您已经在 message.Body
中为您的方法提供 HTML 标记,那么您可以使用它 as-is。如果您以正常方式设置邮件正文,您应该也可以省去其他视图。以下是我认为您的代码应更改为:
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);
}
我正在尝试设置忘记密码功能,但我无法获取 link 格式的电子邮件正文。我认为没有为 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> ");
我希望代码能够工作,以便电子邮件具有可点击的 link,而不仅仅是 url 的长字符串。
您没有提供任何消息正文数据样本,也没有提供生成电子邮件的样本源标记,因此很难 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: <b>Hello World</b>
Decoded string of the above encoded string is: <b>Hello World</b>
现场演示:https://dotnetfiddle.net/9j46WN
如您所见,对包含 HTML 的字符串进行编码会将 HTML 控制字符转换为其编码表示形式。这通常用于确保字符在查看时 而不是 被视为 HTML (即它们被视为要在屏幕上显示的文本片段,而不是解释为HTML 文档的标记)。这与你想要的完全相反。
例如当我将这两个字符串作为原始标记放入 this HTML 页面时(而不是在 "code" 块中),结果为:
HTML 编码字符串为:Hello World
上述编码字符串的解码字符串为:Hello World
注意编码后的 如何显示 HTML 而不是 使用 吗?
所以我认为您可以删除 Html-encoding。假设您已经在 message.Body
中为您的方法提供 HTML 标记,那么您可以使用它 as-is。如果您以正常方式设置邮件正文,您应该也可以省去其他视图。以下是我认为您的代码应更改为:
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);
}