search
LoginSignup
0

posted at

updated at

Organization

blastengineを使ってJavaでメールを送信する

blastengineはシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先に届くようになります。

今回はblastengineを使ってJavaでメール送信を行うまでの流れを解説します。

ユーザ登録する

blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします(ユーザIDは後で使います)。

getting-started-4.jpg

送信元ドメインのSPFを設定する

送信元として利用するドメイン(自分で持っているもの)の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。

txt @ v=spf1 include:spf.besender.jp ~all

API経由で配信する

まずはAPIを使ってHTMLメールを配信する流れを紹介します。

APIキーを取得する

ログイン後、管理画面の右上にある設定メニューに移動します。

getting-started-6.jpg

そして設定の中で、APIキーを取得します。

getting-started-5.png

クラスの準備

今回は jp.blastengine というパッケージで実装していきます。まずメール送信用のJSONオブジェクトの内容を格納するクラス BEMail を用意します。

public class BEMail {
  public String subject;
	public String encode;
  public String text_part;
	public String html_part;
  public BEMailAddress from;
  public String to;
}

さらにメールアドレスを入れる BEMailAddress を用意します。

public class BEMailAddress {
  public String name;
  public String email;
}

パッケージのインポート

必要なパッケージをインポートします。

// トークン生成用
import org.apache.commons.codec.digest.DigestUtils;
import java.util.Base64;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

// HTTPリクエスト用
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.util.EntityUtils;
import org.apache.http.entity.StringEntity;
import java.io.IOException;

// JSON処理用
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

必要な変数を準備

トークンを生成するのに必要なユーザ名とAPIキーを準備します。

String username = "USERNAME";
String api_key = "APIKEY";

トークンを生成する

APIリクエストするためのトークンを生成します。手順としては次のとおりです。

  1. ユーザIDとAPIキーを連結する
  2. SHA256のハッシュを生成する
  3. ハッシュを全て小文字にする
  4. 3の文字列をBASE64エンコードする

実際のコードで言うと、次のようになります。 token がトークンです。

String digest = DigestUtils.sha256Hex(username + api_key);
String token = new String(Base64.getEncoder().encode(digest.toLowerCase().getBytes()));

メールオブジェクトの作成

BEMail のインスタンスを作成して、必要な情報をセットします。fromのemailやtoなど、メールアドレスは利用されるものに書き換えてください。

BEMail mail = new BEMail();
mail.subject = "テストメール";
mail.encode = "UTF-8";
mail.text_part = "テストメールの本文(テキスト)";
mail.html_part = "<h1>テストメールの本文(HTML)</h1>";
mail.to = "user@example.jp";
// Fromの作成
BEMailAddress fromAddress = new BEMailAddress();
fromAddress.name = "送信者サンプル";
fromAddress.email = "info@example.com";
// Fromをセット
mail.from = fromAddress;

そして mail をJSONにします。

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(mail);
StringEntity entity = new StringEntity(json, "UTF-8");

APIリクエストする

では実際にメールを送信します。APIのエンドポイントは https://app.engn.jp/api/v1/deliveries/transaction になります。生成したトークンは Authorization ヘッダーに適用します。

// HttpPostを作成
HttpPost httpPost = new HttpPost("https://app.engn.jp/api/v1/deliveries/transaction");
// ヘッダーをセット
httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
httpPost.setHeader("Authorization", "Bearer " + token);
// JSONデータをセット
httpPost.setEntity(entity);
// クライアントの作成
CloseableHttpClient client = HttpClients.createDefault();
// HTTPアクセス
CloseableHttpResponse response = client.execute(httpPost);
// 終了
client.close();

結果

レスポンスを出力します。配信ID(delivery_id)は照会、変更および削除操作に必要です。

System.out.println(EntityUtils.toString(response.getEntity()));
// { delivery_id: 9 }

全体のコード

今回のサンプルコードは次のようになります。実装時の参考にしてください。

