Inviare messaggi di posta elettronica tramite MailKit

Data di creazione della pagina :

ambiente

.NET
  • .NET 5.0
MailKit
  • 2.11.1

dapprima

In precedenza, smtpClient, una classe per l'invio di messaggi di posta elettronica, era inclusa come standard, ma ora è obsoleta a causa di specifiche non specifiche.

Ciò significa che .NET non dispone di una libreria di mailing standard, pertanto si utilizzerà una libreria di terze parti.

Attualmente, c'è "MailKit" come libreria mainstream, quindi vorrei inviare un'e-mail usando questa volta.

Presentazione di MailKit

Avvia Visual Studio 2019 e crea un nuovo progetto di app console (.NET). Se si utilizza .NET, si avrà un po ' di libertà nel tipo di progetto, quindi ne conoscerò i dettagli.

Quando si apre il progetto, fare clic con il pulsante destro del mouse su Dipendenze da Esplora soluzioni e scegliere Gestisci pacchetti NuGet.

Fare clic sulla scheda Sfoglia e digitare MailKit nel campo di ricerca per visualizzare MailKit nell'elenco seguente.

Selezionare MailKit dall'elenco, verificare che sia selezionata l'ultima versione e quindi fare clic sul pulsante Installa.

Fare clic sul pulsante OK.

Verificare che il pacchetto contenga MailKit.

programma

Di seguito è riportato il codice minimo per l'invio di e-mail.

Definisci le informazioni necessarie per le tue e-mail nella prima metà del codice e usa tali valori per inviare posta nella seconda metà. Dovresti essere in grado di utilizzare la seconda metà del codice in modo fisso semplicemente modificando la definizione della prima metà in base alle esigenze.

using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using MimeKit.Text;

namespace MailKitSend
{
  class Program
  {
    static void Main(string[] args)
    {
      // メールの送信に必要な情報
      var smtpHostName = "[SMTP サーバー名]";
      var smtpPort = 587;                         // or 25
      var smtpAuthUser = "[認証ユーザー名]";
      var smtpAuthPassword = "[認証パスワードまたはアプリパスワード]";

      // メールの内容
      var from = "[送信者メールアドレス]";
      var to = "[送り先メールアドレス]";

      var subject = "テストメールの件名です。";
      var body = "テストメールの本文です。\n改行です。";
      var textFormat = TextFormat.Text;

      // MailKit におけるメールの情報
      var message = new MimeMessage();

      // 送り元情報  
      message.From.Add(MailboxAddress.Parse(from));

      // 宛先情報  
      message.To.Add(MailboxAddress.Parse(to));

      // 表題  
      message.Subject = subject;

      // 内容  
      var textPart = new TextPart(textFormat)
      {
        Text = body,
      };
      message.Body = textPart;

      using var client = new SmtpClient();

      // SMTPサーバに接続  
      client.Connect(smtpHostName, smtpPort, SecureSocketOptions.Auto);

      if (string.IsNullOrEmpty(smtpAuthUser) == false)
      {
        // SMTPサーバ認証  
        client.Authenticate(smtpAuthUser, smtpAuthPassword);
      }

      // 送信  
      client.Send(message);

      // 切断  
      client.Disconnect(true);
    }
  }
}

Definire le informazioni necessarie per inviare un messaggio di posta elettronica

var smtpHostName = "[SMTP サーバー名]";
var smtpPort = 587;                         // or 25
var smtpAuthUser = "[認証ユーザー名]";
var smtpAuthPassword = "[認証パスワードまたはアプリパスワード]";

È qui che si impostano valori diversi a seconda del server di posta (server SMTP) utilizzato. Vorrei spiegare alcuni dei valori che sto impostando alla fine di questo articolo, ma fondamentalmente vedere il sito del mio server di posta.

Originariamente, è scritto in appsettigs.json, ecc., ma è quindi ridondante come Suggerimenti.

Definire il contenuto di un messaggio di posta elettronica

var from = "[送信者メールアドレス]";
var to = "[送り先メールアドレス]";

var subject = "テストメールの件名です。";
var body = "テストメールの本文です。\n改行です。";
var textFormat = TextFormat.Text;

Penso che questa parte sia la parte corrispondente così com'è se normalmente usi mailer, ecc.

Poiché non è disponibile per l'invio da sotto mentite spoglie nei recenti sistemi di posta, fondamentalmente si imposta lo stesso indirizzo e-mail del proprio account di posta elettronica.

TextFormat può essere inviato in testo o HTML. Se lo invii in HTML, incorpora tag html nella parte del corpo.

Impostare le informazioni necessarie per elaborare l'invio di messaggi di posta elettronica

// MailKit におけるメールの情報
var message = new MimeMessage();

// 送り元情報  
message.From.Add(MailboxAddress.Parse(from));

// 宛先情報  
message.To.Add(MailboxAddress.Parse(to));

// 表題  
message.Subject = subject;

// 内容  
var textPart = new TextPart(textFormat)
{
   Text = body,
};
message.Body = textPart;

Fondamentalmente, è una forma di impostazione del valore definito sopra.

