Hantar e-mel menggunakan MailKit

Tarikh penciptaan halaman :

Persekitaran

.NET
  • .BERSIH 5.0
MailKit
  • 2.11.1

Pada mulanya

Sebelum ini, smtpClient, kelas untuk menghantar e-mel, dimasukkan sebagai standard, tetapi kini diluaskan kerana luar spesifikasi.

Ini bermakna bahawa .NET tidak mempunyai pustaka mel standard, jadi anda akan menggunakan pustaka pihak ketiga.

Pada masa ini, terdapat "MailKit" sebagai perpustakaan arus perdana, jadi saya ingin menghantar e-mel menggunakan masa ini.

Memperkenalkan MailKit

Lancarkan Visual Studio 2019 dan cipta projek aplikasi konsol (.NET) baharu. Jika anda menggunakan .NET, anda akan mempunyai beberapa kebebasan dalam jenis projek, jadi saya akan tahu butirannya.

Apabila anda membuka projek, klik kanan Kebergantungan daripada Solution Explorer dan pilih Uruskan Pakej NuGet.

Klik tab Layari dan taip MailKit dalam medan carian untuk memaparkan MailKit dalam senarai di bawah.

Pilih MailKit daripada senarai, sahkan bahawa versi terkini dipilih, dan kemudian klik butang Pasang.

Klik butang OK.

Sahkan bahawa pakej mengandungi MailKit.

Program

Berikut adalah kod minimum untuk menghantar e-mel.

Anda menentukan maklumat yang anda perlukan untuk e-mel anda pada separuh pertama kod anda, dan gunakan nilai tersebut untuk menghantar mel pada separuh kedua. Anda sepatutnya boleh menggunakan separuh kedua kod dengan cara yang tetap dengan hanya mengubah definisi separuh pertama mengikut keperluan.

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 maklumat yang diperlukan untuk menghantar e-mel

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

Di sinilah anda menetapkan nilai yang berbeza bergantung pada pelayan mel (pelayan SMTP) yang anda gunakan. Saya ingin menjelaskan beberapa nilai yang saya tetapkan pada akhir artikel ini, tetapi pada dasarnya melihat tapak pelayan mel saya.

Pada asalnya, ia ditulis dalam appsettigs.json, dan lain-lain, tetapi ia adalah forethough ia menjadi berlebihan sebagai Tips.

Tentukan kandungan e-mel

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

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

Saya fikir bahagian ini adalah bahagian yang sepadan kerana jika anda biasanya menggunakan mailer dan lain-lain.

Oleh kerana ia tidak tersedia untuk dihantar daripada menyamar dalam sistem mel baru-baru ini, pada dasarnya anda akan menetapkan alamat e-mel yang sama seperti akaun e-mel anda.

TextFormat boleh dihantar dalam teks atau HTML. Jika anda menghantarnya dalam HTML, benamkan tag html di bahagian badan.

Sediakan maklumat yang diperlukan untuk memproses menghantar e-mel

// 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 asasnya, ia adalah satu bentuk menetapkan nilai yang ditakrifkan di atas.

Anda juga boleh menetapkan berbilang Daripada dan Kepada.

Ia tidak termasuk dalam sampel, tetapi ia juga boleh termasuk CC dan BCC. Jika anda ingin menyertakannya, tambahkannya dengan cara yang sama seperti Daripada atau Kepada seperti berikut:

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

Anda juga boleh menukar nama paparan pengirim atau destinasi jika penerima e-mel disokong. Dalam kes itu, tukar kod seperti berikut:

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

Hantar e-mel

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

Apabila anda selesai mentakrifkan e-mel anda, anda selesai menghantarnya.

Penyerahan dilakukan dalam SmtpClient contoh kelas. Dispose Kerana using var ia adalah sasaran, ia diisytiharkan supaya ia boleh dikeluarkan secara automatik. Oleh kerana ia adalah cara menulis C# 8.0, sila tukar kepada using penerangan biasa untuk versi terdahulu.

SmtpClient.Connect kaedah ke pelayan SMTP. Sesetengah pelayan STMP memerlukan sambungan SSL atau TLS, tetapi SecureSocketOptions.Auto menentukan biasanya baik-baik saja.

Jika pelayan SMTP memerlukan pengesahan, SmtpClient.Authenticate tentukan nama pengguna dan kata laluan dalam kaedah.

Apabila sambungan SmtpClient.Send selesai, hantar e-mel dalam kaedah.

Apabila semuanya SmtpClient.Disconnect selesai, putuskan sambungan dengan kaedah.

Perhatikan bahawa petua ini semua melaksanakan operasi ini sebagai operasi segerak, tetapi setiap kaedah juga boleh melakukan pemprosesan asynchronous di bawah nama xxxxxAsync. Gunakan mengikut keperluan.

Cara menghantar lampiran

Untuk menghantar MimeMessage.Body lampiran, tukar nilai yang ditetapkan seperti 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 kod di atas, fail yang disimpan secara tempatan adalah lampiran, tetapi data boleh menjadi apa-apa kerana ia hanya perlu menjadi pelbagai bait atau Strim. Menghantar fail JPEG sebagai contoh.

MimeMessage.Body Nilai yang anda tetapkan BodyBuilder untuk membina sebagai .

Teks badan TextPart berbeza daripada , dan sifat-sifat yang ditetapkan adalah berbeza, sama ada teks atau HTML. Sila ambil perhatian bahawa walaupun anda menetapkan kedua-duanya, tetapan pertama akan dipadamkan.

Lampiran BodyBuilder.Attachments ditambah ke tempat penginapan ini. Hujah adalah "nama lampiran", "data lampiran", dan "jenis kandungan (MIME)".

Perhatikan bahawa nama lampiran mungkin tidak dikenal pasti oleh pihak penerima melainkan anda menambah sambungan.

ContentType nilai yang anda tetapkan akan berbeza-beza bergantung pada format fail. Jika anda mencari di Internet di sekitar "format fail MIME", anda akan dapat melihat gabungan itu.

BodyBuilder.ToMessageBodyAkhirnya, panggil kaedah dan tetapkan kepada MimeMessage.Body .

Perigi menentukan pelayan SMTP

Pelayan SMTP untuk menghantar mel mempunyai seting yang berbeza bergantung pada pelayan mel yang anda gunakan. Berikut adalah contoh, jadi jika tidak ada perkara sedemikian, sila semak bantuan pelayan yang anda gunakan.

Di samping itu, kerana maklumat adalah setakat April 2021, maklumat mungkin telah berubah pada masa ini.

pengesahan dua
Pengesahan port pelayan SMTP perkhidmatan mel Jika anda menggunakan penyulitanlangkah
Outlook.com Bahagian 1 smtp.office365.com 587 Nama pengguna dan kata laluan ?? STARTTLS
Outlook.com Bahagian 2 smtp-mail.outlook.com 587 Nama pengguna dan kata laluan Dapatkan kata laluan apl dan tetapkannya ke kata laluan STARTTLS
Gmail smtp.gmail.com 465(SSL) atau 587(TLS) Nama pengguna dan kata laluan Dapatkan kata laluan apl dan tetapkannya ke kata laluan SSL atau TLS atau STARTTLS
Yahoo! Mail smtp.mail.yahoo.co.jp 465 Nama pengguna dan kata laluan ?? Jenis tidak diketahui
OCN smtp.ocn.ne.jp 465 Nama pengguna dan kata laluan ?? SSL atau TLS