إرسال رسائل البريد الإلكتروني باستخدام MailKit

تاريخ إنشاء الصفحة :

وسط

.NET
  • .NET 5.0
ميل كيت
  • 2.11.1

في البداية

في السابق ، تم تضمين smtpClient ، وهي فئة لإرسال رسائل البريد الإلكتروني ، كمعيار ، ولكن تم إهمالها الآن بسبب نفاد المواصفات.

وهذا يعني أن .NET ليس لديه مكتبة بريدية قياسية، لذلك سوف تستخدم مكتبة خارجية.

حاليا ، هناك "MailKit" باعتبارها مكتبة التيار ، لذلك أود أن إرسال بريد إلكتروني باستخدام هذه المرة.

تقديم ميل كيت

تشغيل Visual Studio 2019 وإنشاء مشروع جديد لتطبيق وحدة التحكم (.NET). إذا كنت تستخدم .NET ، سيكون لديك بعض الحرية في نوع المشروع ، لذلك سأعرف التفاصيل.

عند فتح المشروع انقر بزر الماوس الأيمن فوق تبعيات من مستكشف الحلول وحدد إدارة حزم NuGet.

انقر فوق علامة التبويب استعراض واكتب MailKit في حقل البحث لعرض 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;

وأعتقد أن هذا الجزء هو الجزء المقابل كما هو إذا كنت تستخدم عادة mailers الخ.

نظرا لأنه غير متوفر لإرساله من تمويه في أنظمة البريد الحديثة ، فسوف تقوم بتعيين عنوان البريد الإلكتروني نفسه مثل حساب البريد الإلكتروني الخاص بك.

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 و BCC. إذا كنت تريد تضمينه، إضافته بنفس الطريقة من أو إلى كما يلي:

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 افصله عن الطريقة.

لاحظ أن هذه التلميحات كافة تنفيذ هذه العمليات كعمليات متزامن ولكن يمكن أيضا تنفيذ كل أسلوب معالجة غير متزامنة تحت اسم xxxxxAsync. استخدام حسب الحاجة.

كيفية إرسال المرفقات

لإرسال 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البريد إذا كنتتشفير التحقق بخطوتين
Outlook.com الجزء الأول smtp.office365.com 587 اسم المستخدم وكلمة المرور ?? ستارتTLS
Outlook.com الجزء الثاني smtp-mail.outlook.com 587 اسم المستخدم وكلمة المرور الحصول على كلمة مرور التطبيق وتعيينها إلى كلمة المرور ستارتTLS
جوجل smtp.gmail.com 465(SSL) أو 587(TLS) اسم المستخدم وكلمة المرور الحصول على كلمة مرور التطبيق وتعيينها إلى كلمة المرور SSL أو TLS أو STARTTLS
بريد ياهو smtp.mail.yahoo.co.jp 465 اسم المستخدم وكلمة المرور ?? نوع غير معروف
OCN smtp.ocn.ne.jp 465 اسم المستخدم وكلمة المرور ?? SSL أو TLS