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

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

使用 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 的方式