あけましておめでとうございます。
毎年、適当な言語を選んで、あけましておめでとうメールを送っています。
今年は c# にしてみました。
Environment
- 開発環境: Windows 10 pro
- 開発ツール: Visual Studio 2019 + dotent core sdk 3.1
- 実行環境: Ubuntu 18.04.1 LTS x64
Code
SmtpClientクラスはもう廃止なんですね。
https://docs.microsoft.com/ja-jp/dotnet/api/system.net.mail.smtpclient?view=netframework-4.8
重要
新しい開発には SmtpClient クラスを使用しないことをお勧めします。 SmtpClient は多くの最新プロトコルをサポートしていないためです。 代わりにMailkitまたはその他のライブラリを使用してください。 詳細については、GitHub でSmtpclient を使用しないことをお勧めします。
MSの公式ドキュメントにはMailkit
を使えと。オープンな社風になってしまったMSに私は戸惑いを隠しきれません。
というので nuget で Mailkit
をインストールしてgithubのサンプルコードを使いました。
using System;
using MailKit.Net.Smtp;
using MailKit;
using MimeKit;
using System.Collections.Generic;
namespace mail
{
public class Program
{
public static void Main(string[] args)
{
var msg = new CustomMessage()
{
Subject = "I wish you a Happy new year 2020",
From = "dharry@example.co.jp",
SmtpServer = "mail.example.co.jp",
AuthUser = "dharry",
AuthPass = "mypass",
};
msg.To = new List<KeyValuePair<string, string>>() {
new KeyValuePair<string, string>("山田","yamada@example.com"),
new KeyValuePair<string, string>("斎藤","saito@example.com")
new KeyValuePair<string, string>("佐藤","sato@example.com")
};
msg.Body = body;
msg.Send();
}
private const string body = @"2020年01月01日になりました。
あけましておめでとうございます。
今年もよろしくお願いします。
";
}
public class CustomMessage
{
public List<KeyValuePair<string, string>> To { get; set; }
public string Subject { get; set; }
public string From { get; set; }
public string Body { get; set; }
public string SmtpServer { get; set; }
public int SmtpPort { get; set; } = 587;
public string AuthUser { get; set; }
public string AuthPass { get; set; }
public void Send()
{
foreach (var p in To)
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress(From));
message.To.Add(new MailboxAddress(p.Key, p.Value));
message.Subject = Subject;
message.Body = new TextPart("plain")
{
Text = $"{p.Key}さん\n\n{Body}"
};
using (var client = new SmtpClient())
{
// For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(SmtpServer, SmtpPort, false);
// Note: only needed if the SMTP server requires authentication
client.Authenticate(AuthUser, AuthPass);
client.Send(message);
client.Disconnect(true);
Console.WriteLine($"sendmessage.. {p.Value}");
}
}
}
}
}
Execute
ビルド->発行して、Linuxに持っていき、実行。
毎回思うのだが、dotnetコマンドの引数にdllというのが違和感ありすぎて困ります。
$ dotnet ./mail.dll