ส่งอีเมลโดยใช้ 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