使用 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 |