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


参考：https://github.com/benprew/pony
参考：[毒林檎のブログ「mail送信用のgem , ponyを使う。」](http://web.sfc.keio.ac.jp/~t11240rk/blog/?p=221)
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でメールを送信する](http://qiita.com/ytr_i/items/0907ee3312ed9d79c9e8)を参考にすると、
config/environments/development.rbにパラメータを平文でかかなければならない。パスワードとか。こんなことして、うっかりgithubあたりにpushすると、自分の身があぶなくてしょうがない。

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