使用Google Cloud Platform(GCP)卻無法使用Compute Engine上的寄信功能嗎?這次要來介紹GCP第三方廠商之一的「SendGrid」幫你解決無法寄信的問題!

Google Cloud Platform(GCP)為了減少各種垃圾信件的產生,而阻擋Compute Engine上的寄信功能,也就是常用的幾個寄信的通訊埠Port 25/465/587都被阻擋。

過去可能只需要在主機安裝postfix或sendmail之類的MTA,再設好防火牆就可以寄信。但現在在GCP上即使防火牆允許了Port 25/465/587還是不能夠寄信,只能透過第三方廠商的解決方案或是G Suite Relay進行寄送。

這次要來介紹第三方廠商之一的SendGrid,並帶各位從帳號申請到寄測試信實際操作一遍,讓信件不再被阻擋!

為何GCE寄信會有限制?

由於一般的VPS主機或是自己用電腦架設的Linux主機,只需要安裝postfix或是sendmail、qmail等等的MTA,就可以直接開始用localhost寄信,技術難度其實不高。但只要是主機上提供的服務,沒有持續修補或更新漏洞的話,很可能會被惡意人士發現漏洞,進而入侵,主機便可能被利用來當作大量垃圾信的發信站。若沒有仔細監控主機,可能要好一陣子IP被加入黑名單,或是無法寄信了才會發現問題,但發現時早已經寄了大量的垃圾信件出去了。

Compute Engine code

GCP會設下寄信限制的原因

由於在GCP上面開Linux主機,只需要點個幾下滑鼠,一下子就能開好一台Linux主機,因此也無法強制要求各主機管理員要非常注意主機的漏洞修補與預防措施。

對此情況而言,直接封鎖Port 25/465/587是非常有效的作法。即使今天主機入侵事件再度發生,MTA開始寄送垃圾信件,但因為通訊埠被封鎖,因此無法連上對方的主機。即使一直retry,直到放棄佇列還是無法將信寄出,這便是為什麼透過封鎖這些Port可以減少垃圾信件的產生。

示範環境介紹

下方將以此示範環境進行步驟教學,而我所使用的示範環境如下:
虛擬主機規格:GCE Instance f1-micro
作業系統:CentOS 7
郵件傳送代理程式:Postfix

GCE執行個體詳細資料

一、申請SendGrid

要開始使用SendGrid寄信前,需先至GCP的網站後台啟用SendGrid API

1. 請先到GCP後台切換至您要設定SendGrid的專案。
2. 在GCP後台的上方搜尋列,直接輸入「sendgrid」,並點選搜尋結果中的「SendGrid Email API」

searching sendgrid email api

3. 可以直接到達SendGrid的介紹頁面,點擊「開始使用免費方案」即可。

Cloud Launcher Sendgrid

4. 接著是直接選擇SendGrid的方案,本教學以免費方案為主,直接點擊「Subscribe」即可。若有需要大量寄送郵件可在下拉式選單中選擇付費方案再進行訂閱。
※ 2018/6/12免費方案提供每月12,000封信件寄送額度,到達額度後就無法寄送郵件

SendGrid Subscribe Plan

5. 訂閱完後接著要到SendGrid正式申請帳號,點選註冊「SendGrid」即可。

註冊sendgrid帳號

6. 填寫帳號名稱、密碼與電子郵件信箱進行帳號註冊。
※ 這裡的帳號密碼會直接用來做SMTP設定!

SendGrid帳號註冊

7. 註冊完成後獲得一個恭賀信!按「CLOSE&RETURN TO GOOGLE」即可。

成功申請SendGrid帳號

8.此時回到GCP後台,會看到訂閱免費方案的日期,代表已完成SendGrid申請步驟。

成功訂閱SendGrid免費方案

二、Postfix設定

SendGrid申請完成後,接下來我們就需要在自己的GCE執行個體上進行對應的設定。
GCE提供的CentOS 7映像檔內部已經有安裝postfix這個MTA,故以postfix來進行示範。

