Wysyłanie wiadomości e-mail przy użyciu zestawu MailKit

Data utworzenia strony :

środowisko

.NET (NET)
  • .NET 5,0
Zestaw mailkit
  • 2.11.1

Na początku

Wcześniej smtpClient, klasa do wysyłania wiadomości e-mail, została uwzględniona w standardzie, ale jest teraz przestarzała ze względu na brak specyfikacji.

Oznacza to, że .NET nie ma standardowej biblioteki mailingowej, więc będzie używana biblioteka innej firmy.

Obecnie istnieje "MailKit" jako biblioteka głównego nurtu, więc chciałbym wysłać e-mail za pomocą tego czasu.

Wprowadzenie MailKit

Uruchom program Visual Studio 2019 i utwórz nowy projekt aplikacji konsoli (.NET). Jeśli używasz .NET, będziesz miał trochę swobody w typie projektu, więc będę fore-znać szczegóły.

Po otwarciu projektu kliknij prawym przyciskiem myszy zależności z Eksploratora rozwiązań i wybierz pozycję Zarządzaj pakietami NuGet.

Kliknij kartę Przeglądaj i wpisz mailkit w polu wyszukiwania, aby wyświetlić zestaw MailKit na poniższej liście.

Wybierz pozycję MailKit z listy, sprawdź, czy jest wybrana najnowsza wersja, a następnie kliknij przycisk Zainstaluj.

Kliknij przycisk OK.

Sprawdź, czy pakiet zawiera Zestaw MailKit.

program

Poniżej znajduje się minimalny kod do wysyłania wiadomości e-mail.

Definiujesz informacje potrzebne do obsługi wiadomości e-mail w pierwszej połowie kodu i używasz tych wartości do wysyłania poczty w drugiej połowie. Powinieneś być w stanie korzystać z drugiej połowy kodu w stały sposób, po prostu zmieniając definicję pierwszej połowy w razie potrzeby.

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);
    }
  }
}

Definiowanie informacji potrzebnych do wysłania wiadomości e-mail

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

W tym miejscu ustawia się różne wartości w zależności od używanego serwera poczty (serwera SMTP). Chciałbym wyjaśnić kilka wartości, które ustawiam na końcu tego artykułu, ale w zasadzie zobacz witrynę mojego serwera pocztowego.

Pierwotnie jest napisany w appsettigs.json, itp., ale jest forethough staje się zbędne jako Porady.

Definiowanie zawartości wiadomości e-mail

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

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

Myślę, że ta część jest odpowiednia część jak to jest, jeśli normalnie używać listonoszy itp.

Ponieważ nie jest dostępny do wysyłania w przebraniu w ostatnich systemach pocztowych, w zasadzie ustawisz ten sam adres e-mail co twoje konto e-mail.

TextFormat mogą być wysyłane w tekście lub html. Jeśli wyślesz go w formacie HTML, osadź tagi html w części treści.

Konfigurowanie informacji potrzebnych do przetwarzania wysyłania wiadomości e-mail

// 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;

Zasadniczo jest to forma ustawienia wartości zdefiniowanej powyżej.

Można również ustawić wiele od i do.

Nie jest uwzględniony w próbce, ale może również zawierać CC i BCC. Jeśli chcesz go dołączyć, dodaj go w taki sam sposób, jak od lub do w następujący sposób:

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

Możesz również zmienić nazwę wyświetlaną nadawcy lub miejsca docelowego, jeśli adresat wiadomości e-mail jest obsługiwany. W takim przypadku zmień kod w następujący sposób:

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

Wyślij wiadomość e-mail

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);

Po zakończeniu definiowania wiadomości e-mail, skończysz ją wysyłać.

Przesyłanie odbywa SmtpClient się w wystąpieniu klasy. Dispose Ponieważ jest to using var cel, jest zadeklarowany w taki sposób, że może być zwolniony automatycznie. Ponieważ jest to sposób pisania języka C# 8.0, należy zmienić using normalny opis dla wcześniejszych wersji.

SmtpClient.Connect do serwera SMTP. Niektóre serwery STMP wymagają połączeń SSL lub TLS, ale SecureSocketOptions.Auto określenie jest zwykle w porządku.

Jeśli serwer SMTP wymaga uwierzytelniania, SmtpClient.Authenticate określ nazwę użytkownika i hasło w metodzie.

Po zakończeniu połączenia SmtpClient.Send wyślij wiadomość e-mail w metodzie.

Gdy wszystko zostanie zrobione, SmtpClient.Disconnect odłącz go od metody.

Należy zauważyć, że wszystkie te porady wykonują te operacje jako operacje synchroniczne, ale każda metoda może również wykonywać przetwarzanie asynchroniczne pod nazwą xxxxxAsync. Użyj w razie potrzeby.

Jak wysyłać załączniki

Aby wysłać MimeMessage.Body załącznik, zmień ustawioną wartość na następującą:

// 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();

W powyższym kodzie plik przechowywany lokalnie jest załącznikiem, ale dane mogą być wszystkim, ponieważ musi to być tylko tablica bajtów lub Strumień. Wysyłanie pliku JPEG jako przykład.

MimeMessage.Body Wartość ustawiona na BodyBuilder kompilację jako .

Tekst podstawowy TextPart różni się od tekstu , a właściwości, do których jest ustawiony, różnią się, czy to tekst, czy html. Należy pamiętać, że nawet jeśli ustawisz oba, pierwsze ustawienie zostanie wymazane.

Załącznik zostanie BodyBuilder.Attachments dodany do właściwości. Argumenty to "nazwa załącznika", "dane załączników" i "typ zawartości (MIME)".

Należy zauważyć, że nazwa załącznika może nie być identyfikowana przez stronę odbierającą, chyba że dodasz rozszerzenie.

ContentType ustawiona wartość będzie się różnić w zależności od formatu pliku. Jeśli szukasz w Internecie wokół "format pliku MIME", będzie można zobaczyć kombinację.

BodyBuilder.ToMessageBodyNa koniec wywołaj metodę i ustaw ją na MimeMessage.Body .

Określanie serwera SMTP — informacje

Serwer SMTP do wysyłania poczty ma różne ustawienia w zależności od używanego serwera poczty. Oto przykład, więc jeśli nie ma czegoś takiego, sprawdź pomoc serwera, którego używasz.

Ponadto, ponieważ informacje te są dostępne od kwietnia 2021 r., informacje te mogły ulec zmianie w chwili obecnej.

usługi poczty szyfrowania
Uwierzytelnianie portu serwera SMTP Jeśli używaszweryfikacji dwuetapowej
Outlook.com część 1 smtp.office365.com 587 Nazwa użytkownika i hasło ?? STARTTLS
Outlook.com część 2 smtp-mail.outlook.com 587 Nazwa użytkownika i hasło Pobierz hasło aplikacji i ustaw hasło STARTTLS
Gmail smtp.gmail.com 465(SSL) lub 587(TLS) Nazwa użytkownika i hasło Pobierz hasło aplikacji i ustaw hasło SSL lub TLS lub STARTTLS
Poczta Yahoo! smtp.mail.yahoo.co.jp 465 Nazwa użytkownika i hasło ?? Nieznany typ
ZOC smtp.ocn.ne.jp 465 Nazwa użytkownika i hasło ?? SSL lub TLS