satococoa's blog

主にサーバーサイド、Web 系エンジニアのブログです。Go, Ruby, React, GCP, ...etc.

heroku + sinatraでメールフォームを作ってみる

Salesforceに買収されたこともあり、最近またherokuが注目を浴びています。

多くのrubyistの間では数年前(?)からおなじみですが、これを機に知ったという方もいらっしゃると思います。
herokuを使うことでPHP並み、いやそれ以上に気軽にWebアプリケーションを作ることができます。ぜひその気軽さを知っていただきたいと思い、heroku + sinatraで簡単なメールフォームを作ってみました。
ruby, git, sinatra, hamlあたりは一応ある程度知っているという前提。あまり難しいことはしていないので、全く知らなくても読めると思います。)


キモとなるところを少し解説します。

ライブラリ(gem)の設定

herokuにデプロイした際に、必要なライブラリがちゃんとインストールされ、requireされるようにします。

Gemfile
source :rubygems
gem 'sinatra'
gem 'haml'
gem 'mail'
config.ru
require 'rubygems'
require 'bundler'

Bundler.require

require './app.rb'
run Sinatra::Application
Gemfileに書いたライブラリをインストールするには、以下のようにします。
$ bundle install --path bundle

これで、Gemfile.lockというファイルと、.bundle/, bundle/というディレクトリができます。
Gemfile.lockはgitでリポジトリに入れてください。.bundle/とbundle/は入れる必要はありません。

ローカルでの開発

では、肝心なアプリケーションをapp.rbに書きます。メール関連の設定をしているのは以下のコードです。
configure do
  set :root, File.dirname(__FILE__)
  set :haml => {:escape_html => true}
  set :mailto, ENV['MAILTO'] || 'YOUR_MAIL_ADDRESS' # ここで送信先を設定
end

configure :development do # 開発時用の設定
  Mail.defaults do
    delivery_method :smtp, {
      :address              => 'smtp.gmail.com',
      :port                 => 587,
      :domain               => 'localhost:9393',
      :user_name            => 'YOUR_NAME@gmail.com',
      :password             => 'YOUR_PASSWORD',
      :authentication       => :plain,
      :enable_starttls_auto => true,
    }
  end
end

configure :production do # heroku上で使われる設定
  Mail.defaults do
    delivery_method :smtp, {
      :address              => 'smtp.sendgrid.net',
      :port                 => 25,
      :domain               => ENV['SENDGRID_DOMAIN'],
      :user_name            => ENV['SENDGRID_USERNAME'],
      :password             => ENV['SENDGRID_PASSWORD'],
      :authentication       => 'plain',
      :enable_starttls_auto => true,
    }
  end
end
sinatraでの開発方法については特に書きません。shotgunというgemを使うと楽です。
また、開発時にはgmailsmtpを使ってメールを送信するようにしてみました。YOUR_NAMEやYOUR_PASSWORDをご自分のものに書き換えてください。set :mailto, ENV['MAILTO'] || 'YOUR_MAIL_ADDRESS'のYOUR_MAIL_ADDRESSも同様に、メールの送信先を入力してください。

ENV['...']というところは環境変数です。heroku上で自動的に設定されるものもありますし、自分で任意に設定することもできます。ここではENV['MAILTO']が自分で設定したもの、ENV['SENDGRID...']がSendGridというアドオンを追加したときに自動的に設定されたものです。

Herokuにデプロイ

では、ここから実際にherokuとやり取りします。(ソースコードはgitでコミットをすませておいてください。)

$ gem install heroku
$ heroku create simple-form #など、適当なアプリ名。あとで変えられます。初めての場合はここでメールアドレスやパスワードを聞かれたりします。
$ heroku config:add MAILTO='YOUR_MAIL_ADDRESS'
$ heroku addons:add sendgrid:free # 追加する前にクレジットカードの認証が必要だったはずです。(sendgrid:freeは無料で使えます。)
$ heroku config # 環境変数が見られます。
$ git push heroku master # このコマンドでデプロイ。
$ heroku open

これだけです。これで、herokuへデプロイが完了し、自動的にアプリケーションがデフォルトのブラウザで開かれたはずです。

DBの操作などは他にもたくさん記事がありますので、敢えて解説記事の若干少なめなメールフォームを作ってみました。環境変数の設定やアドオンの追加なども(さらっと)盛り込んでみましたので参考になれば幸いです。