参考:https://github.com/benprew/pony
参考:毒林檎のブログ「mail送信用のgem , ponyを使う。」
Myプロダクト:https://github.com/yasunao/web_fax
##目標:モデルAddressBookにひもづけられた複数の宛名Addressインスタンス.emailに一括送信したい!
UserモデルはDeviseで作成したモデルにメール送信用パラメータを保存するカラムが追加されている。
AddressBookモデルで「店舗一覧」や「会員一覧」や「役員一覧」等を表現。
そしてAddressBookにひも付けされた多数の宛名Addressインスタンスが存在するとする。
抜粋
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
resources :addresses do
collection do
get 'setup_mail'
post 'send_mail'
end
end
##③ビューの作成
app/views/addresses/に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に以下のアクションを追加
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に以下のクラスメソッドを追加
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ならでは、でしょう。