Ruby on Rails

Adding a Rails Email Delivery Method to Work with SendGrid’s Web API


Hi! I’m Dennis and I’ve been working at Linkbal as a software engineer since October 2017.

In this article, we are going to create a new ActionMailer delivery method that works with SendGrid through its Web API and integrate it to a simple Rails project created with scaffolding. This post assumes you are already have some familiarity with Ruby on Rails.

Introduction

When searching for information about how to integrate Rails projects to SendGrid, we are usually presented with articles that describe how to do it through SMTP. That is the case even in SendGrid’s own Knowledge Center. This is the easiest implementation for sure as it requires very little setup.

But, what if we want to use SendGrid’s Web API instead? Well, there’s no official plug&play option as is the case for other services, such as Postmark. There are unofficial options, such as this gem, but they are not much popular and sometimes we just want a simpler email delivery implementation. In this case, we can create our own implementation to customize ActionMailer to use SendGrid’s Web API.

Preparation

Test Rails Project

Let’s create a minimal Rails project to test our implementation:

$ rails new sendgrid_integration_test
$ cd sendgrid_integration_test

Now, we are going to a very simple contact form through scaffolding:

$ rails generate scaffold Contact name:string email:string message:text
$ rails db:migrate

SendGrid API Key

To use SendGrid’s API, we need to create a new SendGrid account if we don’t have one (there’s a free trial period and, after that, we can send up to 100 emails a day for testing purposes) and create a new API key (it’s good practice to remove API keys when they are not needed anymore). It will be used for authentication and authorization when using the API. In the SendGrid dashboard, go to Settings > API Keys and click the “Create API Key” button.

Setting to manage API keys

Give it any name you want and choose the “Restricted Access” option, so we can customize the access level for the key. For this guide, it should be enough to set “Mail Send” to “Full Access”, as shown below.

Creating a SendGrid API key and customizing its permissions

Confirm and the key will be displayed to you. It is just displayed once for security reasons and the page recommends us to save it somewhere safe.

Environment Variable for the Key

We are now going to set the newly created API key as an environment variable:

$ export SENDGRID_API_KEY='api_key_copied_from_sendgrid_dashboard'

To make this permanent, add the line above to .bash_profile if you are on a Mac or to .bashrc if on Linux.

sendgrid-ruby gem

