[RoR] ActionMailer + Gmail +SMTP_tls = Amazing !

哦耶,今天一個下午在尋找和PHPmailer一樣的東西,讓我可以在RoR上面做到「註冊完自動回覆」的功能,中間參考了很多個站的教學,但是都一直實做不出來寄信的效果,就覺得很XX,結果皇天不負苦心人,我在一個國外的網站找到了實做方法也測試成功。

先註明一下環境:「Ruby 1.8.6」、「Rails 2.3.5」(後面有「Ruby 1.8.7」的做法)。

OK~GO,一開始先來去「ROOT/vendor/plugins/」,用下面這個指令把相關的資料抓回來,此時你的plugins下就會多出一個action_mailer_tls的資料夾了。
http://gist.github.com/306718.js?file=gistfile1.sh

再修改你的「ROOT/config/environment.rb」,把以下這段Code插在end之後,
http://gist.github.com/306694.js?file=gistfile1.rb

OK,大功告成,原本要用什麼sendmail還是什麼mail server才可以做到的事情現在單靠Gmail就可以做到,算是比較符合小型開發者的需求。那環境用好了,接下來就依官方教學設定自己的ActionMailer了。

一開始先產生我們的Model,
http://gist.github.com/306699.js?file=gistfile1.rb

好,原本的Model內容應該是空的,來加入一些我們的基本設定(官網的詳細介紹):
http://gist.github.com/306705.js?file=gistfile1.rb

現在Model做好了,要再為該Model下的Action做一個View(這邊很重要),我原本以為這個View可以不用做,結果我錯了,因為官方教學有寫到,這個就是信件的內容,所以如果你不產生這個View,就會出問題(之前就是敗在這),

在我的例子中,我的路徑是「ROOT/app/views/eat_me_mail/send_mail.html.erb」,這裡面就是你想寫的話啦,要寫什麼就隨便個人了,這邊就不多說明,最後就是和Controller合併起來。

這邊先引用一下官方的說明「You never instantiate your mailer class. Rather, your delivery instance methods are automatically wrapped in class methods that start with the word deliver_ followed by the name of the mailer method that you would like to deliver」,它的意思是說我們要在Method前面加上deliver_才能呼叫,在這大家就依自己的工作需求,呼叫自己的Method就可以傳送出去了,而下面是我的例子:
http://gist.github.com/306711.js?file=gistfile1.rb

到這邊,整個過程都已經結束了,如果你在讀取該Controller下的Action時有產生短暫延遲,就可以再去server看一下是不是有類似以下的訊息,如果都有的話,那就成功啦,耶斯!
http://gist.github.com/306715.js?file=gistfile1.txt

最後附上一張測試成功圖,我們下次見:D~


〈補充一下Ruby1.8.7的作法〉

因為工作上的關係,所以自己和伺服器的版本不同,所以在移植的時候出了很大的問題,雖然程式都沒有報錯,但是會發現信寄不出去,這真是一個很該死的問題,所以我又上網到處找資料,發現了原本的tls是給Ruby1.8.6版本用的,所以在1.8.7時就不能再用這個做法,所以要改用另外一個寶石。

http://gist.github.com/310748.js?file=gistfile1.sh

然後修改「ROOT/config/environment.rb」這個檔案的內容如下,
http://gist.github.com/310749.js?file=gistfile1.rb

OK,這樣就可以了,大概就是這樣啦:D~