iT邦幫忙

2022 iThome 鐵人賽

DAY 8
1
Modern Web

Rails,我要進來囉系列 第 8

第八天:ActionMailer 串 AWS SES 寄信

  • 分享至 

  • xImage
  •  

開場白

鼬~~哩賀,我是寫程式的山姆老弟,昨天跟大家一起看了一點 ActionMailer 的使用方式,但只是像昨天那樣設定的話,對方是收不到信的,今天就來看一下 ActionMailer 怎麼跟第三方 Email Service 串接,夠夠~

我們使用 AWS 的 SES(Simple Email Service) 來幫我們寄信

設定 AWS SES (Create Identity)

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day8-1.png

可以選擇是「網域的擁有者」或是「Email Address 的擁有者」,如果你是選網域驗證的話,之後寄信就可以透過多個 email address 當作寄件者;如果選 Email address 驗證的話,那就只能用你驗證的那一個 Email address 來當作寄件者

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day8-2.png

往下會看到進階的 DKIM 設定,我們選預設的 Easy DKIM,RSA_2048_BIT 就好,待會解釋這個 DKIM 是在做什麼的~

告訴 SES,我是這個網域的擁有者 (Domain Authentication)

有兩種方式驗證網域擁有權,一種是在 DNS 加入 TXT record,另一種是 DKIM(DomainKeys Identified Mail) ,兩種都可以,AWS 建議我們使用 DKIM 來驗證,Google 有寫篇文章幫忙解釋為什麼要用 DKIM,簡單來說就是 DKIM 能確認 email 沒有被盜用者修改過,會提高 email 的可信度

使用 DKIM 的方法,是透過在 DNS 新增三個 CNAME records,展開 Publish DNS records 的部分,這三個 CNAME records 就是要給你在 DNS 新增的

等你新增完後,過幾分鐘,重新整理頁面就轉成 Sucessful,如果過幾分鐘都沒變 Successful,那有可能就是你設定錯了 XD

展開 Publish DNS records 之後,就可以看到要新增的 records 囉

展開 Publish DNS records 之後,就可以看到要新增的 records 囉

同時也可以新 MXTXT 兩個 records,來開啟 custom MAIL FROM domain,就可以用 subdomain 來寄信,這個就看需求了,不一定要啟用

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day8-4.png

到 DNS 管理商那邊,新增 3 個 CNAME records 來完成 DKIM 驗證

到 DNS 管理商那邊,新增 3 個 CNAME records 來完成 DKIM 驗證

告訴 ActionMailer,透過什麼服務來寄信 (串 AWS SES)

點選左邊選單的 SMTP settings,再點右上角的 Create SMTP Credentials

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day8-6.png

這邊的 CSS 跑掉拉,AWS 工程師在幹嘛!氣氣氣 XD,輸入一個名字之後,點右下角的 Create,就會自動在 IAM 產生一個 user 囉

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day8-7.png

然後就產生一組 SMTP UsernameSMTP Password 囉,這個存下來,待會在 Rails 的設定中會用到

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day8-8.png

再來 Rails 中的 config/environments/development.rb 設定

# config/environments/development.rb
Rails.application.configure do
	config.action_mailer.raise_delivery_errors = true # 方便檢查錯誤
	config.action_mailer.delivery_method = :smtp
	config.action_mailer.smtp_settings = {
    :address => "email-smtp.us-east-1.amazonaws.com",
    :port => 587,
    :user_name => Rails.application.credentials.dig('aws', 'ses_username'), # Your SMTP user here.
    :password => Rails.application.credentials.dig('aws', 'ses_password'), # Your SMTP password here.
    :authentication => :login,
    :enable_starttls_auto => true
	}
	...
end

SMTP Username 和 SMTP Password 建議是使用 $ rails credentials:edit 把重要資訊帶進去,或是環境變數的方式帶入~

使用 SES 前,有一點提醒!

剛開始使用 SES 會是預設 sandbox 模式,在這個模式除了有寄信數量的限制之外(每24小時最多200封、每秒最多一封),最嚴重的是,你只能寄信給同一個網域的 email address,例如我申請的 relacs-studio.com 這網域,那我只能寄信 xxx@relacs-studio.com 的人,不能寄給 gmail、hotmail、yahoo,這一點比較麻煩,然後如果要從 sandbox 模式轉為 production 模式的話,需要填寫一些「關於你會怎麼使用 SES 」的問題,寫得不夠詳細,還真的會被客服擋下來,以下是我的範例 XD

https://raw.githubusercontent.com/shrimp509/my-img-host/master/relacs-studio/Rails%E6%88%91%E8%A6%81%E9%80%B2%E4%BE%86%E5%9B%89/day8-9.png

總結

總體來說,使用 SES 不會很麻煩,跟 ActionMailer 串接也只有幾行設定而已,而且 SES 每個月有 62000 封 mail 免費(如果是使用 EC2 來發才有的優惠),但還是要付流量的錢拉,如果信件的圖片、檔案都不大的話,那應該是幾乎不用錢,如果不是使用 AWS EC2 的話,那應該也還行,1000 封才 0.1 美金,可以去跟其他 Email Service Provider(ESP) 比價看看


上一篇
第七天:ActionMailer 跟 Controller 很像!?
下一篇
第九天:ActionCable = Rails + websocket
系列文
Rails,我要進來囉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言