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

Rubyからsendgrid_ruby gemを使ってメールを送る方法

はじめに

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

前提条件

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

本記事の内容はUbuntu上に環境構築したものですが、その他のOSでも基本的に手順は同じです。Windowsの場合、cpはcopyコマンドに読み替えてください。なお、SendGrid公式ライブラリ(sendgrid-ruby)はバージョン1.1.5を使用しています。

準備

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

git clone https://github.com/sendgridjp/sendgridjp-ruby-example.git

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

cd sendgridjp-ruby-example
cp .env.example .env

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

bundlerによる依存関係の解決を行います。

bundle install

サンプルを実行します。

ruby sendgridjp-ruby-example.rb

.envファイルの編集

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

API_KEY=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
    送信元アドレスを指定してください。

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

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

# -*- encoding: utf-8 -*-
require 'sendgrid-ruby'
require 'dotenv'

Dotenv.load

api_key = ENV['API_KEY']
from = ENV['FROM']
tos = ENV['TOS'].split(',')


client = SendGrid::Client.new do |c|
  c.api_key  = api_key
end

header = Smtpapi::Header.new
header.add_to(tos)
  .add_substitution('fullname', ['田中 太郎', '佐藤 次郎', '鈴木 三郎'])
  .add_substitution('familyname', ['田中', '佐藤', '鈴木'])
  .add_substitution('place', ['office', 'home', 'office'])
  .add_section('office', '中野')
  .add_section('home', '目黒')
  .add_category('category1')

mail = SendGrid::Mail.new do |m|
  m.to = from   # dummy address
  m.from = from
  m.from_name = '送信者名'
  m.subject = '[sendgrid-ruby-example] フクロウのお名前はfullnameさん'
  m.text = "familyname さんは何をしていますか?rn 彼はplaceにいます。"
  m.html = '<strong> familyname さんは何をしていますか?</strong><br />彼はplaceにいます。'
  m.smtpapi = header
  m.add_attachment('gif.gif', 'owl.gif')
end

puts client.send(mail).inspect

解説

5~9行目

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

17行目

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

18~20行目

Substitutionタグに対応する配列を設定しています。Substitutionタグは宛先ごとに件名、本文に文字列を埋め込むための機能です。2番目の引数で指定した配列の要素が13行目で指定した宛先の各要素に対応しています。

21~22行目

Sectionタグで置換する文字列を設定しています。Sectionタグは対応する文字列に置換されます。複数箇所に同じ文字列を埋め込みたい場合に使用します。

23行目

カテゴリを設定しています。カテゴリを指定しておくと、カテゴリごとにメール配信に関わる統計情報を取得することができるようになります。

27~28行目

送信元アドレス、送信者名を設定しています。

29~31行目

メールの件名と本文(text/plainおよびtext/html)を設定しています。「fullname」「familyname」「place」というSubstitutionタグ(後述)と、「office」「home」というSectionタグ(後述)を埋め込んでいます。尚、タグでスペースは使用できません。

33行目

添付ファイルを設定しています。

36行目

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

実行結果

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

宛先1で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

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

さいごに

SendGrid公式ライブラリを利用すると、複雑なSMTPプロトコルに触れることなく簡単にメール送信を行うことができます。文字の埋め込みやカテゴリ指定なども簡単です。

また、バウンス時の処理や配信停止の管理、送信ドメイン認証の設定などもSendGridに任せることができるので、開発工数を大幅に削減することができます。

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

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