7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

rails4におけるmail送信用gem Ponyの使い方

Last updated at Posted at 2014-10-04

参考:https://github.com/benprew/pony
参考:毒林檎のブログ「mail送信用のgem , ponyを使う。」
Myプロダクト:https://github.com/yasunao/web_fax

##目標:モデルAddressBookにひもづけられた複数の宛名Addressインスタンス.emailに一括送信したい!
UserモデルはDeviseで作成したモデルにメール送信用パラメータを保存するカラムが追加されている。
AddressBookモデルで「店舗一覧」や「会員一覧」や「役員一覧」等を表現。
そしてAddressBookにひも付けされた多数の宛名Addressインスタンスが存在するとする。

schema.rb
抜粋
create_table "address_books", force: true do |t|
    t.string   "name",        null: false
    t.string   "name_kana"
    t.string   "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
  end

  create_table "addresses", force: true do |t|
    t.string   "name",                            null: false
   t.string   "email"
    t.integer  "address_book_id",                 null: false
    t.datetime "created_at"
    t.datetime "updated_at"
    t.boolean  "flag_sending",    default: false
  end

  create_table "users", force: true do |t|
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,     null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "name",                   default: ""
    t.string   "name_kana",              default: ""
    t.string   "zip"
    t.string   "address"
    t.string   "tel"
    t.string   "fax"
    t.boolean  "admin",                  default: false
    t.string   "mail_delively_method",   default: ""
    t.string   "smtp_address",           default: ""
    t.integer  "smtp_port"
    t.string   "smtp_authentication",    default: ""
    t.string   "smtp_user",              default: ""
    t.string   "smtp_password",          default: ""
    t.string   "smtp_domain",            default: ""
  end

##①Gemfileに記述

gem ‘pony’

$ bundle install

##②config/routes.rb

config/route.rb
resources :addresses do
  collection do
    get 'setup_mail'
    post 'send_mail'
  end
end

##③ビューの作成
app/views/addresses/にsetup_mail.html.erbファイルを作成し、下記のように記載する。

setup_mail.html.erb
<h1>メール送信 設定画面</h1>
<%= form_tag({controller: "addresses", action: "send_mail", method: "post"}, {multipart: true}) do %>
  <div class="field">
  <%= label_tag "住所録を選択" %>
  <%= collection_select(:address_book, :id, @address_books, :id, :name, :prompt => "選択してください") %><br>
    <%= label_tag "subject:" %><br>
    <%= text_field_tag :subject %>

    <%= label_tag "body:" %><br>
    <%= text_area_tag :body %>

    <%= label_tag "添付ファイルを選択" %><br>
    <%= file_field_tag :file %>
  </div>
  <div class="actions">
    <%= submit_tag "上記の設定でメールを送信する"%>
  </div>
<% end %>

##④コントローラーの作成
Addresses_controller.rbに以下のアクションを追加

Addresses_controller.rb

  def setup_mail
    @address_books=AddressBook.whose_by_id(User.current_user.id)
  end
  def send_mail
    respond_to do |format|
      if Address.send_mail_fax(params[:file],params[:address_book][:id],params[:subject],params[:body])
        format.html { redirect_to addresses_path, :notice => "送信に成功しました。" }
        format.json { head :no_content }
      else
        format.html { redirect_to addresses_path, :notice => "送信に失敗しました。" }
        format.json { head :no_content }
      end
    end
  end

##⑤モデルの実装
address.rbに以下のクラスメソッドを追加

app/models/address.rb

def self.send_mail(file,address_book_id,subject,body)
    address_book=AddressBook.find(address_book_id)
    user=User.current_user
    address_book.addresses.each do |address|
      Pony.mail(:to => address.email,
        :from => user.email,
        :body => body,
        :subject => subject, 
        :attachments => {file.original_filename => file.read},
        :via => :smtp,
        :via_options => {
          :openssl_verify_mode => OpenSSL::SSL::VERIFY_NONE,
          :enable_starttls_auto => true,
          :address => user.smtp_address,
          :port => user.smtp_port,
          :user_name => user.smtp_user,
          :password => user.smtp_password,
          :authentication => user.smtp_authentication.to_sym,
          :domain => user.smtp_domain
        }
      )
    end
end

##考察

RailsのActionMailerでメールを送信するを参考にすると、
config/environments/development.rbにパラメータを平文でかかなければならない。パスワードとか。こんなことして、うっかりgithubあたりにpushすると、自分の身があぶなくてしょうがない。

複数のUserインスタンスをもつことで、送信元のメールアドレスや送信パラメータが保持できる。会社用、個人用、組織用、部署用と状況に応じたログインをすることで、設定を切り替えられる。これはPonyならでは、でしょう。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?