Siųsti el. laiškus naudojant MailKit

Puslapio sukūrimo data :

Aplinkos

.NET
  • .NET 5,0
MailKit
  • 2.11.1

Iš pradžių

Anksčiau smtpClient, el. laiškų siuntimo klasė, buvo įtraukta kaip standartinė, tačiau dabar yra pasenusi dėl specifikacijų.

Tai reiškia, kad .NET neturi standartinės adresų bibliotekos, todėl naudosite trečiosios šalies biblioteką.

Šiuo metu yra "MailKit" kaip pagrindinės bibliotekos, todėl norėčiau siųsti laišką naudojant šį kartą.

Pristatome MailKit

Paleiskite "Visual Studio 2019" ir sukurkite naują konsolės programos (.NET) projektą. Jei naudojate .NET, projekto tipe turėsite šiek tiek laisvės, todėl iš anksto žinosiu išsamią informaciją.

Atidarę projektą dešiniuoju pelės mygtuku spustelėkite priklausomybes iš sprendimų naršyklės ir pasirinkite Tvarkyti NuGet paketus.

Spustelėkite skirtuką Naršyti ir ieškos lauke įveskite MailKit, kad žemiau esančiame sąraše būtų rodomas MailKit.

Sąraše pasirinkite MailKit, patikrinkite, ar pasirinkta naujausia versija, tada spustelėkite mygtuką Diegti.

Spustelėkite mygtuką Gerai (OK).

Patikrinkite, ar pakete yra MailKit.

programa

Toliau pateikiamas minimalus el. laiškų siuntimo kodas.

Pirmoje kodo pusėje nustatote informaciją, kurios reikia el. laiškams, ir naudojate šias reikšmes laiškams siųsti antroje pusėje. Antrąją kodo pusę turėtumėte naudoti fiksuotu būdu, jei reikia, tiesiog pakeisdami pirmosios pusės apibrėžimą.

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

Informacijos, reikalingos el. laiškui siųsti, apibrėžimas

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

Čia galite nustatyti skirtingas reikšmes, priklausomai nuo to, kurį pašto serverį (SMTP serverį) naudojate. Norėčiau paaiškinti keletą reikšmių, kurias nustatau šio straipsnio pabaigoje, bet iš esmės pamatyti mano pašto serverio svetainę.

Iš pradžių jis parašytas appsettigs.json ir tt, tačiau jis tampa nereikalingas kaip patarimai.

El. laiško turinio apibrėžimas

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

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

Manau, kad ši dalis yra atitinkama dalis, nes ji yra, jei paprastai naudojate mailers ir tt

Kadangi ji negali siųsti iš užmaskuoti neseniai pašto sistemas, iš esmės jums bus nustatyti tą patį elektroninio pašto adresą, kaip savo elektroninio pašto adresą.

TextFormat gali būti siunčiami tekstu arba HTML formatu. Jei siunčiate jį HTML formatu, įdėkite html žymes į kūno dalį.

Nustatyti informaciją, reikalingą el. laiškų siuntimui apdoroti

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

Iš esmės tai yra pirmiau apibrėžtos reikšmės nustatymo forma.

Taip pat galite nustatyti kelis Nuo ir Iki.

Jis nėra įtrauktas į imtį, tačiau jis taip pat gali apimti CC ir BCC. Jei norite jį įtraukti, įtraukite jį taip pat, kaip nuo arba Iki taip:

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

Taip pat galite pakeisti rodomą siuntėjo vardą arba paskirties vietą, jei palaikomas el. laiško gavėjas. Tokiu atveju pakeiskite kodą taip:

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

Siųsti el. laišką

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

Baigę apibrėžti el. paštą, baigsite jį siųsti.

Pateikimas SmtpClient atliekamas klasės egzemplioriuje. Dispose Kadangi tai using var yra tikslas, jis deklaruojamas taip, kad jį būtų galima paleisti automatiškai. Kadangi tai yra būdas rašyti C # 8.0, pakeiskite į using įprastą ankstesnių versijų aprašymą.

SmtpClient.Connect smtp serverio metodą. Kai kuriems STMP serveriams reikia SSL arba TLS ryšių, tačiau SecureSocketOptions.Auto nurodyti paprastai yra gerai.

Jei SMTP serveris reikalauja autentifikavimo, SmtpClient.Authenticate metode nurodykite vartotojo vardą ir slaptažodį.

Kai ryšys SmtpClient.Send bus baigtas, siųskite el. laišką tokiu būdu.

Kai viskas bus padaryta, SmtpClient.Disconnect atjunkite jį su metodu.

Atkreipkite dėmesį, kad visi šie patarimai atlieka šias operacijas kaip sinchronines operacijas, tačiau kiekvienas metodas taip pat gali atlikti asinchroninį apdorojimą pavadinimu xxxxxAsync. Naudokite, jei reikia.

Kaip siųsti priedus

Norėdami siųsti MimeMessage.Body priedą, pakeiskite reikšmę, nustatytą taip:

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

Aukščiau pateiktame kode vietoje saugomas failas yra priedas, tačiau duomenys gali būti bet kas, nes jie turi būti tik baitų masyvas arba srautas. JPEG failo siuntimas kaip pavyzdys.

MimeMessage.Body Reikšmė, kurią nustatėte BodyBuilder sukurti kaip .

Pagrindinis tekstas TextPart skiriasi nuo , o ypatybės, į kurias jis nustatytas, skiriasi, nesvarbu, ar tekstas, ar HTML. Atkreipkite dėmesį, kad net jei nustatysite abu, pirmasis parametras bus ištrintas.

Priedas BodyBuilder.Attachments įtraukiamas į ypatybę. Argumentai yra "priedo pavadinimas", "priedo duomenys" ir "turinio tipas (MIME)".

Atminkite, kad gaunančioji šalis negali nustatyti priedo pavadinimo, nebent pridedate plėtinį.

ContentType reikšmė, kurią nustatėte, skirsis priklausomai nuo failo formato. Jei ieškote internete aplink "failo formato MIME", galėsite pamatyti derinį.

BodyBuilder.ToMessageBodyGaliausiai paskambinkite metodui ir nustatykite jį MimeMessage.Body į .

Apie SMTP serverio nurodymą

SMTP serveris laiškams siųsti turi skirtingus parametrus, priklausomai nuo jūsų naudojamos pašto serverio. Toliau pateikiamas pavyzdys, todėl, jei tokio dalyko nėra, patikrinkite, ar naudojamas serveris.

Be to, kadangi informacija teikiama nuo 2021 m. balandžio mėn., šiuo metu informacija gali būti pakeista.

naudojate patvirtinimo dviem
Pašto tarnyba SMTP serverio prievado autentifikavimas Jeiveiksmais šifravimą
Outlook.com 1 dalis smtp.office365.com 587 Vartotojo vardas ir slaptažodis ?? STARTTLS
Outlook.com 2 dalis smtp-mail.outlook.com 587 Vartotojo vardas ir slaptažodis Gaukite programos slaptažodį ir nustatykite slaptažodį STARTTLS
"Gmail" smtp.gmail.com 465(SSL) arba 587(TLS) Vartotojo vardas ir slaptažodis Gaukite programos slaptažodį ir nustatykite slaptažodį SSL arba TLS arba STARTTLS
Yahoo! Paštas smtp.mail.yahoo.co.jp 465 Vartotojo vardas ir slaptažodis ?? Nežinomas tipas
OKS smtp.ocn.ne.jp 465 Vartotojo vardas ir slaptažodis ?? SSL arba TLS