ASP.NET MVC Забыл пароль электронной почты, ссылка не форматируется как HTML - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь настроить функцию забытого пароля, но не могу отформатировать тело письма со ссылками. Я думаю, что электронная почта не настроена для 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.

1 Ответ

0 голосов
/ 24 мая 2019

Вы не предоставили образец данных тела сообщения или образец разметки источника сгенерированных писем, поэтому трудно быть на 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>

Live Demo: https://dotnetfiddle.net/9j46WN

Как видите, кодирование строки, содержащей HTML, преобразует управляющие символы HTML в их закодированное представление.Это обычно используется, чтобы гарантировать, что символы не обрабатываются как HTML при просмотре (т.е. они рассматриваются как фрагменты текста, отображаемого на экране, а не как часть разметки документа HTML).Это полная противоположность того, что вы хотите.

Например, когда я помещаю эти две строки в эту HTML-страницу в виде необработанной разметки (а не в блоке «кода»), получаетсяas:


Кодированная строка HTML: Hello World

Декодированная строка указанной выше кодированной строки: Hello World


Обратите внимание, как кодированный отображает HTML, а не , используя it?

Так что я думаю, что вы можете отказаться от Html-кодировки.Предполагая, что вы уже предоставляете HTML-разметку для вашего метода в message.Body, вы можете использовать ее как есть.И если вы настроите тело сообщения обычным способом, вы также сможете обойтись без альтернативных представлений.Вот то, что я думаю, ваш код должен быть изменен на:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...