SendGrid APIを使用し、C#と.NET 6でメールを送信する方法

December 13, 2021
レビュー担当者

SendGrid APIを使用し、C#と.NET 6でメールを送信する方法

この記事はNiels Swimbergheこちらで公開した記事(英語)を日本語化したものです。

メールは何十年も前から存在していますが、メールを大規模に送信することはいまだ困難です。Twilio SendGridなら、スケーラビリティを気にすることなくメールを送信できます。さらに、SendGridのAPIとSDKを使えば、数分でメール送信を開始できます。

また、SMTPを基盤とする既存のコードベースがある場合は、SMTPプロトコルを使用することもできます。本稿では、SendGrid .NET SDKと.NET 6コンソールアプリケーションを使用してメールを送信する方法をご紹介します。

必要条件

チュートリアルを進めるには、以下の項目が必要です。

  • .NETをサポートするOS(Windows/Mac/Linux)
  • .NET 6 SDK(ダウンロード
  • コードエディタまたはIDE(推奨: C#プラグインを導入したVS Code、Visual Studio、JetBrains Rider)
  • Twilio SendGridのアカウント(登録はこちらから

.NET(Core)の古いバージョンを使用している場合でも、本稿の手順を進めることができます。ただし、わずかな調整は必要となります。

SendGridアカウントでメールを送信するための設定

メールを送信する前に設定する項目が2つあります。

1つ目は、Sender Authentication(送信者の認証)の設定です。送信者の認証は、送信者がメールを送信するメールアドレスまたはドメインを所有していることを確認するものです。

2つ目は、メール送信の権限を持つSendGrid APIキーの作成です。

送信者の認証

SendGridでは、ドメイン認証を設定することが推奨されています。ただし、ドメイン認証では、DNSホストにレコードを追加する必要があります。本稿では、手順を簡素化するため、代わりにSingle Sender Verification(単一送信者認証)を使用します。これは、メールの送信元となる単一メールアドレスを所有していることを確認するものです。

 

単一送信者認証は、テスト目的には最適ですが、本番環境ではお勧めしません。

Twilioでは、本番環境にはドメイン認証を推奨しています。認証済みドメインは、受信ボックスサービスプロバイダに対し、あなたがそのドメインを所有していることを証明するものであり、受信ボックスプロバイダがあなたの送信元アドレスに付加する「via sendgrid.net」のテキストを削除します。

ドメイン認証の手順について詳しくは、ブログ記事「Twilio SendGrid Emailのドメイン認証手順」を参照してください。

SendGridのウェブサイトにアクセスし、ログインします。サイドメニューの[Settings](設定)タブをクリックします。設定タブが開いたら、[Sender Authentication](送信者認証)をクリックします。

SendGridコンソールサイドナビ

Single Sender Verification](単一送信者認証)セクションの下にある[Get Started](始める)をクリックします。

単一送信者認証
 

これにより右側のパネルにフォームが表示されます。フォームにあなたの情報とメールアドレスを入力してください。

送信者作成

フォームへの入力後、[Create](作成)をクリックします。右側にメールアドレスの確認を促す別のパネルが表示されます。入力したメールアドレスにメールが送信されます。
受信ボックスでSendGridからのメールを開き、[Verify Single Sender](単一送信者を認証)をクリックします。

送信者認証

これであなたのメールアドレスは検証され、メール送信に使用できるようになりました!

メール送信の権限を持つSendGrid APIキーを作成する

SendGridのウェブサイトに戻り、[Settings](設定)タブの下の[API Keys](APIキー)をクリックします。右上の[Create API Key](APIキーの作成)をクリックします。すると、右側のパネルに別のフォームが表示されます。APIキーに分かりやすい名前を付けます。APIキーには、さまざまな権限を割り当てることができます。最適なセキュリティを保つために、必要最小限の権限のみを付与します。


Restricted Access](制限付きアクセス)をクリックします。

APIキー作成

アコーディオンメニューの[Mail Send](メール送信)をクリックすると、下に権限が表示されます。[Mail Send](メール送信)権限のスライダーを右にドラッグして権限を付与します。

アクセス付与

フォームの一番下までスクロールし、[Create & View](作成と表示)をクリックします。APIキーが画面に表示されます。この画面を閉じると、再度APIキーを取得することはできません。

コピーし、安全な場所に保管してください。

APIキー作成完了
 

送信者を認証し、APIキーを作成したら、次はコードを記述します。

メール送信のためのコンソールアプリを作成する

コンソールアプリを新規作成する

お使いのマシンでシェルを開き、以下のコマンドで新しいフォルダを作成します。

mkdir SendGridMail

新しいフォルダに移動します。

cd SendGridMail

.NET CLIを使用して新しいコンソールアプリケーションを作成します。

dotnet new console

.NET CLIを使用してプロジェクトを実行します。

dotnet run

シェルに「Hello, World!」と出力されます。

Twilio SendGridの統合

.NET CLIを使用し、SendGrid NuGetパッケージをプロジェクトに追加します。

dotnet add package SendGrid

コードエディタまたはIDEを使用してコンソールプロジェクトを開き、Program.csファイルの内容を次のように置き換えます。

using SendGrid;
using SendGrid.Helpers.Mail;

var apiKey = Environment.GetEnvironmentVariable("SENDGRID_API_KEY");
var client = new SendGridClient(apiKey);
var msg = new SendGridMessage()
{
    From = new EmailAddress("[あなたのメールアドレス]", "[あなたの名前]"),
    Subject = "Sending with Twilio SendGrid is Fun",
    PlainTextContent = "and easy to do anywhere, especially with C#"
};
msg.AddTo(new EmailAddress("[受信者のメールアドレス]", "[受信者の名前]"));
var response = await client.SendEmailAsync(msg);

// 成功ステータスコードは、SendGridがメールリクエストを受信し、処理することを意味します。
// SendGridがメールを送信しようとすると、エラーが発生することがあります。 
// メールが受信できない場合は、このURLでデバッグします:https://app.sendgrid.com/email_activity 
Console.WriteLine(response.IsSuccessStatusCode ? "Email queued successfully!" : "Something went wrong!");

古いバージョンの.NETや.NETの古いテンプレートを使用している場合は、上記のコードとそれ以降のコードをProgramクラスのMainメソッドの内部に配置する必要があります。

プレースホルダー文字列を、以下の通り更新します。

  • “[あなたのメールアドレス]”を、SendGridアカウントで認証したメールアドレスに置き換えます。
  • “[あなたの名前]”を、あなたの名前に置き換えます。
  • “[受信者のメールアドレス]”を、メールの送信先メールアドレスに置き換えます。
  • “[受信者の名前]”を受信者の名前に置き換えます。

Program.csファイルを保存します。

上記のコードでは、以下の処理を実行します。

  • 4行目: 環境変数からAPIキーを取得し、apiKey変数に格納します。
  • 5行目: 新しいSendGridClientを、apiKeyを用いて構築します。
  • 6〜11行目: 新しいSendGridMessageオブジェクトを作成し、お使いのメールアドレスを送信者として、件名とテキストコンテンツを設定します。
  • 12行目: メールの受信者を追加します。
  • 13行目: SendGrid APIにSendGridMessageを送信します。
  • 18行目: SendGrid APIがリクエストを受け入れたかどうかを、レスポンスステータスコードがHTTP 2XXの範囲にあるかどうかで確認します。

SendGrid APIが成功を示すHTTPステータスコードを返したとしても、必ずしもメールが受信者により正常に受信されたことを意味するわけではありません。これはSendGrid APIがあなたのリクエストを受け入れ、メールを送信することを意味します。もし相手先がメールを受信していない場合、Email Activity Feed(アクティビティ フィード)を使用してその原因を調べることができます。

このアプリケーションは、APIキーがSENDGRID_API_KEY環境変数に格納されていることを想定しています。

Bashなどのシェルを使用している場合は、以下のコマンドを実行します。

export SENDGRID_API_KEY=[あなたのAPIキー]

PowerShellを使用している場合は、以下のコマンドを実行します。

$Env:SENDGRID_API_KEY = "[あなたのAPIキー]"

CMDを使用している場合は、以下のコマンドを実行します。

set SENDGRID_API_KEY=[あなたのAPIキー]

環境変数は、シェルセッションの間のみ有効です。新しいシェルを開くときは、環境変数を再度設定する必要があります。

.NET CLIを使用してプロジェクトを実行します。

dotnet run

問題がなければ、「Email queued successfully!」と出力されます。
受信者の受信ボックスを開いて、メールを受信したことを確認します。アクセスできない場合は、Email Activity Feed(アクティビティフィード)を使用して、メールのステータスを確認できます。

以下はメールの一例です。

受信したメール

ボーナス1: ユーザーの入力を求める

ユーザーからの入力を求めることで、より柔軟なアプリケーションを作ることができます。Program.csを以下の内容に更新します。


using SendGrid;
using SendGrid.Helpers.Mail;

var apiKey = Environment.GetEnvironmentVariable("SENDGRID_API_KEY");
var client = new SendGridClient(apiKey);

Console.Write("To: ");
var toEmail = Console.ReadLine();

Console.Write("Subject: ");
var subject = Console.ReadLine();

Console.Write("Body: ");
var body = Console.ReadLine();

var msg = new SendGridMessage()
{
    From = new EmailAddress("[あなたのメールアドレス]", "[あなたの名前]"),
    Subject = subject,
    PlainTextContent = body
};
msg.AddTo(new EmailAddress(toEmail));
var response = await client.SendEmailAsync(msg);

// 成功ステータスコードは、SendGridがメールリクエストを受信し、処理することを意味します。
// SendGridがメールを送信しようとすると、エラーが発生することがあります。 
// メールが受信できない場合は、このURLでデバッグします:https://app.sendgrid.com/email_activity 
Console.WriteLine(response.IsSuccessStatusCode ? "Email queued successfully!" : "Something went wrong!");

更新後のコードでは、Console.ReadLineを使用して、件名、本文、受信者のメールアドレスの入力をユーザーに求めています。プロジェクトを再度実行し、プロンプトに回答してください。

dotnet run

ボーナス2: プロジェクトをより自由に設定できるようにする

現在、送信者のメールアドレスと名前はハードコードされており、SendGrid API Keyは環境変数で設定されています。これはPoC(概念実証)としては全く問題ありませんが、プロジェクトをより設定しやすいものにしたい場合もあるでしょう。その場合、.NETのプラグイン可能な設定システムを利用できます。

.NET CLIを使用して、以下のNuGetパッケージを追加します。

dotnet add package Microsoft.Extensions.Hosting
dotnet add package Microsoft.Extensions.Configuration.UserSecrets

Program.csファイルを以下の内容に更新します。


using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using SendGrid;
using SendGrid.Helpers.Mail;

using IHost host = Host.CreateDefaultBuilder(args).Build();
var config = host.Services.GetRequiredService<IConfiguration>();

var apiKey = config.GetValue<string>("SendGridApiKey");
var fromEmail = config.GetValue<string>("FromEmail");
var fromName = config.GetValue<string>("FromName");
if(string.IsNullOrEmpty(apiKey)) throw new Exception("SendGridApiKey should not be null or empty");
if(string.IsNullOrEmpty(fromEmail)) throw new Exception("FromEmail should not be null or empty");
if(string.IsNullOrEmpty(fromName)) throw new Exception("FromName should not be null or empty");

Console.Write("To:");
var toEmail = Console.ReadLine();

Console.Write("Subject:");
var subject = Console.ReadLine();

Console.Write("Body:");
var body = Console.ReadLine();

var client = new SendGridClient(apiKey);
var msg = new SendGridMessage()
{
    From = new EmailAddress(fromEmail, fromName),
    Subject = subject,
    PlainTextContent = body
};
msg.AddTo(new EmailAddress(toEmail));
var response = await client.SendEmailAsync(msg);

// 成功ステータスコードは、SendGridがメールリクエストを受信し、処理することを意味します。
// SendGridがメールを送信しようとすると、エラーが発生することがあります。 
// メールが受信できない場合は、このURLでデバッグします:https://app.sendgrid.com/email_activity 
Console.WriteLine(response.IsSuccessStatusCode ? "Email queued successfully!" : "Something went wrong!");

Host.CreateDefaultBuilder(args).Build();は、デフォルトで複数の設定ソースを使用しますが、以下が最も重要です。

  • appsettings.jsonが存在すれば、そこから設定を読み込みます。
  • 環境を「Development」に設定してプロジェクトを実行すると、.NET user secretsから設定を読み込みます。

デフォルトの設定ソースについての詳細は、Microsoft公式ドキュメントをご参照ください。

appsettings.jsonファイルを新規作成し、以下の内容を追加します。

{
  "FromEmail": "[あなたのメールアドレス]",
  "FromName": "[あなたの名前]"
}

このファイルは、送信者のメールアドレスと名前を設定するために使用します。

JSONファイルを設定処理に使用することは、送信者の詳細情報設定には適切ですが、APIキーを扱うにはあまり向いていません。APIキーには、ユーザーシークレットを使用すると良いでしょう。

以下のコマンドを実行し、プロジェクトのユーザーシークレットを初期化します。

dotnet user-secrets init

以下のコマンドを実行し、APIキーをユーザーシークレットとして設定します。

dotnet user-secrets set SendGridApiKey [あなたのSendGrid APIキー]

JSONファイルにメールアドレスを保存したくない場合は、送信者メールアドレスをユーザーシークレットに設定することもできます。

dotnet user-secrets set FromEmail [あなたのメールアドレス]

ユーザーシークレットの設定は、appsettings.jsonの設定を上書きします。

前述のとおり、ユーザーシークレットは環境が「Development」に設定されているときのみ読み込まれます。これを行うには、「DOTNET_ENVIRONMENT」環境変数を「Development」に設定します。また、次のようにコマンドラインの引数として渡すこともできます。

dotnet run --environment Development

結果は同じになりますが、アプリケーションの設定が非常に柔軟になりました。
このコンソールアプリケーションをどこか別の場所にデプロイする場合、環境変数、コマンドライン引数、JSONファイルを使用して設定を変更できます。

ユーザーシークレットは、シークレットを保存し、.NETで設定にロードするための優れた方法です。ユーザーシークレットは、プロジェクトのソースの外部にシークレットを保存することで、シークレットを図らずもソースコントロールにチェックインしてしまうことを防ぎます。こうしたシークレットが、まだプレーンテキストの状態で、個人用フォルダとは別の場所に保存されているということが重要です。

ボーナス3: 依存性注入のサービスとしてSendGridClientを設定する

デフォルトのホストビルダーを使用してアプリケーションの設定可能性を高めましたが、さらにSendGridをアプリケーションに統合することも可能です。

.NET向けSendGrid SDKには追加のNuGetパッケージがあり、依存性注入コンテナにSendGridクライアントを追加することができます。

これは、ASP.NETで最もよく使用されていますが、ご覧のように、コンソールアプリケーションに手動で追加することにより、ASP.NETの優れた組み込み機能を使用することも可能です。

次のコマンドを実行して、SendGrid依存性注入パッケージを追加します。

dotnet add package SendGrid.Extensions.DependencyInjection

Program.csファイルを更新します。


using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using SendGrid;
using SendGrid.Helpers.Mail;
using SendGrid.Extensions.DependencyInjection;

using IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((context, services) => services.AddSendGrid(options => 
        options.ApiKey = context.Configuration.GetValue<string>("SendGridApiKey")
    ))
    .Build();
var config = host.Services.GetRequiredService<IConfiguration>();


var apiKey = config.GetValue<string>("SendGridApiKey");
var fromEmail = config.GetValue<string>("FromEmail");
var fromName = config.GetValue<string>("FromName");
if(string.IsNullOrEmpty(apiKey)) throw new Exception("SendGridApiKey should not be null or empty");
if(string.IsNullOrEmpty(fromEmail)) throw new Exception("FromEmail should not be null or empty");
if(string.IsNullOrEmpty(fromName)) throw new Exception("FromName should not be null or empty");

Console.Write("To: ");
var toEmail = Console.ReadLine();

Console.Write("Subject: ");
var subject = Console.ReadLine();

Console.Write("Body: ");
var body = Console.ReadLine();

var client = host.Services.GetRequiredService<ISendGridClient>();
var msg = new SendGridMessage()
{
    From = new EmailAddress(fromEmail, fromName),
    Subject = subject,
    PlainTextContent = body
};
msg.AddTo(new EmailAddress(toEmail));
var response = await client.SendEmailAsync(msg);

// 成功ステータスコードは、SendGridがメールリクエストを受信し、処理することを意味します。
// SendGridがメールを送信しようとすると、エラーが発生することがあります。 
// メールが受信できない場合は、このURLでデバッグします: https://app.sendgrid.com/email_activity 
Console.WriteLine(response.IsSuccessStatusCode ? "Email queued successfully!" : "Something went wrong!");

ConfigureServicesに渡されたLambdaの内部で、追加のサービスを設定することができます。
このLambdaの内部で、SendGridがサービスとして追加されます。SendGridのオプションを設定するには、別の Lambdaを使用して、AddSendGridに渡します。Lambdaは複雑なため、すべての括弧の表記位置が上記のコードと一致していることを確認してください。

 前述のようにSendGridClientを構築する代わりに、プログラムがhost.Services.GetRequiredService()を使用して依存性注入コンテナからISendGridClientのインスタンスを要求するようになりました。

このアプリケーションをさらに拡張する場合、コンストラクタインジェクションを使用して任意のサービスを受け取ることもできます。

アプリケーションを再度実行し、すべてが想定通りに動作することを確認します。

dotnet run --environment Development

まとめ

Twilio SendGridは、大規模なメールの送受信に役立ちます。

SendGrid APIと.NET 6を使用して以下の手順によりメールを送信する方法を学びました。

  • 自分のメールアドレスが、メールを送信するための送信者であることを認証。
  • メール送信の権限を持つSendGrid APIキーを作成。
  • .NET 6コンソールアプリケーションを作成し、SendGrid .NET SDKを統合してメールを送信。
  • デフォルトのホストビルダーを使用し、柔軟な設定と拡張可能な依存性注入を設定。

ここで学んだことを活用し、SendGridをASP.NET Coreアプリケーションに統合することも可能です。Twilioには、他にもインテグレーション可能な製品がたくさんあります。ぜひ、ブログ記事Twilio SendGrid、C#、.NET Coreを使ってSMSを受信してメール送信する(英語)も参照してください。

その他のリソース

このチュートリアルで紹介したトピックやツールの詳細については、次のリソースを参照してください。

GitHub上のSendGrid .NET SDKソースコード

このチュートリアルで使用したSendGrid .NET SDKは、オープンソースです。このGitHubリポジトリには、.NETを使用してSendGridと統合する方法について役立つ文書があります。ソースコードを読むことで、何が起きているかを理解でき、想定通りに動作しない場合はIssueを起票できます。

コンソールアプリを設定する(Microsoft Docsより)

ホストビルダーを使用して.NETコンソールアプリケーションを設定する方法について学習できます。ドキュメントで説明されているオプションパターンを導入することで、既存のコードをさらに改良できます。

GitHub上にある、このチュートリアルのソースコード

問題が発生した場合は、このソースコードを利用できます。 また、問題が発生した際に、このGitHubリポジトリにIssueを起票できます。

Niels Swimbergheはベルギー人のソフトウェアエンジニアで、Twilioのテクニカルコンテンツクリエイターとして、米国で活動しています。Nielsへのご連絡は、Twitter @RealSwimburger にお願いします。.NET、Azure、Web開発については、swimburger.netでNielsの個人ブログをフォローいただけます。