Отправка электронных писем с устаревшими предупреждениями MailKit с помощью конструктора MailboxAddress (String)

#c# #asp.net-mvc #asp.net-core #mailkit

#c# #asp.net-mvc #asp.net-core #mailkit

Вопрос:

У меня есть следующий код, который отлично работает при отправке электронных писем, но я получаю эти предупреждения, в которых говорится, что я должен пометить некоторые методы устаревшими. Я просмотрел документы на веб-сайте MailKit, и там говорится, что я должен использовать другой конструктор, чем MailboxAddress(String) . Я понимаю это, но у меня возникают проблемы с тем, как реализовать то, о чем они просят, это кажется простым, но я думаю, что я пропустил шаг. Это один из способов, который рекомендует MailboxAddress(String, String) новый способ сделать это.

Кодируйте следующим образом:

Контроллер

     public IActionResult RequestPassword()
    {
        var message = new Message(new string[]
        {
           "email@gmail.com"
           
        },
            "Test Email",
            "This is the content from out email."
        );

        _emailSender.SendEmail(message);

        return View();
    }
  

Message.cs

Для этого класса предупреждение появляется в строке To.AddRange(to.Select(x => new MailboxAddress(x)));

 public class Message
{
    public List<MailboxAddress> To { get; set; }
    public string Subject { get; set; }
    public string Content { get; set; }

    public Message(IEnumerable<string> to, string subject, string content)
    {
        To = new List<MailboxAddress>();
       
        To.AddRange(to.Select(x => new MailboxAddress(x)));                       
        Subject = subject;
        Content = content;
    }
}
  

Класс EmailSender
Для этого класса предупреждение появляется в строке emailMessage.From.Add(new MailboxAddress(_emailConfig.From));

     public class EmailSender : IEmailSender
{
    private readonly EmailConfiguration _emailConfig; 
    public EmailSender(EmailConfiguration emailConfig)
    {
        _emailConfig = emailConfig; 
    }

    // This creates the Email and then sends it. 
    public void SendEmail(Message message)
    {
        var emailMessage = CreateEmailMessage(message);

        Send(emailMessage); 
    }

    // Creates Email Message
    private MimeMessage CreateEmailMessage(Message message)
    {
        var emailMessage = new MimeMessage();

        emailMessage.From.Add(new MailboxAddress(_emailConfig.From));
        emailMessage.To.AddRange(message.To);
        emailMessage.Subject = message.Subject;
        emailMessage.Body = new TextPart(MimeKit.Text.TextFormat.Text)
        {
            Text = message.Content
        }; 

        return emailMessage; 
    }

    // Sends the email
    private void Send(MimeMessage mailMessage)
    {
        using var client = new SmtpClient();
        try
        {
            client.Connect(_emailConfig.MailServer, _emailConfig.MailPort, false);
            client.Authenticate(_emailConfig.Username, _emailConfig.Password);
            client.Send(mailMessage);
        }
        catch (Exception)
        {

            throw;
        }
        finally
        {
            client.Disconnect(true);
            client.Dispose();
        }
    }
}
  

Интерфейс

 public interface IEmailSender
{
    void SendEmail(Message message); 
}
  

Если вам также нужен StartUp.cs, дайте мне знать.

Ответ №1:

У получателя будут отображаться только адрес электронной почты и displayname.

 var address = new MailboxAddress("Tonton", "tonton@example.com");
  

Вывод

введите описание изображения здесь

ОБНОВИТЕ
, если хотите добавить отображаемое имя. У вас может быть что-то вроде этого.

 public class EmailAddress
{
    public string Address { get; set; }
    public string DisplayName { get; set; }
}

public class Message
{
    public List<MailboxAddress> To { get; set; }
    public string Subject { get; set; }
    public string Content { get; set; }

    public Message(IEnumerable<EmailAddress> to, string subject, string content)
    {
         To = new List<MailboxAddress>();
   
        To.AddRange(to.Select(x => new MailboxAddress(x.DisplayName, x.Address)));                       
        Subject = subject;
        Content = content;
    }
}
  

Комментарии:

1. Как мне добавить это в To = new List<MailBoxAddress>(); список в классе Message?

2. Поскольку в вашем примере фрагмента кода нет отображаемых имен, просто сделайте: To.AddRange(to.Select(x => new MailboxAddress(string.Empty, x)));

3. Так что, если бы я захотел добавить отображаемое имя? что бы я тогда сделал? Я думаю, это та часть, в которой я запутываюсь больше всего. Спасибо!

4. @whisk вы можете проверить обновление моего ответа. Если это поможет вам добавить отображаемое имя.