// トークン生成用
import org.apache.commons.codec.digest.DigestUtils;
import java.util.Base64;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

// HTTPリクエスト用
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.util.EntityUtils;
import org.apache.http.entity.StringEntity;
import java.io.IOException;

// JSON処理用
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

String username = "USERNAME";
String api_key = "APIKEY";

BEMail mail = new BEMail();
mail.subject = "テストメール";
mail.encode = "UTF-8";
mail.text_part = "テストメールの本文(テキスト)";
mail.html_part = "<h1>テストメールの本文(HTML)</h1>";
BEMailAddress fromAddress = new BEMailAddress();
mail.to = "user@example.jp";
// Fromの作成
BEMailAddress fromAddress = new BEMailAddress();
fromAddress.name = "Admin";
fromAddress.email = "admin@example.com";
// Fromをセット
mail.from = fromAddress;
try {
		// トークンの生成
		ObjectMapper mapper = new ObjectMapper();
		String json = mapper.writeValueAsString(mail);
		StringEntity entity = new StringEntity(json, "UTF-8");
		String digest = DigestUtils.sha256Hex(username + api_key);
		String token = new String(Base64.getEncoder().encode(digest.toLowerCase().getBytes()));

		// HttpPostを作成
		HttpPost httpPost = new HttpPost("https://app.engn.jp/api/v1/deliveries/transaction");
		// ヘッダーをセット
		httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
		httpPost.setHeader("Authorization", "Bearer " + token);
		// JSONデータをセット
		httpPost.setEntity(entity);
		// クライアントの作成
		CloseableHttpClient client = HttpClients.createDefault();
		// HTTPアクセス
		CloseableHttpResponse response = client.execute(httpPost);
		// 終了
		client.close();
} catch (JsonProcessingException e) {
		System.out.println(e);
} catch (IOException e) {
		System.out.println(e);
}

SMTPリレーでの配信

次にSMTPリレーを使った方式です。

IPアドレスの登録

SMTPリレーを利用する場合、まず接続元サーバのIPアドレスを管理画面で登録する必要があります。

getting-started-6.jpg

IPアドレスの設定ダイアログで、接続元サーバのIPアドレスを入力してください。

getting-started-7.jpg

ライブラリのインポート

Javaで一番手軽に使えるメール配信用パッケージ javax.mail を使います。まず必要なライブラリをインポートします。

import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

プロパティのセット

次にSMTPサーバ、ポートを設定します。blastengineのSMTPサーバアドレスは smtp.engn.jp 固定になります。ポート番号は25/587/2525より選択してください。

String smtpHost = "smtp.engn.jp";
String smtpPort = "587";
Properties objPrp=new Properties();
objPrp.put("mail.smtp.host", smtpHost);
objPrp.put("mail.host", smtpHost);
objPrp.put("mail.smtp.port", smtpPort);

セッションの確立

SMTPサーバとのセッションを確立します。

// メールセッションを確立
Session session = Session.getInstance(objPrp);
MimeMessage msg = new MimeMessage(session);

メールを送信する

msg オブジェクトに必要なメール送信データを適用して、送信処理を実行します。

try {
		msg.setRecipients(Message.RecipientType.TO, "user@example.jp");
		InternetAddress objFrm= new InternetAddress("info@example.com", "送信者サンプル");
		msg.setFrom(objFrm);
		msg.setSubject("テストメール from SMTP", "UTF-8");
		msg.setText("こんにちは", "UTF-8");
		Transport.send(msg);
} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
} catch (MessagingException e) {
		e.printStackTrace();
}

まとめ

クラウドサービスではSMTPポートが塞がれている場合があるので、そうした時にはAPI経由を利用してください。SMTPリレーを使えば、より信頼性高く、安定した配信が実現できるでしょう。

APIとSMTPリレー、それぞれの要件に合わせて最適な方を選択してください。

エンジニア向けメール配信システム「ブラストエンジン」

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0