1. 先到GCP後台的執行個體列表,SSH連線到要透過SendGrid寄信的主機。

SSH連線到主機

2. SSH開啟新視窗後,輸入「sudo su -」指令,按下enter。以切換為root最高權限的管理員,當小老鼠及其左側顯示為「root@」即表示切換成功。

切換到root帳戶

3. 輸入「umask 077」指令,按下enter,以確保後續產生的檔案安全性。

4. 接下來安裝所需的套件,為了稍後成功設定postfix用SendGrid寄信,需要這幾個套件:cyrus-sasl-plain cyrus-sasl-md5,而另外安裝mailx作為最後寄送測試信的套件, 因此就一併安裝吧!輸入「yum install cyrus-sasl-plain cyrus-sasl-md5 mailx -y 」,按enter之後開始安裝。

yum安裝所需套件

5.若沒有出現錯誤訊息則開始編輯postfix設定檔。輸入「vim /etc/postfix/main.cf 」以使用vim來做設定檔的修改。

postfix main.cf編輯

6. 按下大寫G到達最底部,再按小寫o,可直接新增一行並同時進入編輯模式。

vim insert mode

7. 貼上下方設定值,讓postfix知道要用sendgrid寄信,並用「sasl_passwd」作為SMTP帳號驗證
relayhost = [smtp.sendgrid.net]:2525
smtp_tls_security_level = encrypt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
header_size_limit = 4096000
smtp_sasl_security_options = noanonymous

貼上postfix設定值

8. 接著要將vim編輯器儲存並離開,因此請先按鍵盤左上方的Esc退出編輯模式,接著輸入「:wq」(冒號wq),再按下Enter送出,告訴vim存檔並離開。

9. 開始建立帳號密碼檔案,將以下的YOUR_SMTP_LOGIN與YOUR_SMTP_PASSWORD置換成稍早申請的SendGrid帳號與密碼,再按下Enter送出,就建立好含有帳號密碼的檔案。
echo [smtp.sendgrid.net]:2525 [YOUR_SMTP_LOGIN]:[YOUR_SMTP_PASSWORD] >> /etc/postfix/sasl_passwd

建立帳號密碼檔案

10. 透過postmap將此檔案轉換為db的格式,輸入指令「postmap /etc/postfix/sasl_passwd」

postmap sasl_password

11. 透過「ls -l /etc/postfix/sasl_passwd.db」指令確認是否有產生.db的檔案,有出現紅框的檔案訊息,代表有成功產生。

ls -l /etc/postfix/sasl_passwd.db

12.產生db檔案後就可以將存有帳號密碼的檔案移除,輸入指令「/etc/postfix/sasl_passwd」,就會將此檔案刪除。

13.重新啟動postfix,讓postfix重新載入更新後的設定檔,輸入指令「postfix reload」

postfix reload

若沒有錯誤訊息代表設置成功,最後我們再透過mailx來寄送測試信件吧!

三、寄送測試信

設定完後要測試才會知道能否成功寄信,由於我們已經在SSH文字介面裡頭,因此接下來就直接從文字介面來寄送測試信!

1. 將下方指令中「EMAIL@EXAMPLE.COM」更換為你的email,貼到SSH後再按下enter。
echo ‘Test passed.’ | mail -s Test-Email EMAIL@EXAMPLE.COM

2. 到信箱收信,若收到主旨為Test-Email,內容為Test passed.的信件,代表設定成功!



申請簡單、與GCP高度整合

之前介紹過的mailgun相較,不需進行DNS設定,也不需另外綁定信用卡,且可以在GCP後台直接看到訂閱紀錄。但須注意若超過免費12,000信件的額度,將會無法寄送信件。相較之下,mailgun在超出免費額度後,就會以每封信多少錢的方式額外收費,信件寄送功能也能維持正常。因此再請各位視自身需求選擇第三方寄信服務的方式。

延伸閱讀

Mailgun寄信設定,GCP第三方寄信服務手把手教學!

在現有的GCE linux主機上設定SFTP的方式