2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-16

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

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

ユーザ登録する

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

ライブラリのインストール

今回はHTTPアクセス用にhttp.rbを利用します。HTTPartyやRestClientも有名ですが、それらと比べると軽量なライブラリとなっています。

$ gem install http

ライブラリの読み込み

ではここからコードを書いていきます。まず必要なライブラリを読み込みます。

# 必要なライブラリの読み込み
require 'http'
require 'digest/sha2'
require 'base64'

必要な変数を取得

今回はターミナル(コマンドプロンプト)から実行します。その際にユーザIDとAPIキーを渡す仕組みにしますので、スクリプト側で入力値を受け取ります。また、両方とも必須なので、入力がなかったらエラーとします。

# ユーザIDとAPIキーを取得
user_id = ENV['BE_USERID'];
api_key = ENV['BE_APIKEY'];
if !user_id
	puts 'ユーザIDは必須です';
	exit;
end
if !api_key
	puts 'APIキーは必須です';
	exit;
end

トークンを生成する

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

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

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

# トークンの作成
str = "#{user_id}#{api_key}";
token = Base64.urlsafe_encode64 Digest::SHA256.hexdigest(str).downcase

APIリクエストする

では実際にメールを送信します。APIのエンドポイントは https://app.engn.jp/api/v1/deliveries/transaction になります。生成したトークンは Authorization ヘッダーに適用します。fromのemailやtoなど、メールアドレスは利用されるものに書き換えてください。

# APIエンドポイント
url = 'https://app.engn.jp/api/v1/deliveries/transaction'

# 送信するデータを作成
data = {
	from: {
		email: 'sample@example.jp',
		name: '送信者サンプル'
	},
	to: 'to@example.com',
	subject: 'テスト件名',
	encode: 'ISO-2022-JP',
	text_part: 'テスト配信',
	html_part: '<!DOCTYPE html><html><header></header><body>sample html</body></html>'
}

# ヘッダー
header = {
	'Content-Type': 'application/json',
	'Authorization': "Bearer #{token}"
}

# HTTPクライアントの作成
http = HTTP
  .headers(header)
  .accept(:json)
# API実行
res = http.post(url, json: data)

結果

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

puts res.body
# { delivery_id: 9 }

実行する

では実際にターミナル、またはコマンドプロンプトから実行してみます。 YOUR_USER_IDYOUR_API_KEY はそれぞれ皆さんのものに置き換えてください。

$ BE_USERID=YOUR_USER_ID BE_APIKEY=YOUR_API_KEY ruby api.rb
{ delivery_id: 9 }

全体のコード

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

# 必要なライブラリの読み込み
require 'http'
require 'digest/sha2'
require 'base64'

# ユーザIDとAPIキーを取得
user_id = ENV['BE_USERID'];
api_key = ENV['BE_APIKEY'];
if !user_id
	puts 'ユーザIDは必須です';
	exit;
end
if !api_key
	puts 'APIキーは必須です';
	exit;
end

# トークンの作成
str = "#{user_id}#{api_key}";
token = Base64.urlsafe_encode64 Digest::SHA256.hexdigest(str).downcase

# APIエンドポイント
url = 'https://app.engn.jp/api/v1/deliveries/transaction'

# 送信するデータを作成
data = {
	from: {
		email: 'sample@example.jp',
		name: '送信者サンプル'
	},
	to: 'to@example.com',
	subject: 'テスト件名',
	encode: 'ISO-2022-JP',
	text_part: 'テスト配信',
	html_part: '<!DOCTYPE html><html><header></header><body>sample html</body></html>'
}

# ヘッダー
header = {
	'Content-Type': 'application/json',
	'Authorization': "Bearer #{token}"
}

# HTTPクライアントの作成
http = HTTP
  .headers(header)
  .accept(:json)
# API実行
res = http.post(url, json: data)
# レスポンス
puts res.body

SMTPリレーでの配信

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

IPアドレスの登録

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

getting-started-6.jpg

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

getting-started-7.jpg

ライブラリのインストール

今回はRubyで最も標準的と思われる mail を利用します。

gem install mail

ライブラリの読み込み

ではここからコードを記述していきます。まず必要なライブラリを読み込みます。

require 'mail'

SMTPサーバの指定

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

Mail.defaults do
  delivery_method :smtp, address: 'smtp.engn.jp', port: 587
end

メール配信する

後はメールオブジェクトを作り、deliverメソッドで送信を実行します。

mail = Mail.new do
  from   'from@example.jp'
  to       'to@example.com'
  subject  'HTMLメール'
	text_part do
		content_type 'text/plain; charset=UTF-8'
  	body     'これはHTMLメールです'
	end
	html_part do
		content_type 'text/html; charset=UTF-8'
		body '<html><body><h1>これはHTMLメールです</h1></body></html>'
	end
end

# 送信
mail.deliver

全体のコード

全体のコードは次のようになります。実装時の参考にしてください。

require 'mail'

Mail.defaults do
  delivery_method :smtp, address: 'smtp.engn.jp', port: 587
end

mail = Mail.new do
  from   'from@example.jp'
  to       'to@example.com'
  subject  'HTMLメール'
	text_part do
		content_type 'text/plain; charset=UTF-8'
  	body     'これはHTMLメールです'
	end
	html_part do
		content_type 'text/html; charset=UTF-8'
		body '<html><body><h1>これはHTMLメールです</h1></body></html>'
	end
end

# 送信
mail.deliver

送信後のメールオブジェクト

メールを送信した後のmailを出力すると、次のような内容が確認できます。これはメールのソースと一致するものになります。

Date: Tue, 14 Dec 2021 14:19:02 +0900
From: from@example.com
To: to@example.com
Message-ID: <61b829468797d_17ab73fe287032010618fd@localpc.local.mail>
Subject: =?UTF-8?Q?HTML=E3=83=A1=E3=83=BC=E3=83=AB?=
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--==_mimepart_61b8294662856_17ab73fe2870320106171e";
 charset=UTF-8
Content-Transfer-Encoding: 7bit


----==_mimepart_61b8294662856_17ab73fe2870320106171e
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: base64

44GT44KM44GvSFRNTOODoeODvOODq+OBp+OBmQ==

----==_mimepart_61b8294662856_17ab73fe2870320106171e
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: base64

PGh0bWw+PGJvZHk+PGgxPuOBk+OCjOOBr0hUTUzjg6Hjg7zjg6vjgafjgZk8
L2gxPjwvYm9keT48L2h0bWw+

----==_mimepart_61b8294662856_17ab73fe2870320106171e--

まとめ

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

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

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

2
0
0

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
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?