使用 MailKit 发送电子邮件

页面创建日期 :

环境

.NET
  • .NET 5.0
MailKit
  • 2.11.1

入门

以前,标准包含用于发送电子邮件的"SmtpClient"类,但由于规范较旧,现在已弃用。

这允许 .NET 使用第三方库,因为它没有标准的邮件发送库。

目前,"MailKit"是主流库,所以这次我想用这个来发送电子邮件。

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;

我认为,这部分是相应的部分,因为它是,如果你通常使用邮件程序等。

由于您无法在现代邮件系统中模拟发件人,因此您基本上将设置与电子邮件帐户相同的电子邮件地址。

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 或密件抄送。 添加方式与"发件人"或"收件人"相同,如下所示:

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 使用方法断开连接。

请注意,所有这些操作都作为同步处理在 Tips 中执行,但每个方法都允许异步处理,名称为 xxxxxxAsync。 如有必要,请使用。

如何发送附件

要发送附件, 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 将构造为 。

Body 中 TextPart 的文本与 不同,其属性取决于文本或 HTML。 请注意,即使同时设置两者,首先设置此设置也更容易。

将附件 BodyBuilder.Attachments 添加到属性。 参数为"附件名称"、"附件数据"和"内容类型 (MIME)"。

请注意,如果"附件名称"未包含扩展名,则接收方可能无法识别它。

ContentType 设置的值取决于文件格式。 在互联网上,"文件格式MIME",我认为你可以理解的组合,如果你搜索周围。

最后 BodyBuilder.ToMessageBody ,调用 该方法 MimeMessage.Body ,并设置 它。

关于指定 SMTP 服务器

用于发送邮件的 SMTP 服务器设置因邮件服务器而异。 由于以下示例,因此,如果没有适用,请参阅服务器帮助。

此外,由于信息截至 2021 年 4 月,因此信息可能随时更改。

邮件服务SMTP服务器端口身份验证 如果使用两步验证加密
Outlook.com 第1部分 smtp.office365.com 587 用户名和密码 ?? STARTTLS
Outlook.com 第2部分 smtp-mail.outlook.com 587 用户名和密码 获取应用密码并将其设置为密码 STARTTLS
Gmail smtp.gmail.com 465(SSL) or 587(TLS) 用户名和密码 获取应用密码并将其设置为密码 SSL or TLS or STARTTLS
雅虎邮件 smtp.mail.yahoo.co.jp 465 用户名和密码 ?? 未知类型
OCN smtp.ocn.ne.jp 465 用户名和密码 ?? SSL or TLS