【.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. 右上の黄色地の部分にアプリパスワードが表示される。次節のプログラムで使用するので控えておく。

プログラム編

下記は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アカウントのメールアドレスを入力する。

まとめ(感想文)

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