Mengirim email menggunakan MailKit

Tanggal pembuatan halaman :

lingkungan

.NET
  • .NET 5.0
MailKit
  • 2.11.1

Pada awalnya

Sebelumnya, smtpClient, kelas untuk mengirim email, disertakan sebagai standar, tetapi sekarang tidak digunakan lagi karena spesifikasi yang tidak sesuai.

Ini berarti bahwa .NET tidak memiliki pustaka surat standar, sehingga Anda akan menggunakan pustaka pihak ketiga.

Saat ini, ada "MailKit" sebagai perpustakaan mainstream, jadi saya ingin mengirim email menggunakan waktu ini.

Memperkenalkan MailKit

Luncurkan Visual Studio 2019 dan buat project aplikasi konsol (.NET) baru. Jika Anda menggunakan .NET, Anda akan memiliki beberapa kebebasan dalam jenis proyek, jadi saya akan mengetahui detailnya.

Saat Anda membuka proyek, klik kanan Dependensi dari Solution Explorer dan pilih Kelola Paket NuGet.

Klik tab Telusuri dan ketik MailKit di bidang pencarian untuk menampilkan MailKit dalam daftar di bawah ini.

Pilih MailKit dari daftar, verifikasi bahwa versi terbaru dipilih, lalu klik tombol Instal.

Klik tombol OK.

Pastikan bahwa paket tersebut memuat MailKit.

rencana

Berikut ini adalah kode minimum untuk mengirim email.

Anda menentukan informasi yang Anda butuhkan untuk email Anda pada paruh pertama kode Anda, dan gunakan nilai tersebut untuk mengirim email di paruh kedua. Anda harus dapat menggunakan paruh kedua kode dengan cara tetap hanya dengan mengubah definisi paruh pertama sesuai kebutuhan.

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

Tentukan informasi yang diperlukan untuk mengirim email

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

Di sinilah Anda mengatur nilai yang berbeda tergantung pada server email (server SMTP) mana yang Anda gunakan. Saya ingin menjelaskan beberapa nilai yang saya atur di akhir artikel ini, tetapi pada dasarnya melihat situs server email saya.

Awalnya, itu ditulis dalam appsettigs.json, dll., tetapi di luar biasa menjadi berlebihan sebagai Tips.

Menentukan konten email

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

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

Saya berpikir bahwa bagian ini adalah bagian yang sesuai seperti jika Anda biasanya menggunakan mailer dll.

Karena tidak tersedia untuk dikirim dari penyamaran dalam sistem email terbaru, pada dasarnya Anda akan menetapkan alamat email yang sama dengan akun email Anda.

TextFormat dapat dikirim dalam teks atau HTML. Jika Anda mengirimkannya dalam HTML, sematkan tag html di bagian tubuh.

Menyiapkan informasi yang diperlukan untuk memproses pengiriman email

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

Pada dasarnya, ini adalah bentuk pengaturan nilai yang ditentukan di atas.

Anda juga dapat mengatur beberapa Dari dan Ke.

Ini tidak termasuk dalam sampel, tetapi juga dapat mencakup CC dan BCC. Jika Anda ingin menyertakannya, tambahkan dengan cara yang sama seperti Dari atau Kepada sebagai berikut:

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

Anda juga dapat mengubah nama tampilan pengirim atau tujuan jika penerima email didukung. Dalam hal ini, ubah kode sebagai berikut:

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

Mengirim email

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

Setelah selesai menentukan email, Anda sudah selesai mengirimnya.

Pengiriman SmtpClient dilakukan dalam contoh kelas. Dispose Karena using var memang targetnya, maka dinyatakan masuk sehingga bisa dirilis secara otomatis. Karena ini adalah cara menulis C # 8.0, silakan ubah ke deskripsi using normal untuk versi yang lebih lama.

SmtpClient.Connect ke server SMTP. Beberapa server STMP memerlukan koneksi SSL atau TLS, tetapi menentukan SecureSocketOptions.Auto biasanya baik-baik saja.

Jika server SMTP memerlukan autentikasi, SmtpClient.Authenticate tentukan nama pengguna dan kata sandi dalam metode.

Ketika koneksi SmtpClient.Send selesai, kirim email dalam metode.

Ketika semuanya selesai, SmtpClient.Disconnect putuskan dengan metode.

Perhatikan bahwa tips ini semua melakukan operasi ini sebagai operasi sinkron, tetapi setiap metode juga dapat melakukan pemrosesan asinkron dengan nama xxxxxAsync. Gunakan sesuai kebutuhan.

Cara mengirim lampiran

Untuk mengirim MimeMessage.Body lampiran, ubah nilai yang ditetapkan sebagai berikut:

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

Dalam kode di atas, file yang disimpan secara lokal adalah lampiran, tetapi data dapat apa saja karena hanya harus array byte atau Stream. Mengirim file JPEG sebagai contoh.

MimeMessage.Body Nilai yang Anda tetapkan BodyBuilder untuk dibangun sebagai .

Isi TextPart teks berbeda dari , dan properti yang disetel berbeda, baik teks atau HTML. Harap dicatat bahwa meskipun Anda mengatur keduanya, pengaturan pertama akan dihapus.

Lampiran BodyBuilder.Attachments ditambahkan ke properti. Argumennya adalah "nama lampiran", "data lampiran", dan "tipe konten (MIME)".

Perhatikan bahwa nama lampiran tidak dapat diidentifikasi oleh pihak penerima kecuali Anda menambahkan ekstensi.

ContentType nilai yang Anda tetapkan akan bervariasi tergantung pada format file. Jika Anda mencari di Internet di sekitar "format file MIME", Anda akan dapat melihat kombinasinya.

BodyBuilder.ToMessageBodyAkhirnya, panggil metode dan atur ke MimeMessage.Body .

Tentang menentukan server SMTP

Server SMTP untuk mengirim email memiliki pengaturan yang berbeda tergantung pada server email yang Anda gunakan. Berikut ini adalah contoh, jadi jika tidak ada hal seperti itu, silakan periksa bantuan server yang Anda gunakan.

Selain itu, karena informasinya per April 2021, informasi tersebut mungkin telah berubah saat ini.

Anda menggunakan
Autentikasi port server SMTP layanan email Jikaenkripsi verifikasi dua langkah
Outlook.com Bagian 1 smtp.office365.com 587 Nama pengguna dan kata sandi ?? STARTTLS
Outlook.com Bagian 2 smtp-mail.outlook.com 587 Nama pengguna dan kata sandi Dapatkan kata sandi aplikasi dan atur ke kata sandi STARTTLS
Gmail smtp.gmail.com 465 (SSL) atau 587 (TLS) Nama pengguna dan kata sandi Dapatkan kata sandi aplikasi dan atur ke kata sandi SSL atau TLS atau STARTTLS
Yahoo! Surat smtp.mail.yahoo.co.jp 465 Nama pengguna dan kata sandi ?? Tipe tidak diketahui
OCN smtp.ocn.ne.jp 465 Nama pengguna dan kata sandi ?? SSL atau TLS