Come inviare messaggi di posta elettronica in ASP.NET Core

Avrai spesso la necessità di inviare email tramite la tua applicazione. È possibile sfruttare il pacchetto NuGet di MailKit per inviare messaggi di posta elettronica in ASP.NET Core. MailKit è una libreria client di posta open source che può essere utilizzata in applicazioni .NET o .NET Core in esecuzione su sistemi Windows, Linux o Mac. Questo articolo presenta una discussione su come possiamo usare il pacchetto NuGet di MailKit per inviare messaggi di posta elettronica in ASP.NET Core.

Per lavorare con gli esempi di codice forniti in questo articolo, dovresti avere Visual Studio 2019 installato nel tuo sistema. Se non hai già una copia, puoi scaricare Visual Studio 2019 qui. 

Crea un progetto API ASP.NET Core

Prima di tutto, creiamo un progetto ASP.NET Core in Visual Studio. Supponendo che Visual Studio 2019 sia installato nel sistema, seguire i passaggi descritti di seguito per creare un nuovo progetto ASP.NET Core in Visual Studio.

  1. Avvia l'IDE di Visual Studio.
  2. Fai clic su "Crea nuovo progetto".
  3. Nella finestra "Crea nuovo progetto", seleziona "Applicazione Web ASP.NET Core" dall'elenco dei modelli visualizzati.
  4. Fare clic su Avanti.
  5. Nella finestra "Configura il tuo nuovo progetto" mostrata di seguito, specifica il nome e la posizione per il nuovo progetto.
  6. Fare clic su Crea.
  7. Nella finestra "Crea nuova applicazione Web ASP.Net Core", seleziona .NET Core come runtime e ASP.NET Core 2.2 (o successivo) dall'elenco a discesa in alto. Userò ASP.NET Core 3.0 qui.
  8. Seleziona "API" come modello di progetto per creare una nuova applicazione API ASP.NET Core. 
  9. Assicurati che le caselle di controllo "Abilita supporto Docker" e "Configura per HTTPS" siano deselezionate poiché non utilizzeremo queste funzionalità qui.
  10. Assicurati che l'autenticazione sia impostata su "Nessuna autenticazione" poiché non utilizzeremo nemmeno l'autenticazione.
  11. Fare clic su Crea. 

Questo creerà un nuovo progetto API ASP.NET Core in Visual Studio. Selezionare la cartella della soluzione Controller nella finestra Esplora soluzioni e fare clic su "Aggiungi -> Controller ..." per creare un nuovo controller denominato DefaultController. Useremo questo progetto nelle sezioni successive di questo articolo.

Installa il pacchetto MailKit NuGet

Per lavorare con MailKit, è necessario installare il pacchetto MailKit da NuGet. Puoi farlo tramite il gestore di pacchetti NuGet all'interno dell'IDE di Visual Studio 2019 o eseguendo il comando seguente nella console del gestore di pacchetti NuGet:

Pacchetto di installazione NETCore.MailKit

Sarà inoltre necessario aggiungere riferimenti ai seguenti spazi dei nomi nel codice:

utilizzando MailKit.Net.Smtp;

utilizzando MimeKit;

Specificare i metadati di configurazione della posta elettronica in ASP.NET Core

Il frammento di codice seguente mostra come specificare i dettagli di configurazione della posta elettronica nel file appsettings.json.

"NotificationMetadata": {

    "Sender": "[email protected]",

    "SmtpServer": "smtp.gmail.com",

    "Reciever": "[email protected]",

    "Porta": 465,

    "Nome utente": "[email protected]",

    "Password": "specifica la tua password qui"

  }

Per leggere i dati di configurazione dell'email, utilizzeremo la seguente classe.

public class NotificationMetadata

    {

        stringa pubblica Mittente {get; impostato; }

        stringa pubblica Ricevitore {get; impostato; }

        stringa pubblica SmtpServer {get; impostato; }

        public int Porta {get; impostato; }

        stringa pubblica UserName {get; impostato; }

        stringa pubblica Password {get; impostato; }

    }

