C#でメール送信!SendGridを使って簡単に実装する方法

C#でメール送信!SendGridを使って簡単に実装する方法

はじめに

今回はC#からSendGrid公式ライブラリを使ってメールを送る方法をサンプルコードを交えながらご紹介します。メール文面(件名、本文)への文字列埋め込み、日本語、添付ファイルなどを利用しています。

前提条件

サンプルコードを試す前に以下の環境のセットアップを完了しておいてください。

本記事の内容はWindows 10上に環境構築したものを利用しています。なお、SendGrid公式ライブラリ(sendgrid-csharp)はバージョン9.22.0を使用しています。

準備

コードサンプルをリポジトリからクローンします。

git clone git@github.com:SendGridJP/sendgridjp-csharp-example.git

リポジトリ内に移動して.env.exampleをコピーします。

cd sendgridjp-csharp-example
cp .env.example .env

Visual Studio Codeでサンプル内のsendgridjp-csharp-exampleフォルダを開き、先ほどコピーした.envファイルを編集(後述)します。
編集が終わったらビルドして実行します。

dotnet build
dotnet run

.envファイルの編集

.envファイルは以下のような内容になっています。

API_KEY=your_api_key
TOS=you@youremail.com,friend1@friendemail.com,friend2@friendemail.com
FROM=you@youremail.com

API_KEY:SendGridのAPI Key(Mail SendへのFULL ACCESSパーミッションが必要)を指定してください。
TOS:宛先をカンマ区切りで指定してください。サンプルコードの関係上、宛先は3つ以上指定してください。
FROM:送信元アドレスを指定してください。

メール送信サンプルコード

今回使用したサンプルコード(SendGridCsharpExample.cs)を以下に示します。

using System;
using System.Linq;
using System.Collections.Generic;
using SendGrid.Helpers.Mail;
using SendGrid;
using System.Threading.Tasks;
using System.IO;

namespace sendgridjp_csharp_example
{
    class SendGridCsharpExample
    {
        static async Task Main(string[] args)
        {
            DotNetEnv.Env.Load(".env");
            var apiKey = Environment.GetEnvironmentVariable("API_KEY");
            var tos = Environment.GetEnvironmentVariable("TOS").Split(',').Select(to => new EmailAddress(to)).ToList();
            var from = new EmailAddress(Environment.GetEnvironmentVariable("FROM"), "送信者名"););

            var subject = "[sendgrid-c#-example] フクロウのお名前はfullnameさん";
            var plainTextContent = "familyname さんは何をしていますか?\r\n 彼はplaceにいます。";
            var htmlContent = "<strong> familyname さんは何をしていますか?</strong><br />彼はplaceにいます。";
            var msg = MailHelper.CreateSingleEmailToMultipleRecipients(from, tos, subject, plainTextContent, htmlContent);
            msg.AddSubstitutions(new Dictionary<string, string> {{"fullname", "田中 太郎"}, {"familyname", "田中"}, {"place", "中野"}}, 0);
            msg.AddSubstitutions(new Dictionary<string, string> {{"fullname", "佐藤 次郎"}, {"familyname", "佐藤"}, {"place", "目黒"}}, 1);
            msg.AddSubstitutions(new Dictionary<string, string> {{"fullname", "鈴木 三郎"}, {"familyname", "鈴木"}, {"place", "中野"}}, 2);
            msg.AddCategory("category1");
            msg.AddHeader("X-Sent-Using", "SendGrid-API");
            var image = Convert.ToBase64String(File.ReadAllBytes("gif.gif"));
            msg.AddAttachment("owl.gif", image, "image/gif", "attachment");

            var response = await client.SendEmailAsync(msg);
            Console.WriteLine(response.StatusCode);
            Console.WriteLine(response.Headers);
            Console.WriteLine(response.Body.ReadAsStringAsync().Result);
        }
    }
}

解説

15~18行目

.envファイルからSendGridの認証情報、宛先リスト、送信元アドレスを読み込んでいます。

20~22行目

メールの件名と本文(text/plainおよびtext/html)を設定しています。宛先ごとに件名、本文に文字列を埋め込むためにSubstitution機能を使います。「fullname」「familyname」「place」の各Substitutionタグの内容が変わります。

23行目

送信元アドレス、宛先リスト、件名と本文を設定しています。宛先を複数指定しても配信されたメールの宛先には他の宛先が見えることはありません。受信者のアドレスのみ設定されます。
また、複数の宛先を指定した場合でも送信リクエストは1回となるため、大量の宛先に対して高速に送信処理要求を送ることが可能です。宛先リストは最大で1,000アドレスまで指定可能です。

24~26行目

Substitutionタグに対応するリストを設定しています。AddSubstitution()の2番目の引数で指定した値が17行目で指定した宛先リストの要素に対応しています。

27~30行目

カテゴリ、カスタムヘッダ、添付ファイルを設定しています。カテゴリを指定しておくと、カテゴリごとにメール配信に関わる統計情報を取得することができるようになります。

32~36行目

メールを送信して結果を出力しています。

実行結果

各宛先には次のようなメールが配信されます。
宛先には、自分のみが設定されていることがわかります。
また、Substitutionタグが指定した文字列に置換されていることが確認できます。

宛先1で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

送信元アドレスに「sendgrid.net経由」と表示されているのは
Domain Authenticationを設定していないためです。正しく設定することで、独自ドメインからメールを送信したように表示することができます。

さいごに

SendGrid公式ライブラリを利用すると、複雑なSMTPプロトコルに触れることなく簡単にメール送信を行うことができます。文字の埋め込みやカテゴリ指定なども簡単です。
また、バウンス時の処理や配信停止の管理、送信ドメイン認証の設定などもSendGridに任せることができるので、開発工数を大幅に削減することができます。

SendGridのフリートライアル(無期限)へのお申込みはこちらから。

その他の言語については、メール送信チュートリアル【まとめ】 をご覧ください。

参考記事

その他の機能の使い方については、リポジトリに含まれるサンプルコードをご確認ください。

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。