Before we start creating our new delivery method, let’s add the official Ruby API library (https://github.com/sendgrid/sendgrid-ruby). We are going to use it to communicate with SendGrid’s Web API. Just add the line below to the project’s Gemfile:

gem 'sendgrid-ruby'

And update the dependencies:

$ bundle install

New Delivery Method

The implementation of our new delivery method will be in the lib/send_grid_integration/my_delivery_method.rb file, which contents are shown below:

require 'sendgrid-ruby'

module SendGridIntegration
  class MyDeliveryMethod
    attr_accessor :settings

    # settings is a hash to be added to the configuration of the environment that will use MyDeliveryMethod
    def initialize(settings)
      self.settings = settings
    end

    def deliver!(mail)
      from = SendGrid::Email.new(email: mail.from.first)
      to = SendGrid::Email.new(email: mail.to.first)
      subject = mail.subject
      content = SendGrid::Content.new(type: 'text/plain', value: mail.body.raw_source)
      mail = SendGrid::Mail.new(from, subject, to, content)

      sg = SendGrid::API.new(api_key: settings[:sendgrid_api_key])
      response = sg.client.mail._('send').post(request_body: mail.to_json)

      Rails.logger.info("SendGrid API called. Response code: #{response.status_code}")
    end
  end
end

This was kept as simple as possible as this is not an article on how to use the official Ruby API library. It only supports text emails and does not support cc, bcc or attachments. You can take a look at the sendgrid-ruby repository for details on how to implement the missing features, especially this example file.

Initializing the New Delivery Method

We need to run some intialization code to make our new delivery method available to our application. To do so, add the code below to config/application.rb file.

require 'send_grid_integration/my_delivery_method'
ActionMailer::Base.add_delivery_method :my_send_grid, SendGridIntegration::MyDeliveryMethod

Environment Configuration

Now, we are going to configure our environment to use the new delivery method. Let’s also add a settings hash to illustrate how to pass parameters to our delivery method class. In our case, let’s configure the local environment file config/environments/development.rb by adding the lines below:

config.action_mailer.delivery_method = :my_send_grid
config.action_mailer.my_send_grid_settings = {
  sendgrid_api_key: ENV['SENDGRID_API_KEY']
}

Time to Test

At last, we are going to add a new mailer to test our delivery method. Add the app/mailers/contact_mailer.rb file with the following content:

class ContactMailer < ApplicationMailer
  def thanks(contact)
    mail(to: contact.email,
         subject: 'Thanks for the Contact',
         content_type: 'text/plain',
         body: "#{contact.name}, thanks for taking the time to contact us!")
  end
end

Using the Mailer

At last, we are going to open the app/controllers/contacts_controller.rb file to use our mailer when a new contact happens. Edit the file to add a new line as shown below:

def create
  @contact = Contact.new(contact_params)

  respond_to do |format|
    if @contact.save
      ContactMailer.thanks(@contact).deliver_now

      format.html { redirect_to @contact, notice: 'Contact was successfully created.' }
      format.json { render :show, status: :created, location: @contact }
    else
      format.html { render :new }
      format.json { render json: @contact.errors, status: :unprocessable_entity }
    end
  end
end

Run the Application

Let’s run our application:

$ rails server

And access http://localhost:3000/contacts to create a new contact. Fill the form and make sure to provide a valid email address you can access. You should receive a thanks email if the contact is saved without errors. You can monitor the emails sent by your SendGrid account by accessing the “Activity” menu in the service dashboard.

Activity menu in SendGrid dashboard


街コンジャパンの開発事例!〜Railsを使った非同期通信〜


こんにちはリンクバルの前田です。
今回は技術部の街コンジャパンチームで作っている機能のご紹介をしたいと思います。

色々あるのですが、直近だと「並び替え」機能が新しいのでこちらを紹介します。

導入背景

  • 以前より、オススメのイベントや価格の安いイベントを見つけたいという要望があった。
  • 4月中旬頃「GW前に何か実装できないか」という議論をチームメンバーで15分間行い施策案を出した。
  • 課題

  • イベント一覧ページに並び替え機能を配置する場所によっては使いづらいページになってしまう
  • 続きを読む


    PHPerだった私がRuby on Railsで最初につまづいたこと


    はじめに

    4月にリンクバルに入社しましたエンジニアの高橋です。

    私は元々PHPしかほぼ触ったことのない人間でした。
    そんな私が初めてRuby on Rails(以下Rails)に挑戦した際にぶち当たった壁とその解決法を紹介していきます。

    あまりにも初歩的な事項ですが、
    広い心でご覧いただければ幸いです。

    続きを読む


    【11/25開催】Ruby on Rails初心者ハンズオン#2~ToDoアプリを作ってみよう!~ フォローアップ


    こんにちは、リンクバル 技術部 エンジニアの中村です。

    弊社主催の2016/11/25(金)「【11/25開催】Ruby on Rails初心者ハンズオン#2~ToDoアプリを作ってみよう!~」のフォローアップを掲載いたします。

    「Ruby on Rails初心者ハンズオン」の続編の勉強会として、「タスク管理アプリ」の開発を通して、Ruby on Railsを学習します。

    シンプルなアプリケーションですが、Ruby on Railsを始めて学ぶ上で、役立つエッセンスがたくさん詰まっています。

    募集要項

    https://linkbal.connpass.com/event/44224/

    機能一覧

    • タスクの一覧表示
    • タスクの新規追加
    • タスクの編集
    • タスクの削除
    • タスクの完了チェック

    スライド

    完成版のソースコード

    後で、復習ができるように、ソースコードを共有いたします。

    https://github.com/ynakayu/todoapp

    開発環境構築

    今回は、ブラウザのみで、プログラム開発ができる、クラウドIDE「Codeanywhere」の、無料プランを利用します。

    https://codeanywhere.com/

    多くのユーザーに利用されている

    02_codeanywhere_%e5%88%a9%e7%94%a8%e8%80%85%e6%95%b0

    ※前回の勉強会で使用した、nitros.io はサービス終了。AWSに買収されて今後が期待されるCloud9 は、クレジットカード登録が必須となったため、今回は利用しません。

    トップ

    サービスサイトへ遷移

    https://codeanywhere.com/
    ※ Google Chromeの利用を推奨します。

    01_codeanywhere_top

    「Sign up for free」をクリック。

    登録情報入力

    03_codeanywhere_%e7%99%bb%e9%8c%b2%e6%83%85%e5%a0%b1%e5%85%a5%e5%8a%9b

    1. メールアドレス
    2. パスワード
    3. 私はロボットではありませんをチェック
    4. Register をクリック

    Welcome

    04_codeanywhere_welcome

    here をクリック。

    コンテナの作成

    05_codeanywhere_container

    1. Container を選択
    2. Name: Techlink
    3. Search : ruby
    4. Ruby CentOS 6.5 を選択
    5. CREATE をクリック

    06_codeanywhere_create_container

    IDEのレイアウトを使いやすいように変更しておくと便利

    07_codeanywhere_%e3%83%ac%e3%82%a4%e3%82%a2%e3%82%a6%e3%83%88

    View > Layout > Split Horizontal

    IDEの説明

    08_codeanywhere_ide%e8%aa%ac%e6%98%8e

    おわりに

    Ruby on Rails の基礎を学ぶ上で、基礎となる要素が含まれた、TODOアプリの開発を勉強しました。Ruby on Rails で開発する上きっかけになればと思っております。

    リンクバルでは、テクノロージーと人を繋ぐ勉強会テックリンクを今後も開催予定です。勉強会で取り上げて欲しいテーマなどありましたら、アンケートにご記載くださいませ。

    また、リンクバルでは、Ruby on Railsで開発された自社サービスを一緒に開発するエンジニアを募集しておりますので、興味を持っていただきましたら、ぜひお問い合わせください!


    【テックリンク】「平日の夜1時間で学ぶ!Ruby on Rails初心者ハンズオン」開催しました!

    テックリンク_平日の夜1時間で学ぶ_RubyonRails初心者ハンズオン

    エンジニア向け勉強、「テックリンク」の第1回「平日の夜1時間で学ぶ!RubyonRails初心者ハンズオン」を、2016/8/19(金)19:00-21:00 株式会社リンクバル本社にて開催いたしました。

    講師を勤めさせていただきました、新規サービス開発チーム エンジニア リーダーの中村です。

    20名を超える大勢の皆さまにお越しいただきました。ありがとうございました!

    どのような勉強会か

    概要

    「Ruby on Rails初心者ハンズオン」

    金曜日の夜にRailsを学ぼう!

    WEBサービス開発が容易なRubyonRails、この機会に学んでみませんか? 一緒に学ぶ仲間もできるかもしれません。

    複数のrails経験者がサポートします!

    参加資格

    RubyonRailsを学びたい方なら誰でも参加OKです。

    ハンズオン内容

    • Railsを選択するメリット/デメリット
    • 新規事業におけるrailsの導入事例
    • RubyonRails開発環境セットアップ(クラウド利用予定)
    • HelloWorld!
    • scaffoldを利用した開発

    タイムテーブル

    • 18時300分 受付開始!
    • 19時00分 railsハンズオン
    • 20時15分 懇親会
    • 21時00分 解散

    勉強会スライド

    テックリンクとは

    人とアイデアで世界をつなぎ社会を幸せにする未来創造企業「リンクバル」が、八丁堀のオフィスで開催するエンジニア向け勉強会です。

    勉強会や懇親会を通して、エンジニア同士のつながりを広げて参ります。

    リンクバルエンジニアの関心ごと

    RoR/objective-c/AWS/React.js/git/AI/チャット/MachineLearning/エンジニア主導の自社サービス

    おわりに

    テックリンクではこれからも、エンジニアの興味があるテーマに関する勉強会を開催する予定です。

    イベント参加ご希望の方、ご登録お待ちしております!

    テックリンクの最新情報は、conpassにて発信して行く予定です。

    リンクバルはRuby on Railsを使って自社サービスを一緒に開発するエンジニアを積極募集中です。まずは弊社のエンジニアとランチで相互理解を深めるところから始めることも可能ですので、こちらよりご相談くださいませ。よろしくお願い致します!

    関連リンク