読者です 読者をやめる 読者になる 読者になる

カッパでも分かるiOSアプリゲーム開発

カッパがひたすらゲーム制作に関することを書くブログです。Railsに関するTipsもたまにまとめてます。

heroku + Rails でメールフォームを作る

スポンサードリンク

HerokuではじめるRailsプログラミング入門
f:id:InvokeTwoA:20151023183618p:plain「今までは忍者ツールのメール送信をしていたけれど……」
f:id:InvokeTwoA:20151215172640p:plain「そろそろ自立するべきですな」

まず heroic に sendgrid のアドオンを追加する

f:id:InvokeTwoA:20151023183618p:plain「無料でできるけどカード登録は必要という仕様」
f:id:InvokeTwoA:20151215172640p:plain「カード登録さえさせてしまえば後の有料課金への敷居が低くなるという作戦ですな」

※無料プラン(starter)だと1日400通まで

$ heroku addons:create sendgrid:starter

すると環境変数とか色々セットしてくれる。下記コマンドで確認可能

$ heroku config
SENDGRID_PASSWORD: *******
SENDGRID_USERNAME: *******

設定変更

$ vim config/environments/production.rb

下記を追加

  # メール設定
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address:              'smtp.sendgrid.net',
    port:                 '587',
    authentication:       :plain,
    user_name:            ENV['SENDGRID_USERNAME'],
    password:             ENV['SENDGRID_PASSWORD'],
    domain:               'heroku.com',
    enable_starttls_auto: true,
  }

設定変更したならば本番反映

$ git add .
$ git commit
$ git push home moge
$ heroku restart

動作確認

本番環境の

$ heroku run rails console

メール送信を試す

ActionMailer::Base.mail(from: "sample@sample.com", to: "sample@sample.com", subject: "title", body: "aa").deliver_now

メールフォームの作成

f:id:InvokeTwoA:20151023183618p:plain「どうせなら form_for 使いたいので、モデルなし form_for にするかー」
f:id:InvokeTwoA:20151215172640p:plain「form_tag とか使いたくないですもんね」

  • model(テーブルなし)
class MailForm
  include ActiveModel::Model

  attr_accessor :name, :title, :body, :from_mail
end
  • view
#mail_form
  = simple_form_for MailForm.new, html: { class: 'form form-horizontal'} do |f|
    .form-group
      %label.col-sm-2.control-label= f.label :name, '氏名:'
      .col-sm-5= f.text_field :name, class: 'form-control'
    .form-group
      %label.col-sm-2.control-label= f.label :title, '件名:'
      .col-sm-5= f.input_field :title, class: 'form-control'
    .form-group
      %label.col-sm-2.control-label= f.label :body, '本文:'
      .col-sm-5= f.text_field :body, as: :text, class: 'form-control'
    .form-action
      = f.submit '送信する', class: 'btn btn-primary'
  • controller

# メール送信
def create
to_address = ENV['TO_MAIL_ADDRESS']
from_address = ENV['FROM_MAIL_ADDRESS']
body = params[:mail_form][:body] << "\n game wiki 連絡フォームから送信されました。"
ActionMailer::Base.mail(from: from_address, to: to_address, subject: params[:mail_form][:title], body: body).deliver_now!
redirect_to new_mail_form_path, notice: 'メールの送信が完了しました'
rescue => e
redirect_to :back, flash: { error: "メール送信に失敗しました。間をおいて試すか、@kappa_ikemen まで連絡をください。#{e}" }
end

  • あと routing に追加し終了

総評

f:id:InvokeTwoA:20151023183618p:plain「これで何かあった時の連絡用フォームができた!」
f:id:InvokeTwoA:20151215172640p:plain「次の日から荒らしのメールが沢山来ないことを祈るばかりです。荒らし対策のロジックってどんな感じなんでしょうね」
f:id:InvokeTwoA:20151023183618p:plain「何かあってから考える、事後対応スタイル! 事故を起こすたびにエンジニアの能力は上がっていくのだなぁ」