MailKit kullanarak e-posta gönderme

Sayfa oluşturma tarihi :

çevre

.NET
  • .NET 5.0
MailKit
  • 2.11.1

İlk başta

Daha önce, e-posta göndermek için bir sınıf olan smtpClient standart olarak dahil edildi, ancak şimdi belirtim dışı nedeniyle kullanım dışı.

Bu, .NET'in standart bir posta kitaplığı olmadığı anlamına gelir, bu nedenle üçüncü taraf bir kitaplık kullanırsınız.

Şu anda, ana kütüphane olarak "MailKit" var, bu yüzden bu zamanı kullanarak bir e-posta göndermek istiyorum.

MailKit ile Tanışıyor

Visual Studio 2019'u başlatın ve yeni bir konsol uygulaması (.NET) projesi oluşturun. .NET kullanıyorsanız, proje türünde biraz özgürlüğe sahip olursunuz, bu yüzden ayrıntıları önceden bileceğim.

Projeyi açtığınızda, Çözüm Gezgini'nden Bağımlılıklar'ı sağ tıklatın ve NuGet Paketlerini Yönet'i seçin.

Aşağıdaki listede MailKit'i görüntülemek için Gözat sekmesini tıklatın ve arama alanına MailKit yazın.

Listeden MailKit'i seçin, en son sürümün seçili olduğunu doğrulayın ve Yükle düğmesini tıklatın.

Tamam düğmesini tıklatın.

Paketin MailKit içerdiğini doğrulayın.

program

Aşağıda e-posta göndermek için minimum kod yer alıyor.

Kodunuzun ilk yarısında e-postalarınız için ihtiyacınız olan bilgileri tanımlarsınız ve bu değerleri ikinci yarıda posta göndermek için kullanırsınız. Kodun ikinci yarısını, ilk yarının tanımını gerektiği gibi değiştirerek sabit bir şekilde kullanabilmelisiniz.

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

E-posta göndermek için gereken bilgileri tanımlama

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

Bu, kullandığınız posta sunucusuna (SMTP sunucusu) bağlı olarak farklı değerler ayarladığınız yerdir. Bu makalenin sonunda ayarladığım değerlerden birkaçını açıklamak istiyorum, ancak temel olarak posta sunucumun sitesine bakın.

Başlangıçta, appsettigs.json vb.

E-postanın içeriğini tanımlama

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

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

Normalde postacı vb.

Son posta sistemlerinde kılık değiştirerek gönderilemeyeceğinden, temel olarak e-posta hesabınızla aynı e-posta adresini ayarlarsınız.

TextFormat metin veya HTML olarak gönderilebilir. HTML olarak gönderirseniz, html etiketlerini gövde kısmına katıştırın.

E-postaları işlemek için gereken bilgileri ayarlama

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

Temel olarak, yukarıda tanımlanan değeri ayarlamanın bir biçimidir.

Ayrıca birden çok From ve To ayarlayabilirsiniz.

Örneğe dahil değildir, ancak CC ve BCC'yi de içerebilir. Eklemek istiyorsanız, From veya To ile aynı şekilde ekleyin:

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

E-postanın alıcısı destekleniyorsa, gönderenin veya hedefin görünen adını da değiştirebilirsiniz. Bu durumda, kodu aşağıdaki gibi değiştirin:

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

E-posta gönder

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

E-postanızı tanımlamayı bitirdiğinizde, e-postayı göndermeyi de tamamlarsınız.

Gönderim SmtpClient sınıfın bir örneğinde yapılır. Dispose Hedef using var olduğundan, otomatik olarak serbest bırakılabilmesi için bildirilebilir. C# 8.0 yazmanın bir yolu olduğundan, lütfen using önceki sürümler için normal açıklamaya geçin.

SmtpClient.Connect yöntemiyle SMTP sunucusuna kullandır. Bazı STMP sunucuları SSL veya TLS bağlantıları gerektirir, ancak SecureSocketOptions.Auto belirtme genellikle iyidir.

SMTP sunucusu kimlik doğrulaması gerektiriyorsa, SmtpClient.Authenticate yöntemde bir kullanıcı adı ve parola belirtin.

Bağlantı SmtpClient.Send tamamlandığında, yöntemde bir e-posta gönderin.

Her şey yapıldığında, SmtpClient.Disconnect yöntemle bağlantısını kesin.

Bu ipuçlarının tüm bu işlemleri zaman uyumlu işlemler olarak gerçekleştirdiğini, ancak her yöntemin xxxxxAsync adı altında zaman uyumsuz işleme de gerçekleştirebileceğini unutmayın. Gerektiği gibi kullanın.

Ekler nasıl gönderilir

Ek göndermek MimeMessage.Body için, ayarlanan değeri aşağıdaki gibi değiştirin:

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

Yukarıdaki kodda, yerel olarak depolanan dosya bir ektir, ancak veriler herhangi bir şey olabilir, çünkü yalnızca bir bayt dizisi veya Akış olması gerekir. Örnek olarak bir JPEG dosyası gönderme.

MimeMessage.Body olarak oluşturmak için ayarladığınız BodyBuilder değer.

Gövde metni TextPart ' den farklıdır ve ayarlanan özellikler metin veya HTML olsun farklıdır. Her ikisini de ayarlasanız bile ilk ayarın silineceğini lütfen unutmayın.

Ek BodyBuilder.Attachments özelliğe eklenir. Bağımsız değişkenler "ek adı", "ek verileri" ve "içerik türü (MIME)"dir.

Uzantı eklemediğiniz sürece ekin adının alıcı taraf tarafından tanımlanamayacaklarını unutmayın.

ContentType ayarladığınız değer dosya biçimine bağlı olarak değişir. İnternette "dosya formatı MIME" etrafında arama yaptığınızda, kombinasyonu görebilirsiniz.

BodyBuilder.ToMessageBodySon olarak, yöntemi çağırın ve MimeMessage.Body olarak ayarlayın.

SMTP sunucusu belirtme hakkında

Posta göndermek için smtp sunucusunun, kullandığınız posta sunucusuna bağlı olarak farklı ayarları vardır. Aşağıda bir örnek verilmiştir, bu nedenle böyle bir şey yoksa, lütfen kullandığınız sunucunun yardımını kontrol edin.

Ayrıca, bilgiler Nisan 2021 itibariyle olduğundan, bilgiler şu anda değişmiş olabilir.

Posta hizmeti kimlik
İki adımlı doğrulama şifrelemesi kullanıyorsanızSMTP sunucusu bağlantı noktasıdoğrulaması
Outlook.com Bölüm 1 smtp.office365.com 587 Kullanıcı adı ve parola ?? STARTTLS
Outlook.com Bölüm 2 smtp-mail.outlook.com 587 Kullanıcı adı ve parola Uygulama parolasını alın ve parola olarak ayarlayın STARTTLS
Gmail smtp.gmail.com 465(SSL) veya 587(TLS) Kullanıcı adı ve parola Uygulama parolasını alın ve parola olarak ayarlayın SSL veya TLS veya STARTTLS
Yahoo! Posta smtp.mail.yahoo.co.jp 465 Kullanıcı adı ve parola ?? Bilinmeyen tür
OCN smtp.ocn.ne.jp 465 Kullanıcı adı ve parola ?? SSL veya TLS