使用 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 |