【.NET/C#】SmtpClientにGMailのSMTPサーバーを指定してメールを送信する

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【.NET/C#】SmtpClientにGMailのSMTPサーバーを指定してメールを送信する

2023-3-30 | ,

.NETでSmtpClientにGMailのSMTPサーバーを指定してメールを送信したい!

概要

今回の記事では、.NETでSmtpClientにGMailのSMTPサーバーを指定してメールを送信する手順を掲載する。

仕様書

環境

  • .NET 5.0

手順書

「下準備編」と「プログラム編」の2部構成です。

下準備編

まず、Googleアカウントの2段階認証を設定して後、更にアプリパスワードを設定する必要がある。詳細は下記のリンクを参照。

アプリパスワードの発行のページへのアクセスがちょっとわかりにくいので説明する。2段階認証は予め設定しておく。

  1. ChromeでGMailなどのGoogleのページを開いて右上の「Googleアプリ」のアイコンを左クリックする。表示されるのアイコンの中の「アカウント」を左クリックする。
  2. 左のリストのセキュリティを左クリックする。
  3. 「Googleにログインする方法」の中の「2段階認証プロセス」を左クリックする。
  4. 表示された下の方に「アプリパスワード」があるので左クリックする。
  5. アプリを「メール」、デバイスを「Windowsパソコン」に設定して「生成」を左クリックする。
  6. 右上の黄色地の部分にアプリパスワードが表示される。次節のプログラムで使用するので控えておく。(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.が発生して使えないので注意。

まとめ(感想文)

以前は、アプリパスワードは必要なくて、アカウントのパスワードで良かったんだけども、セキュリティーの観点からアプリパスワードを使うように仕様変更されたんだと思われ。