進度條

[Ruby on rails] 常用功能#01. 如何透過 Rails 實現寄信的功能

在現今的網站中,網站寄送郵件是一件很基本不過的事,在Rails裡面的實現當然很簡單啊!

作者: 進度條編輯群 更新日期:

此文章也有影片介紹,可以搭配影片一起學習!

01. SMTP email 寄送 (所屬課程)


以下正式開始文章


在現今的網站中,網站寄送郵件是一件很基本不過的事,這個應用簡單舉例如下
 

網路購物:

當我們在某個電商網站看到一個喜歡的商品,從下定到最後付款,我們的信箱,都會收到類似的郵件。


加入會員:

當我們要加入某一個網站,註冊會員時,通常也都會收到類似註冊確認信的通知。

 

大型銀行:

可能於某個時間點,登入到我們個人的網路銀行,銀行也會發出一個通知信。等等很多的例子.....

 

哪在 rails 也可以辦到這樣的功能嗎? 當然可以,此章節就是教導我們,如何使用這個功能。
 


在 rails 裡寄信是很基本的功能之一,因此是不需要另外安裝任何套件以及是透過 SMTP 來實現此功能。
Rails 關於寄送郵件的說明(英文):Action Mailer Basics
Rails 關於寄送郵件的說明(中文):Action Mailer 基礎
 

 


本次將以 Gmail 做為說明,請還沒有 Gmail 信箱的讀者們,趕快去註冊一個吧。(注意,Gmail SMTP有些同學怎麼試都無法通過,可嘗試註冊使用微軟 Outlook,內容與WordPress課程大同小異,所以附上WordPress介面的SMTP影片連結(屬於免費預覽)。)

 

注意:

雖然筆者這些年照著以下方式做都還是可以成功,但是老實講Gmail的失敗率很高,因為它們並不推廣SMTP的方式,而且如果你是用商業方案G Suite的話,已經確定在2020/02/15 停用安全性較低的應用(LSA)的方式所以以下SMTP方式就不適用,一定要用OAuth 2的方式。
  
  
但是OAuth2 的技術本身對於本地端(localhost 或 127.0.0.1 )是不支援的,因為需要雙向訪問,本地端一般沒特別設定無法被訪問,所以使用MAMP開發時還是用SMTP比較理想。
  
  
因此可以參考上面的微軟outlook影片,使用outlook信箱完成開發環境,畢竟開發用的Email信箱沒有必要跟真實的信箱一樣,能寄送即可。

 

 

 

此為 Gmail 信箱登入時的頁面

 

步驟一:
建立一個頁面方便驅動寄信這個動作。

 

 

 

這裡我們是使用HomeController底下設定一個 send_mail 的方法。當然這不符合Restful,不過我們只是要一個驅動點練習,所以先忽略。

 

 

請在 home_controller 裡,定義 send_mail 這個action。

裡面的 MailMailer.send_a_test_mail() 是預設的,可以直接使用。

 

寄送完以後就redirect_to 回到首頁。

 

 

配合路徑的設定,我們定義一個名為 send_mail (寄信)功能程式碼

 

 

接下來撰寫首頁 index.html.erb 的程式碼,放一個連結通到send_mail。

 

 

 

之後按下送信這個動作,就應該要可以送出信,但是因為我們都還沒有連接好,所以先擺著。

 

 

 

步驟二:

再來就是SMTP設定。

 

我們是透過 SMTP (第三方)服務來完成寄信的功能,基本設定如下:
路徑為:config/environments 資料夾,這個資料夾裡分別為 development (開發環境)、production (正式上線)、test (測試) 3種環境。

 

沒有特別做連接的話,每個環境都要各自設定,當然如果想要的話,可以使用相同或是不同的信箱在不同的環境裡。
 

 

config.action_mailer.default_url_options = {protocol: 'http', host: 'localhost:3000'} 
這是預設要連回的網路位址。

 

config.action_mailer.delivery_method = :smtp
這是預設基本要使用 smtp的功能。

 


 

config.action_mailer.raise_delivery_errors = true
建議可以改成 true,這樣可以提早發現錯誤,開發階段可以打開。 

 

config.action_mailer.perform_deliveries = true
這是問我們是不是真的要發出Email信件,開發階段的時候可以先不要真的發,當然至少發出一封過才會比較安心,要發出設true。

 

 

接下來是針對Gmail寄信的來做解釋。
address、port 是 Google 提供的。

user_name、password 是我們個人 Gmail 信箱的帳號及密碼,但在實務上,我們其實並不會將帳號密碼寫進config裡面,而是希望拆出來另存一個設定檔,因為rails的設定檔內容有點多,所以大多會想寫入版本管理。但是帳號密碼最好不要進入版本管理,所以就會需要獨立出來並且做.gitignore忽略掉(這是git的功能,所以這邊不再解釋)。

 


enable_starttls_auto: true 是說要採用 Gmail 信箱寄信的話,加密這個功能要打開。

 

domain 指的是HELO 網域。


authentication 是指驗證身份的方式,早期很多方式,現在沒有要特別指定通常預設為 :plain。因為現在傳輸已經都是https了,所以驗證其實沒有必要再加密。

 

 

 

步驟三
設定好以上的程式碼時,請務必記得 rails server 要重開,這是因為舉凡動到 config 資料夾內的程式碼,是屬於一開啟 server 所讀的設定檔,所以一但更動此資料夾的程式碼,為了要呈現該有的效果話,請記得 server 要重啟才會有反應。

 

 

重啟後到首頁,按下送信的動作,會出現以下的錯誤訊息。

 

 

此問題是跟 Google 的設定相關。

 

 

在 Gmail 收到錯誤信件。

 

 

解決辦法為將安全性應用程式的按鈕打開。

 

 

打開後 Google 會發一封通知信件。

 

上面設定好之後,再回到首頁按下送信的按鈕,相信就會成功發信了。

 

 

系統已成功發信。

 

 

 

步驟四:
建立自己的客製化Mailer寄信程式

 

執行rails g mailer pb_mailer #名字可以自己取

 

會在 mailers 產生一個 pb_mailer 的 .rb 檔案,這類似於 controller。
相對的也會在 views 產生 pb_mailer 的資料夾。

 

 

 

 

 

在 pb_mailer.rb 檔案,定義一個寄信的方法,to 後面的email是收件人,subject是信件標題。

 


請改為自己的 Gmail 信箱。

 

 

新增寄信的信件內容,在app/views/pb_mailer/send_pb_test.html.erb
(你的路徑要看你的取名方式,跟controller差不多邏輯)

 

 

 

這邊要注意的是,信件夾帶外部檔案比較麻煩,所以css設定直接寫在裡面反而是最方便的方式。所以就照自己喜歡新增 Css 屬性吧。

 

 

接下來要在執行的 controller 裡,放入這個動作,以我們來說就是HomeController。照著圖裡面的邏輯放就可以了,他是class mathod。
 

 

 

再按下送信的動作,請至信箱查看是否有成功收到信。

 

 

成功收到信,也看到設定的變數及 css 屬性。

 

以上就是 Rails 利用 SMTP 寄送 Email 郵件的方式,如果想要做出更複雜的應用,歡迎可以到 Rails 官方的文件詳看。

 

 


最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!

Small logo

進度條編輯群

進度條編輯團隊