C# で Gmail を使ってメールを送信する

2024-09-10

必要なライブラリ

  • System.Net.Mail: メール送信の基本的な機能を提供します。
  • Google.Apis.Gmail.v1: GoogleのGmail APIと連携するためのライブラリです。

基本的な手順

  1. Gmail APIの有効化:

    • Google Cloud Platformのコンソールでプロジェクトを作成します。
    • APIライブラリで「Gmail API」を有効化します。
    • APIキーを作成し、安全に保管します。
  2. コードの実装:

    using System;
    using System.Net.Mail;
    using Google.Apis.Gmail.v1;
    using Google.Apis.Services;
    using Google.Apis.Util.Store;
    
    namespace EmailSender
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Gmail APIの認証情報
                string apiKey = "YOUR_API_KEY"; // ここにAPIキーを入力
                string fromAddress = "[email protected]";
    
                // メール送信先の情報
                string toAddress = "[email protected]";
                string subject = "Test Email";
                string body = "This is a test email sent using Gmail API.";
    
                // Gmail APIの認証
                var service = new GmailService(new BaseClientService.Initializer()
                {
                    ApiKey = apiKey
                });
    
                // メールを作成
                var message = new MimeMessage();
                message.From.Add(new Mailbox(fromAddress));
                message.To.Add(new Mailbox(toAddress));
                message.Subject = subject;
                message.Body = new TextPart("plain") { Text = body };
    
                // メールをBase64エンコードする
                var encodedMessage = Base64UrlEncode(message.ToString());
    
                // Gmail APIを使ってメールを送信
                var request = service.Users.Messages.Send(new Message { Raw = encodedMessage }, "me");
                var response = request.Execute();
    
                Console.WriteLine("Email sent successfully!");
            }
    
            // Base64エンコード関数
            static string Base64UrlEncode(string input)
            {
                var bytes = System.Text.Encoding.UTF8.GetBytes(input);
                var base64 = Convert.ToBase64String(bytes);
                return base64.Replace('+', '-').Replace('/', '_').Replace("=", "");
            }
        }
    }
    

注意:

  • Gmail APIの認証情報は安全に管理してください。APIキーを公開することは避けてください。
  • メール送信の頻度や送信量によっては、Googleの制限が適用されることがあります。



C#でGmail APIを使う:コード解説

コードの全体的な流れ

  1. ライブラリのインポート:

    • apiKey:Google Cloud Platformのコンソールで取得したAPIキーを設定します。
    • service:Gmail APIのサービスオブジェクトを作成します。
  2. メールの作成:

  3. メールのエンコード:

具体的なコード解説

using System.Net.Mail;
using Google.Apis.Gmail.v1;
using Google.Apis.Services;
using Google.Apis.Util.Store;
string apiKey = "YOUR_API_KEY"; // ここにAPIキーを入力
var service = new GmailService(new BaseClientService.Initializer()
{
    ApiKey = apiKey
});
string fromAddress = "[email protected]";
string toAddress = "[email protected]";
string subject = "Test Email";
string body = "This is a test email sent using Gmail API.";

var message = new MimeMessage();
message.From.Add(new Mailbox(fromAddress));
message.To.Add(new Mailbox(toAddress));
message.Subject = subject;
message.Body = new TextPart("plain") { Text = body };

メールエンコード:

var encodedMessage = Base64UrlEncode(message.ToString());

メール送信:

var request = service.Users.Messages.Send(new Message { Raw = encodedMessage }, "me");
var response = request.Execute();

重要なポイント

  • APIキーの安全な管理:APIキーを公開することは避けてください。
  • メール送信の制限:Googleのポリシーに従って、送信頻度や送信量を制限してください。
  • 複雑なメールの送信:より複雑なメールフォーマットや添付ファイルの送信には、追加のライブラリやコードが必要になる場合があります。



SMTPプロトコルを使用した直接接続

  • 利点:
    • GmailのAPIを使用せずに直接接続するため、APIの制限を受けることが少ない。
    • SMTPサーバーの設定を柔軟に調整できる。
  • 欠点:
    • SMTPサーバーの認証やセキュリティ設定を適切に行う必要がある。
    • 接続エラーが発生した場合の処理が複雑になる可能性がある。
using System.Net;
using System.Net.Mail;

// SMTPサーバーの設定
string smtpServer = "smtp.gmail.com";
int smtpPort = 587;
string fromAddress = "[email protected]";
string password = "your_password";

// メールを作成
var message = new MailMessage();
message.From = new MailAddress(fromAddress);
// ... (宛先、件名、本文の設定)

// SMTPクライアントを作成
using (var client = new SmtpClient(smtpServer, smtpPort))
{
    client.EnableSsl = true;
    client.Credentials = new NetworkCredential(fromAddress, password);
    client.Send(message);
}