È inoltre possibile impostare più da e a.

Non è incluso nel campione, ma può anche includere CC e BCC. Se si desidera includerlo, aggiungerlo allo stesso modo di Da o A come segue:

message.Cc.Add(MailboxAddress.Parse(cc));
message.Bcc.Add(MailboxAddress.Parse(bcc));

È inoltre possibile modificare il nome visualizzato del mittente o della destinazione se il destinatario dell'e-mail è supportato. In tal caso, modificare il codice come segue:

message.From.Add(new MailboxAddress("送信者の名前", from));
message.To.Add(new MailboxAddress("送り先の名前", to));

Inviare messaggi di posta elettronica

using var client = new SmtpClient();

// SMTPサーバに接続  
client.Connect(smtpHostName, smtpPort, SecureSocketOptions.Auto);

if (string.IsNullOrEmpty(smtpAuthUser) == false)
{
   // SMTPサーバ認証  
   client.Authenticate(smtpAuthUser, smtpAuthPassword);
}

// 送信  
client.Send(message);

// 切断  
client.Disconnect(true);

Al termine della definizione della posta elettronica, è possibile inviarla.

SmtpClientL'invio viene eseguito in un'istanza della classe. DisposePoiché è using var la destinazione, viene dichiarata in modo che possa essere rilasciata automaticamente. Poiché si tratta di un modo di scrivere C # 8.0, passare alla using descrizione normale per le versioni precedenti.

SmtpClient.Connect al server SMTP. Alcuni server STMP richiedono connessioni SSL o TLS, ma la SecureSocketOptions.Auto specifica di solito va bene.

Se il server SMTP richiede l'autenticazione, SmtpClient.Authenticate specificare un nome utente e una password nel metodo .

Al termine della SmtpClient.Send connessione, inviare un messaggio di posta elettronica nel metodo .

Quando tutto è fatto, SmtpClient.Disconnect scollegalo con il metodo.

Si noti che tutti questi suggerimenti eseguono tutte queste operazioni come operazioni sincrone, ma ogni metodo può anche eseguire l'elaborazione asincrona sotto il nome xxxxxAsync. Utilizzare secondo necessità.

Come inviare allegati

Per inviare MimeMessage.Body un allegato, modificare il valore impostato su come segue:

// using System.IO; 必要

var filePath = @"[ローカルに保存されているファイルパス].jpg";   // 例として JPEG ファイル指定
var buffer = File.ReadAllBytes(filePath);

var builder = new BodyBuilder();

// テキストか HTML で設定するプロパティが異なる
if (textFormat == TextFormat.Plain)
{
   builder.TextBody = body;
}
else
{
   builder.HtmlBody = body;
}

// 添付ファイルを追加
builder.Attachments.Add(Path.GetFileName(filePath), buffer, new ContentType("image", "jpg"));

message.Body = builder.ToMessageBody();

Nel codice precedente, il file archiviato localmente è un allegato, ma i dati possono essere qualsiasi cosa perché deve essere solo una matrice di byte o Stream. Invio di un file JPEG come esempio.

MimeMessage.Body Valore impostato per la BodyBuilder compilazione come .

Il corpo TextPart del testo differisce da e le proprietà a cui è impostato sono diverse, sia che si tratti di testo o HTML. Si prega di notare che anche se si impostano entrambi, la prima impostazione verrà cancellata.

L'allegato BodyBuilder.Attachments viene aggiunto alla proprietà . Gli argomenti sono "nome allegato", "dati allegati" e "tipo di contenuto (MIME)".

Si noti che il nome dell'allegato potrebbe non essere identificato dalla parte ricevente a meno che non si aggiungo un'estensione.

ContentType il valore impostato su varierà a seconda del formato di file. Se cerchi su Internet intorno al "formato di file MIME", vedrai la combinazione.

BodyBuilder.ToMessageBodyInfine, chiamare il metodo e impostarlo su MimeMessage.Body .

Informazioni sulla specifica di un server SMTP

Il server SMTP per l'invio della posta ha impostazioni diverse a seconda del server di posta utilizzato. Di seguito è riportato un esempio, quindi se non esiste una cosa del genere, controlla l'aiuto del server che stai utilizzando.

Inoltre, poiché le informazioni sono ad aprile 2021, le informazioni potrebbero essere cambiate al momento.

utilizza la crittografia di verifica in
Autenticazione della porta server SMTP del servizio di posta Se sidue passaggi
Outlook.com parte 1 smtp.office365.com 587 Nome utente e password ?? STARTTLS
Outlook.com parte 2 smtp-mail.outlook.com 587 Nome utente e password Ottenere la password dell'app e impostarla sulla password STARTTLS
Gmail smtp.gmail.com 465(SSL) o 587(TLS) Nome utente e password Ottenere la password dell'app e impostarla sulla password SSL o TLS o STARTTLS
Yahoo! Mail smtp.mail.yahoo.co.jp 465 Nome utente e password ?? Tipo sconosciuto
OCN smtp.ocn.ne.jp 465 Nome utente e password ?? SSL o TLS