ส่งอีเมลโดยใช้ MailKit
สิ่งแวดล้อม
- .NET
-
- .NET 5.0
- MailKit
-
- 2.11.1
เริ่มต้นใช้งาน
ก่อนหน้านี้มาตรฐานมีคลาส "SmtpClient" สําหรับการส่งอีเมล แต่เนื่องจากข้อกําหนดที่เก่ากว่าจึงเลิกใช้แล้ว
ซึ่งช่วยให้.NET ที่จะใช้ไลบรารีของบริษัทอื่นเนื่องจากไม่มีไลบรารีการส่งข้อความมาตรฐาน
ปัจจุบัน "MailKit" เป็นห้องสมุดหลักดังนั้นเวลานี้ฉันต้องการส่งอีเมลนี้
บทนําสู่ MailKit
เริ่ม Visual Studio 2019 และสร้างโครงการโปรแกรมประยุกต์คอนโซล (.NET) ใหม่ ถ้าคุณใช้ .NET ชนิดโครงการมีอิสระในระดับหนึ่งดังนั้นฉันชอบรายละเอียดมาก
เมื่อคุณเปิดโครงการ แล้ว ให้คลิกขวาที่ การขึ้นต่อกัน จากโซลูชัน Explorer แล้วเลือก จัดการแพคเกจ NuGet
คลิกแท็บ เรียกดู แล้วป้อน "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
ตั้งค่าจะถูกสร้างเป็น
ข้อความใน TextPart
เนื้อความจะแตกต่างจากคุณสมบัติขึ้นอยู่กับข้อความหรือ HTML
โปรดทราบว่าการตั้งค่านี้จะง่ายต่อการตั้งค่านี้ก่อนแม้ว่าคุณจะตั้งค่าทั้งสองอย่าง
เพิ่มสิ่งที่แนบมา BodyBuilder.Attachments
ลงในคุณสมบัติ
พารามิเตอร์คือ ชื่อสิ่งที่แนบมา ข้อมูลสิ่งที่แนบมา และชนิดเนื้อหา (MIME)
โปรดสังเกตว่า ถ้าชื่อสิ่งที่แนบมาไม่มีส่วนขยาย ผู้รับอาจไม่รู้จัก
ContentType
ค่าที่คุณตั้งค่าขึ้นอยู่กับรูปแบบแฟ้ม
บนอินเทอร์เน็ต"รูปแบบไฟล์ MIME"ผมคิดว่าคุณสามารถเข้าใจการรวมกันของถ้าคุณค้นหารอบ
สุดท้าย BodyBuilder.ToMessageBody
เรียกวิธีการ MimeMessage.Body
และตั้งค่า
เกี่ยวกับการระบุเซิร์ฟเวอร์ SMTP
การตั้งค่าเซิร์ฟเวอร์ SMTP สําหรับการส่งข้อความจะแตกต่างกันไปตามเซิร์ฟเวอร์จดหมาย ดูวิธีใช้เซิร์ฟเวอร์ถ้าไม่ใช่ เนื่องจากตัวอย่างต่อไปนี้
นอกจากนี้ เนื่องจากข้อมูลณ เดือนเมษายน 2021 ข้อมูลอาจมีการเปลี่ยนแปลงได้ตลอดเวลา
ขั้นตอนบริการจดหมาย | SMTP เซิร์ฟเวอร์ | พอร์ต | การรับรองความถูกต้องถ้าคุณใช้การเข้ารหัสลับการตรวจสอบแบบ 2 | ||
---|---|---|---|---|---|
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 |
Yahoo! อีเมล | smtp.mail.yahoo.co.jp | 465 | ชื่อผู้ใช้และรหัสผ่าน | ?? | ชนิดที่ไม่รู้จัก |
OCN | smtp.ocn.ne.jp | 465 | ชื่อผู้ใช้และรหัสผ่าน | ?? | SSL or TLS |