.NETでSmtpClientにGMailのSMTPサーバーを指定してメールを送信したい!
概要
今回の記事では、.NETでSmtpClientにGMailのSMTPサーバーを指定してメールを送信する手順を掲載する。
仕様書
環境
- .NET 5.0
手順書
「下準備編」と「プログラム編」の2部構成です。
下準備編
まず、Googleアカウントの2段階認証を設定して後、更にアプリパスワードを設定する必要がある。詳細は下記のリンクを参照。
アプリパスワードの発行のページへのアクセスがちょっとわかりにくいので説明する。2段階認証は予め設定しておく。
- ChromeでGMailなどのGoogleのページを開いて右上の「Googleアプリ」のアイコンを左クリックする。表示されるのアイコンの中の「アカウント」を左クリックする。
- 左のリストのセキュリティを左クリックする。
- 「Googleにログインする方法」の中の「2段階認証プロセス」を左クリックする。
- 表示された下の方に「アプリパスワード」があるので左クリックする。
- アプリを「メール」、デバイスを「Windowsパソコン」に設定して「生成」を左クリックする。
- 右上の黄色地の部分にアプリパスワードが表示される。次節のプログラムで使用するので控えておく。(4文字毎にスペースで区切らてるんだけどもこのスペースは不要)
プログラム編
下記はSmtpClientにGMailのSMTPサーバーを指定してメールを送信するサンプルのコード。
using System;
using System.Net.Mail;
public class MailTest
{
static public void SendMail(
string from,
string to,
string subject,
string body)
{
var msg = new MailMessage();
msg.To.Clear();
msg.To.Add(new MailAddress(to));
msg.CC.Clear();
msg.Bcc.Clear();
SmtpClient sc = new SmtpClient();
sc.Timeout = 5000;
msg.From = new MailAddress("<USER_NAME>@gmail.com", "<USER_NAME>");
sc.Host = "smtp.gmail.com";
sc.Port = 587;
sc.EnableSsl = true;
sc.Credentials = new System.Net.NetworkCredential("<USER_NAME>@gmail.com", "<APP_PW>");
msg.Subject = subject;
msg.Body = body;
try
{
sc.Send(msg);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
msg.Dispose();
sc.Dispose();
}
return;
}
}
sc.Credentials = new System.Net.NetworkCredential("<USER_NAME>@gmail.com", "<APP_PW>");
の<APP_PW>
は前節で控えたアプリパスワードを入力する。<USER_NAME>@gmail.com
はアプリパスワードを発行したGoogleアカウントのメールアドレスを入力する。
From
で使うメールアドレスには条件があって、Credentials
で使ったメールアドレス以外は基本的に無視されてCredentials
で使ったメールアドレスが自動的にFrom
に設定される。
Credentials
で使ったメールアドレス以外をFrom
に設定したい場合は、GMailでエイリアスの設定をしておくと、エイリアスで設定したメールアドレスをFrom
に設定できるようになる。ただし、メールのヘッダー部にCredentials
で使ったメールアドレスが記載されるので使いどころは限られそうな感じ。
管理者画面のエイリアスで設定したメールアドレスではFrom
に設定できず、Credentials
での認証にも使えないので注意。Google Workspaceのメールアドレスも同様でGMailでエイリアスの設定をすれば同様のことができる。管理者画面のエイリアスとは別であくまでGMailでエイリアスの設定がある。管理者画面のエイリアスで設定したメールアドレスではFrom
に設定できず、Credentials
での認証にも例外The SMTP server requires a secure connection or the client was not authenticated.
が発生して使えないので注意。
まとめ(感想文)
以前は、アプリパスワードは必要なくて、アカウントのパスワードで良かったんだけども、セキュリティーの観点からアプリパスワードを使うように仕様変更されたんだと思われ。