Ecco come leggere i dati di configurazione della posta elettronica dal file appsettings.json in un'istanza della classe NotificationMetadata.

public void ConfigureServices (servizi IServiceCollection)

{

     var notificationMetadata =

     Configuration.GetSection ("NotificationMetadata").

     Ottenere();

     services.AddSingleton (notificationMetadata);

     services.AddControllers ();

}

Crea un'istanza della classe EmailMessage in ASP.NET Core

Crea una nuova classe denominata EmailMessage con il codice seguente:

classe pubblica EmailMessage

    {

        public MailboxAddress Sender {get; impostato; }

        public MailboxAddress Reciever {get; impostato; }

        stringa pubblica Oggetto {get; impostato; }

        public string Content {get; impostato; }

    }

Crea un'istanza della classe MimeMessage in ASP.NET Core

Il metodo seguente illustra come creare un'istanza MimeMessage da un'istanza della nostra classe personalizzata EmailMessage.

MimeMessage privato CreateMimeMessageFromEmailMessage (messaggio EmailMessage)

{

     var mimeMessage = new MimeMessage ();

     mimeMessage.From.Add (message.Sender);

     mimeMessage.To.Add (message.Reciever);

     mimeMessage.Subject = message.Subject;

     mimeMessage.Body = new TextPart (MimeKit.Text.TextFormat.Text)

     {Text = message.Content};

     return mimeMessage;

}

Invia messaggi di posta elettronica in modo sincrono utilizzando MailKit in ASP.NET Core

Per inviare un'e-mail, dobbiamo sfruttare la classe SmtpClient relativa allo spazio dei nomi MailKit.Net.Smtp. Il frammento di codice seguente illustra come eseguire questa operazione.

utilizzando (SmtpClient smtpClient = new SmtpClient ())

{

  smtpClient.Connect (_notificationMetadata.SmtpServer,

  _notificationMetadata.Port, true);

  smtpClient.Authenticate (_notificationMetadata.UserName,

  _notificationMetadata.Password);

  smtpClient.Send (mimeMessage);

  smtpClient.Disconnect (true);

}

Ecco il codice completo del metodo di azione Get della nostra classe DefaultController per comodità.

stringa pubblica Get ()

{

EmailMessage message = nuovo EmailMessage ();

message.Sender = new MailboxAddress ("Self", _notificationMetadata.Sender);

message.Reciever = new MailboxAddress ("Self", _notificationMetadata.Reciever);

message.Subject = "Benvenuto";

message.Content = "Hello World!";

var mimeMessage = CreateEmailMessage (messaggio);

utilizzando (SmtpClient smtpClient = new SmtpClient ())

 {

    smtpClient.Connect (_notificationMetadata.SmtpServer,

    _notificationMetadata.Port, true);

    smtpClient.Authenticate (_notificationMetadata.UserName,

    _notificationMetadata.Password);

    smtpClient.Send (mimeMessage);

    smtpClient.Disconnect (true);

  }

 restituire "Email inviata con successo";

}

Invia messaggi di posta elettronica in modo asincrono utilizzando MailKit in ASP.NET Core

Il seguente frammento di codice illustra una versione asincrona del codice che abbiamo appena scritto per inviare email in modo sincrono.

utilizzando (SmtpClient smtpClient = new SmtpClient ())

 {

      attendi smtpClient.ConnectAsync (_notificationMetadata.SmtpServer,

      _notificationMetadata.Port, true);

      attendono smtpClient.AuthenticateAsync (_notificationMetadata.UserName,

      _notificationMetadata.Password);

      attendi smtpClient.SendAsync (mimeMessage);

      attendi smtpClient.DisconnectAsync (true);

 }

Infine, tieni presente che MailKit ti consente anche di inviare e-mail utilizzando modelli e persino e-mail con allegati. Dimostrerò le funzionalità aggiuntive di MailKit in un prossimo articolo qui.