使用 MailKit 傳送電子郵件

頁面創建日期 :

環境

.NET
  • .NET 5.0
MailKit
  • 2.11.1

入門

以前,標準包含用於發送電子郵件的"SmtpClient"類,但由於規範較舊,現在已棄用。

這允許 .NET 使用第三方庫,因為它沒有標準的郵件發送庫。

目前,"MailKit"是主流庫,所以這次我想用這個來發送電子郵件。

MailKit 簡介

啟動 Visual Studio 2019 並創建新的控制台應用 (.NET) 專案。 如果您使用 .NET,則項目類型在某種程度上是自由的,因此我非常喜歡細節。

打開專案後,從解決方案資源管理器右鍵單擊"依賴項",然後選擇"管理 NuGet 包"。

按下「瀏覽」選項卡,然後在搜索欄位中輸入「MailKit」,MailKit 顯示在下面的清單中。

從清單中選擇 MailKit,確保已選擇最新版本,然後單擊「安裝」按鈕。

按下「確定」 按鈕。

確保包包含 MailKit。

程式

以下是傳送電子郵件的最低代碼:

在代碼的前半部分定義電子郵件所需的資訊,在代碼的後面部分,使用這些值發送電子郵件。 您只需根據需要更改前面的定義,即可以典型方式使用後面的代碼。

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

定義發送電子郵件所需的資訊

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

根據使用的郵件伺服器(SMTP 伺服器),設置的值會有所不同。 在本文中末尾,我們將討論一些要設置的值,但基本上請參閱我們使用的郵件伺服器網站。

我最初在 appsettigs.json 中編寫它,但我喜歡它,因為它會變得冗餘為提示。

定義電子郵件的內容

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

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

我認為,這部分是相應的部分,因為它是,如果你通常使用郵件程式等。

由於您無法在現代郵件系統中類比寄件者,因此您基本上將設置與電子郵件帳戶相同的電子郵寄地址。

TextFormat 以文字或 HTML 格式發送。 如果以 HTML 格式傳送,請填充正文部份,如 HTML 標記。

設置郵件發送過程所需的資訊

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

基本上,它設置上面定義的值。

您還可以設置多個"寄件者"和"收件者"。

它不包括在示例中,但也可以包含 CC 或密件抄送。 添加方式與「寄件者」或「收件者」相同,如下所示:

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

如果收件者支援電子郵件,還可以更改發件者或收件者的顯示名稱。 在這種情況下,請更改代碼,如下所示:

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

發送電子郵件

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

完成與郵件相關的定義後,執行發送過程。

提交 SmtpClient 在類的實例上完成。 Dispose 因此 using var ,我們聲明它,以便它可以自動釋放。 由於 C# 8.0 是一種編寫方法,因此,對於早期版本, using 請重寫它。

SmtpClient.Connect 方法連接到 SMTP 伺服器。 某些 STMP 伺服器需要 SSL 或 TLS 連接,但在大多數情況下,如果指定, SecureSocketOptions.Auto 則沒有問題。

如果 SMTP 伺服器需要身份驗證 SmtpClient.Authenticate ,請使用方法指定使用者名和密碼。

連接完成後 SmtpClient.Send ,使用 方法發送電子郵件。

完成所有操作後, SmtpClient.Disconnect 使用方法斷開連接。

請注意,所有這些操作都作為同步處理在 Tips 中執行,但每個方法都允許異步處理,名稱為 xxxxxxAsync。 如有必要,請使用。

如何發送附件

要送出附件, MimeMessage.Body 請將設定為的值變更為:

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

上面的代碼將本地存儲的檔作為附件,但數據可以由位元組或流組成。 例如,發送 JPEG 檔。

MimeMessage.Body 要設定為的值 BodyBuilder 將建構為 。

Body 中 TextPart 的文字與不同,其屬性取決於文本或 HTML。 請注意,即使同時設置兩者,首先設置此設置也更容易。

將附件 BodyBuilder.Attachments 添加到屬性。 參數為「附件名稱」、「附件數據」和「內容類型 」(MIME)」。

請注意,如果「附件名稱」未包含副檔名,則接收方可能無法識別它。

ContentType 設定的值取決於檔案格式。 在互聯網上,"檔案格式MIME",我認為你可以理解的組合,如果你搜索周圍。

最後 BodyBuilder.ToMessageBody ,調用 該方法 MimeMessage.Body ,並設置 它。

關於指定 SMTP 伺服器

用於發送郵件的 SMTP 伺服器設置因郵件伺服器而異。 由於以下示例,因此,如果沒有適用,請參閱伺服器説明。

此外,由於資訊截至 2021 年 4 月,因此資訊可能隨時更改。

郵件服務SMTP伺服器連接埠身份驗證 如果使用兩步驗證加密
Outlook.com 第1部分 smtp.office365.com 587 使用者名稱和密碼 ?? STARTTLS
Outlook.com 第2部分 smtp-mail.outlook.com 587 使用者名稱和密碼 獲取應用密碼並將其設置為密碼 STARTTLS
Gmail smtp.gmail.com 465(SSL) or 587(TLS) 使用者名稱和密碼 獲取應用密碼並將其設置為密碼 SSL or TLS or STARTTLS
雅虎郵件 smtp.mail.yahoo.co.jp 465 使用者名稱和密碼 ?? 未知類型
OCN smtp.ocn.ne.jp 465 使用者名稱和密碼 ?? SSL or TLS