ارسال ایمیل با استفاده از MailKit

تاریخ ایجاد صفحه :

محیط

.NET
  • .NET 5.0
MailKit
  • 2.11.1

در ابتدا

پیش از این smtpClient که کلاسی برای ارسال ایمیل بود، به عنوان استاندارد گنجانده شده بود، اما اکنون به دلیل خارج از مشخصات از بین می رود.

این بدان معنی است که .NET کتابخانه پستی استاندارد ندارد، بنابراین شما از یک کتابخانه شخص ثالث استفاده خواهید کرد.

در حال حاضر ، وجود دارد "MailKit" به عنوان یک کتابخانه جریان اصلی ، بنابراین من می خواهم برای ارسال یک ایمیل با استفاده از این زمان.

معرفی MailKit

راه اندازی ویژوال استودیو 2019 و ایجاد یک برنامه کنسول جدید (.NET) پروژه. اگر از .NET استفاده می کنید، مقداری آزادی در نوع پروژه خواهید داشت، بنابراین جزئیات را پیش می دانم.

هنگامی که پروژه را باز می کنید، وابستگی ها را از Solution Explorer کلیک راست کرده و مدیریت بسته های NuGet را انتخاب کنید.

روی زبانه مرور کلیک کنید و MailKit را در زمینه جستجو تایپ کنید تا MailKit در لیست زیر نمایش داده شود.

MailKit را از لیست انتخاب کنید، تأیید کنید که آخرین نسخه انتخاب شده است، و سپس روی دکمه Install کلیک کنید.

روی دکمه OK کلیک کنید.

بررسی کنید که بسته حاوی 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.نامه نوشته شده است، و غیره، اما آن را پیش رو آن را زائد به عنوان راهنمایی می شود.

تعریف محتوای یک ایمیل

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 آن را با روش قطع کنید.

توجه داشته باشید که این راهنمایی همه این عملیات ها را به عنوان عملیات سنکرون انجام می دهند، اما هر روش می تواند پردازش ناهمزمان را با نام xxxxx در زمان نیاز استفاده کنید.

نحوه ارسال پیوست ها

برای ارسال 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();

در کد فوق، فایل ذخیره شده به صورت محلی یک پیوست است، اما داده ها می توانند هر چیزی باشد زیرا فقط باید یک آرایه بایت یا Stream باشد. ارسال فایل JPEG به عنوان مثال.

MimeMessage.Body ارزش شما مجموعه ای برای BodyBuilder ساخت به عنوان.

متن بدن متفاوت است ، و خواص که به آن تنظیم شده است متفاوت است ، چه TextPart متن و یا HTML. لطفا توجه داشته باشید که حتی اگر هر دو را تنظیم کنید، تنظیمات اول پاک خواهد شد.

پیوست به BodyBuilder.Attachments ملک اضافه می شود. آرگوم ها "نام پیوست"، "داده پیوست"، و "نوع محتوا (MIME)" هستند.

توجه داشته باشید که نام پیوست ممکن است توسط طرف دریافت کننده شناسایی نشود مگر اینکه پسوند اضافه کنید.

ContentType مقداری که شما تنظیم می کنید بسته به فرمت فایل متفاوت خواهد بود. اگر شما در اینترنت جستجو در اطراف "فایل فرمت MIME" ، شما می توانید ترکیب را ببینید.

در BodyBuilder.ToMessageBody نهایت با روش تماس بگیرید و آن را تنظیم MimeMessage.Body کنید.

درباره مشخص کردن یک سرور SMTP

سرور SMTP برای ارسال بسته به سرور پستی که استفاده می کنید تنظیمات متفاوتی دارد. مثال زیر است، بنابراین اگر چنین چیزی وجود ندارد، لطفا ً کمک سروری را که استفاده می کنید بررسی کنید.

علاوه بر این، از آنجا که اطلاعات تا آوریل ۲۰۲۱ است، ممکن است اطلاعات در حال حاضر تغییر کرده باشد.

سرویس اگر استفاده از رمزگذاری تایید
ایمیل SMTP سرور احراز هویت پورت شما بادو مرحله ای
Outlook.com قسمت اول smtp.office365.com 587 نام کاربری و رمز عبور ?? STARTTLS
Outlook.com قسمت دوم smtp-mail.outlook.com 587 نام کاربری و رمز عبور دریافت رمز عبور برنامه و تنظیم آن را به رمز عبور STARTTLS
جیمیل smtp.gmail.com 465(SSL) یا 587(TLS) نام کاربری و رمز عبور دریافت رمز عبور برنامه و تنظیم آن را به رمز عبور SSL یا TLS یا STARTTLS
ایمیل یاهو smtp.mail.yahoo.co.jp 465 نام کاربری و رمز عبور ?? نوع ناشناخته
Ocn smtp.ocn.ne.jp 465 نام کاربری و رمز عبور ?? SSL یا TLS