リンクバル

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


SIGNATEさんのData Science Competitionに出題しました


LINKBALでエンジニアをやっています磯谷です。
2018/3/20 ~ 2018/5/21の期間で、Data Science CompetitionでLINKBALのコンペを開催してもらいました。

そして7/5(木)に受賞者の方をお呼びして表彰式を行いました!

今日はそのコンペと表彰式について書かせていただきます。
↑の画像は表彰式で撮った集合写真です。

続きを読む


Alexa!スキル開発のやり方を教えて!①


4月に新卒入社しました、村上です。

私は入社前にアルバイトとして業務に携わっていたのですが、
そのアルバイト時代に「Alexaスキル」の開発を行いました。

そこで今回はその開発について振り返り、
・Alexaってそもそも何?
・Alexaスキルって何?
・どうやって開発するの?
ということを、初心者向けにご紹介したいと思います!

Alexaとは?

→Amazonが提供する「音声認識サービス」のことです。

続きを読む


Attending to the SendGrid’s Email Delivery Hands-On – Part 1


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

Today, I’d like to share how was my experience taking part in SendGrid’s mail delivery hands-on. I will mainly write about some background information and concepts that were presented and also about the first part of the hands-on, that included the initial setup, a simple email delivery test and the use of SendGrid’s dashboard to check the results.

Introduction

SendGrid is an US based company represented by KOZO KEIKAKU ENGINEERING Inc. here in Japan.

As you may already know, it provides one of the most well-known cloud-based transactional email delivery services, but also includes an email marketing platform. This article will focus on transactional emails as it was also the focus of the hands-on.

続きを読む


街コン運営をちょっとスマートにしたかった


4月よりエンジニアとして入社しました、18卒の小野と申します。

リンクバルではエンジニア採用でも当社のサービスである街コンの主催者を新人研修として行います。

今回はエンジニア目線の街コン運営について書きたいと思います

目次

・街コン運営で感じたアナログ
・改善案
・学びとおわりに

続きを読む


エンジニアが街コンのイベントスタッフをやってみた


初めまして、リンクバルのエンジニアの前田です。
今回は普段の仕事とは違うイベントスタッフとしてイベントに参加してきましたので、簡単ではありますがレポートさせて頂きます。

今回スタッフとして参加したイベントはこちらです

大規模×恋活イベント★ナイトミュージアムコン!イベント中、連絡先交換自由♪♪≪街コンジャパン主催≫

普段は会社でエンジニアとして仕事をしているのですが、イベントスタッフとして参加するのは今回初めてとなります。
しかも、開催規模が300人を超えている大規模イベントのスタッフとしての参加の為、とても緊張しました。

今回参加したイベントの大まかなスケジュールや僕の仕事内容は以下の通りでした。

当日の主なスタッフスケジュール

14:00:集合、会議室で打ち合わせ
15:15:会場の下見、各担当の確認
16:00:テーブル搬入、設営
17:00:受付開始
18:30:イベントスタート
20:30:イベント終了、後片づけ
21:00:撤収

僕のお仕事

14:00:集合、会議、打ち合わせ、会場下見
無線機チェック、名札作成などしてました。
16:00:テーブル搬入、設営
腕に力のあるスタッフは長方形のテーブルを2つ持ちで運んでいましたが、僕は1テーブルづつ運びました。
17:00:待合せスペースの入り口で弊社で開発しているマッティングアプリ「Couplink」の事前インストールチェック
Couplinkは会場でマッティングゲームをするためにインストール頂いています。
19:00:受付、Couplinkの代理投票役
※Couplinkの代理投票とは、Couplinkをインストールできなかった人でもマッティングゲームに参加することができる仕組みです。
20:30:お見送り、Together のチラシ配布
沢山チラシを受け取って頂けました!
21:00:解散

イベント参加者様を待合せスペースに迎え入れた後、イベント会場(鉄道博物館)に移動した時のイルミネーションが写真の通りでとても綺麗だったのが印象的です。

イベントスタッフは無線機で各持ち場の状況を頻繁に連絡を取り合って連携しています。
僕は受付でお客様のサポートをしたり、会場で使う荷物を取りに待機室に移動するなど臨機応変に対応していました。

イベント会場の鉄道博物館ではイベント参加者が電車にも入ることができるのですが、今回は一部の電車毎にそれぞれ以下のことができるように準備されていました。

鉄道博物館の電車内でできる4つのこと
・謎解き
・占い
・恋愛相談
・休憩

まさかここで恋愛相談ができる車両があるとは思いもしませんでしたし、鉄道博物館の関係者様にもご協力頂いた鉄道ガイドツアーはあっという間に受付締め切りで大変な人気でした!

この度、初めて鉄道博物館に入館させて頂いたのですが、珍しい電車が沢山あったり雰囲気も良かったのでプライベートでも行ってみたいと思いました。

感想

実際のイベントに参加してみると当日の大変さをしりつつも、お客様の顔が見れるので大変貴重な体験だったと思います。
イベントは2時間程度で終わりますが、企画からイベント開催まで時間を使って開催されるイベントは思い出にも残ると思うし、イベントスタッフでの参加でしたがとても心に残りました。

当社ではエンジニアの仲間を募集しております。
興味のある方はこちら↓からご応募ください。
http://linkbal.co.jp/recruit/


自動テキスト分類で経費削減٩( ‘ω’ )و


はじめまして!リンクバルでエンジニアとして働いている磯谷と申します。

先日行った機械学習系の仕事について書かせていただきます。

何番煎じかわかりませんが、よければ最後までお付き合いください( ´ ▽ ` )

 

やったこと

投稿された文章を自動でカテゴライズする。

なお言語はPythonです、jupyter notebook上でコードを書いています。

 

目的

弊社が展開しているCouplinkというサービスにおいて、投稿内容に規約違反がないかどうかをチェックしています。

今までは全て人力で行っていた分類作業に対し、マシーンラーニング導入でコスト削減!

今回は「規約違反(以下、カテゴリX)か否か」の2値分類を行った際の話を書かせていただきます。

 

続きを読む


KibanaでElasticsearchの簡単な操作をやってみる


エンジニアのクオンです。
本日はKibanaでElasticsearchの簡単な操作をやってみるというテーマについて紹介させていただきます。

振り返りですが、

Elasticsearchとは

Elasticsearch は Elastic 社が開発しているオープンソースの全文検索エンジンです。
大量のドキュメントから目的の単語を含むドキュメントを高速に抽出することができます。

Kibanaとは

KibanaはElastic社が開発しているビジュアライゼーションのためのツールで、Elasticsearchというデータベースに入っているデータを様々な形式で描画することができます。

続きを読む


Jquery Validation Pluginでフォームバリデーションを作る


初めまして。

エンジニアのクオンです。

今日はJquery Validation Pluginについて紹介させて頂きたいと思います。

Jquery Validation Pluginとは

フォーム要素内の入力部品に入力された値が正しいかを、指定したルールに基づいてチェックを行うjQueryライブラリです。
リンクはこちらです。https://jqueryvalidation.org/

続きを読む