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

JavaからSendGrid公式ライブラリを使ってメールを送る方法

はじめに

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

前提条件

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

  • Java 11
  • gradle
  • git
  • SendGridアカウント

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

準備

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

git clone git@github.com:sendgridjp/sendgridjp-java-example.git

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

cd sendgridjp-java-example
cp app\src\main\resources\.env.example cp app\src\main\resources\.env

.envファイルを編集(後述)します。

gradleによる依存関係の解決とビルドを行います。

gradle build

サンプルを実行します。

./run.sh

.envファイルの編集

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

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

https://github.com/SendGridJP/sendgridjp-java-example/blob/master/app/src/main/resources/.env.example

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

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

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

package com.github.sendgridjp;

import java.io.IOException;
import java.nio.file.*;
import java.util.*;
import java.util.Base64.Encoder;
import java.util.stream.Collectors;

import com.sendgrid.*;
import com.sendgrid.helpers.mail.Mail;
import com.sendgrid.helpers.mail.objects.*;

import io.github.cdimascio.dotenv.Dotenv;

public class SendGridJavaExample {
    public static void main(String[] args) throws IOException {
        Dotenv dotenv = Dotenv.load();
        String apiKey = dotenv.get("API_KEY");
        List<Email> tos = Arrays.asList(dotenv.get("TOS").split((","))).stream().map(to -> new Email(to)).collect(Collectors.toList());
        Email from = new Email(dotenv.get("FROM"), "送信者");

        String subject = "[sendgrid-java-example] フクロウのお名前はfullnameさん";
        String plainTextContent = "familyname さんは何をしていますか?\r\n 彼はplaceにいます。";
        String htmlContent = "<strong> familyname さんは何をしていますか?</strong><br />彼はplaceにいます。";
        Mail msg = new Mail();
        msg.setSubject(subject);
        msg.setFrom(from);
        msg.addContent(new Content("text/plain", plainTextContent));
        msg.addContent(new Content("text/html", htmlContent));
        msg.addCategory("category1");
        msg.addHeader("X-Sent-Using", "SendGrid-API");
        
        Attachments attachment = new Attachments();
        attachment.setContent(Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get("src/main/resources/gif.gif"))));
        attachment.setFilename("owl.gif");
        attachment.setType("image/gif");
        attachment.setDisposition("attachment");
        msg.addAttachments(attachment);

        Personalization p1 = new Personalization();
        p1.addTo(tos.get(0));
        p1.addSubstitution("fullname", "田中 太郎");
        p1.addSubstitution("familyname", "田中");
        p1.addSubstitution("place", "中野");
        msg.addPersonalization(p1);

        Personalization p2 = new Personalization();
        p2.addTo(tos.get(1));
        p2.addSubstitution("fullname", "佐藤 次郎");
        p2.addSubstitution("familyname", "佐藤");
        p2.addSubstitution("place", "目黒");
        msg.addPersonalization(p2);

        Personalization p3 = new Personalization();
        p3.addTo(tos.get(2));
        p3.addSubstitution("fullname", "鈴木 三郎");
        p3.addSubstitution("familyname", "鈴木");
        p3.addSubstitution("place", "中野");
        msg.addPersonalization(p3);

        SendGrid sg = new SendGrid(apiKey);
        Request req = new Request();
        req.setMethod(Method.POST);
        req.setEndpoint("mail/send");
        req.setBody(msg.build());
        Response response = sg.api(req);
        System.out.println(response.getStatusCode());
        System.out.println(response.getBody());
        System.out.println(response.getHeaders());
    }
}

https://github.com/SendGridJP/sendgridjp-java-example/blob/master/app/src/main/java/com/github/sendgridjp/SendGridJavaExample.java

解説

17~20行目

環境変数からSendGridの認証情報、送信元アドレス、宛先リストを読み込んでいます。

22~29行目

メールの件名と本文(text/plainおよびtext/html)、送信元を設定しています。

30~38行目

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

40~59行目

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

Substitutionタグは宛先ごとに件名、本文に文字列を埋め込むための機能です。addSubstitutionメソッドの2番目の引数で指定した各値が22~24行目で指定したタグに反映されます。

61~69行目

メールを送信してレスポンスを出力しています。

実行結果

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

宛先1で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

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

さいごに

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

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

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

参考記事

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

メールを成功の原動力に

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