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

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

はじめに

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

前提条件

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

  • Ruby 2.6.6
  • git
  • SendGridアカウント

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

準備

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

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

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

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

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

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

bundle install

サンプルを実行します。

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

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

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

require 'sendgrid-ruby'
require 'dotenv'
include SendGrid

# .envから環境変数を読み込む
Dotenv.load
sendgrid_api_key = ENV['API_KEY']
from = ENV['FROM']
tos = ENV['TOS'].split(',')

# メールの送信元を設定する
mail = SendGrid::Mail.new
mail.from = Email.new(email: from, name: '送信者名')

# メールの件名と本文を作成する
mail.subject = '[sendgrid-ruby-example] フクロウの名前は%fullname%さん'
mail.add_content(Content.new(type: 'text/plain', value: 'some text here'))
mail.add_content(Content.new(type: 'text/html', value: '<html><body> %familyname%さんは何をしていますか?<br>彼は%place%にいます。</body></html>'))

# 1つ目の宛先と、対応するSubstitutionタグを指定する
personalization1 = Personalization.new
personalization1.add_to(Email.new(email: tos[0]))
personalization1.add_substitution(Substitution.new(key: '%fullname%', value: '田中 太郎'))
personalization1.add_substitution(Substitution.new(key: '%familyname%', value: '田中'))
personalization1.add_substitution(Substitution.new(key: '%place%', value: '中野'))
mail.add_personalization(personalization1)

# 2つ目の宛先と、対応するSubstitutionタグを指定する
personalization2 = Personalization.new
personalization2.add_to(Email.new(email: tos[1]))
personalization2.add_substitution(Substitution.new(key: '%fullname%', value: '佐藤 次郎'))
personalization2.add_substitution(Substitution.new(key: '%familyname%', value: '佐藤'))
personalization2.add_substitution(Substitution.new(key: '%place%', value: '目黒'))
mail.add_personalization(personalization2)

# 3つ目の宛先と、対応するSubstitutionタグを指定する
personalization3 = Personalization.new
personalization3.add_to(Email.new(email: tos[2]))
personalization3.add_substitution(Substitution.new(key: '%fullname%', value: '鈴木 三郎'))
personalization3.add_substitution(Substitution.new(key: '%familyname%', value: '鈴木'))
personalization3.add_substitution(Substitution.new(key: '%place%', value: '中野'))
mail.add_personalization(personalization3)

# カテゴリ情報を付加する
mail.add_category(Category.new(name: 'Category1'))

# カスタムヘッダを利用する
mail.add_header(Header.new(key: 'X-Sent-Using', value: 'SendGrid-API'))

# 指定した画像を添付する
attachment = Attachment.new
attachment.content = Base64.strict_encode64(File.read("gif.gif"))
attachment.filename = 'owl.gif'
mail.add_attachment(attachment)

# 認証情報を指定する
sg = SendGrid::API.new(api_key: sendgrid_api_key)

# メール送信を行い、レスポンスを表示させる
response = sg.client.mail._('send').post(request_body: mail.to_json)
puts response.status_code
puts response.body
puts response.headers

解説

5~9行目

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

11〜13行目

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

15〜18行目

メールの件名と本文(text/plainおよびtext/html)を設定しています。「%fullname%」「%familyname%」「%place%」はSubstitutionタグという、宛先ごとに件名、本文に文字列を埋め込むための機能です。Substitutionタグに対応する配列は、次の21〜43行目で設定しています。

20~42行目

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

44~54行目

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

56~63行目

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

実行結果

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

宛先1で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

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

さいごに

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

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

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

参考記事

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

メールを成功の原動力に

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