サードパーティのライブラリ

  • 利点:
    • Gmail APIやSMTPプロトコルを抽象化して扱いやすくする。
    • さまざまな機能や設定オプションを提供する。
  • 欠点:
    • ライブラリの依存性やメンテナンスが必要になる。
    • ライブラリの機能や制限が異なる場合がある。

例:MailKit

using MailKit.Net.Smtp;
using MimeKit;

// メールを作成
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Your Name", "[email protected]"));
// ... (宛先、件名、本文の設定)

// SMTPクライアントを作成
using (var client = new SmtpClient())
{
    client.Connect("smtp.gmail.com", 587, SslProtocols.Tls);
    client.Authenticate("[email protected]", "your_password");
    client.Send(message);
    client.Disconnect(true);
}

Azure FunctionsやAWS Lambdaなどのクラウド関数

  • 利点:
    • サーバーレス環境でメール送信をスケーラブルに実行できる。
    • さまざまな言語やフレームワークに対応している。
  • 欠点:
    • クラウドプラットフォームの知識や設定が必要になる。
    • クラウドプラットフォームの料金が発生する。

例:Azure Functions

using System.Net;
using System.Net.Mail;

public static void Run(HttpRequest req, ILogger log)
{
    // SMTPサーバーの設定
    // ...

    // メールを作成
    // ...

    // SMTPクライアントを作成
    // ...

    // メールを送信
}

c# .net email



C#におけるDataTableに対するLINQクエリ代替方法

**LINQ (Language-Integrated Query)**は、.NET Frameworkで提供されるクエリ構文です。これにより、オブジェクトのコレクションを宣言的に操作することができます。DataTableは、データベーステーブルの構造とデータを表現するオブジェクトであり、LINQを使ってクエリを実行することができます。...


C#における基底コンストラクタ呼び出しの具体的なコード例と解説

**C#**において、クラスが別のクラスから継承している場合、そのクラスのコンストラクタは基底クラスのコンストラクタを呼び出す必要があります。これは、基底クラスの初期化が子クラスの初期化の前提となるためです。base()キーワードを使用:public class DerivedClass : BaseClass { public DerivedClass() : base() { // Derived class's constructor body } } この場合、DerivedClassのコンストラクタはBaseClassのデフォルトコンストラクタを呼び出します。...


.NETにおけるstructとclassの違いを日本語で解説(例付き)

structとclassは、.NETフレームワークにおける2つの基本的なデータ型です。どちらもオブジェクト指向プログラミングの概念に基づいていますが、いくつかの重要な違いがあります。両者はメンバー(フィールドやメソッド)を持つことができます。...


C#でDateTime型の誕生日から年齢を計算するコードの解説

日本語:C#でDateTime型の誕生日から年齢を計算するには、以下の手順に従います。誕生日を取得する: DateTime型の変数に誕生日の日付を設定します。現在の時刻を取得する: DateTime. Nowを使用して現在の時刻を取得します。...


C#で相対時間を計算できるようになれば、あなたのプログラミングスキルが飛躍的に向上する!

DateTime 構造体は、日付と時刻を表す型です。この構造体には、相対時間を計算するためのいくつかのメソッドが用意されています。例えば、以下のコードは、現在時刻から2時間後の時刻を取得します。また、以下のコードは、2つの DateTime 構造体間の差分を取得します。...



c# .net email

C#でDateTime型の誕生日から年齢を計算するコードの解説

日本語:C#でDateTime型の誕生日から年齢を計算するには、以下の手順に従います。誕生日を取得する: DateTime型の変数に誕生日の日付を設定します。現在の時刻を取得する: DateTime. Nowを使用して現在の時刻を取得します。


C#で辞書を値でソートするコード例

**C#**において、辞書(Dictionary)の要素を値でソートするには、通常以下の手順を踏みます。値とキーのペアを格納する新しいリストを作成する。元の辞書の各要素を新しいリストに追加する。新しいリストを値でソートする。ソートされたリストからキーと値を抽出する。


C#におけるTypeから新しいオブジェクトインスタンスを作成する際の性能比較:コード例と解説

日本語訳:C#において、Typeオブジェクトから新しいオブジェクトインスタンスを作成する方法は、パフォーマンスに影響を与えます。この解説では、さまざまな方法とその性能について説明します。Activator. CreateInstanceメソッド:


C#におけるStringとstringの代替方法

**C#**では、Stringとstringという2つのキーワードがありますが、実はどちらも同じものを指しています。つまり、C#ではstringがエイリアスとして定義されており、Stringとまったく同じ意味を持っています。これは、C#の設計上の選択であり、開発者がどちらのキーワードを使っても同じコードが生成されるようになっています。


.NET データアクセス最新情報: Entity Framework Core、LINQ to Entities、Dapper の最新動向

Entity Framework と LINQ to SQL は、.NET Framework でオブジェクト指向のデータアクセスを提供する 2 つの主要なテクノロジーです。どちらも、C# などの . NET 言語を使用してリレーショナルデータベースと対話するための強力なツールを提供します。