大綱:
在 Rails 要寄發信件其實滿容易的,有內建的類別(ActionMailer)可以輕鬆的完成這件事。
寄發信件
在 Rails 內建的產生器中,除了我們常用的 scaffold、controller、model 以及 migration 之外,也可使用 mailer 這個產生器來幫你建立寄信功能所需要的基本架構。根據此次的專案,我們使用 Rails 內建的 mailer 產生器來產生需要的檔案,分別是:rails g mailer ItHelp
rails g mailer BatchTask
分別是產生給負責 Apple 的同仁以及上傳檔案時錯誤的寄發。
透過 mailer 產生器,建立了一個 ITHelpMailer、BatchTaskMailer 類別以及 app/views/batch_task_mailer
、app/views/it_help_mailer
目錄。
application_mailer.rb 檔案的內容:
class ApplicationMailer < ActionMailer::Base
layout 'mailer'
private
def subject_prefix
return '' if Rails.env.production?
"[#{Rails.env}] "
end
end
這裡定義了一個私有方法 subject_prefix 是指在不同的環境下,主題也會回傳不同。
layout 是指會去找 app/views/layouts/mailer 這個樣版。
it_help_mailer.rb 檔案的內容:
class ITHelpMailer < ActionMailer::Base
end
batch_task_mailer.rb 檔案的內容:
class BatchTaskMailer < ActionMailer::Base
end
其實 Mailer 的檔案結構,跟 Controller 有點像:
如何寄發信件呢?,這裡以 ITHelpMailer 當作範例,格式參考如下:
class ITHelpMailer < ApplicationMailer
default from: 'trck_notification@morrisonexpress.com',
to: 'trck_help@morrisonexpress.com'
def mawb214_failed(hawb_record, dn_shipment)
@hawb_record = hawb_record
@dn_shipment = dn_shipment
mail subject: "#{subject_prefix}MAWB Update (HAWB::Record ##{hawb_record.id}, DN::Shipment ##{dn_shipment.id})" \
' is failed to send EDI214'
end
def hawb214_failed(hawb_record, dn_shipment, user)
@hawb_record = hawb_record
@dn_shipment = dn_shipment
@user = user
mail subject: "#{subject_prefix}HAWB Update (HAWB::Record ##{hawb_record.id}, DN::Shipment ##{dn_shipment.id})" \
", User = #{user.email} is failed to send EDI214"
end
end
這裡分別定義了 mawb214_failed(hawb_record, dn_shipment)
以及 hawb214_failed(hawb_record, dn_shipment, user)
這兩個方法,並且各別傳了 hawb_record
, dn_shipment
, user
這三個值當參數,分別是貨物訂單、貨物種類、所屬 User,一但有任何狀況,就會寄信給 IT 通知有貨物訂單有狀況了。