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

sending mail from Google Compute Engine

開始使用 Google Cloud Platform(GCP)後,好不容易終於建立了一台執行個體,但實際把環境建立好後卻發現無法寄信?其實只要透過GCP第三方「Mailgun」寄信服務搭配下方 Google Cloud Platform 設定教學,問題就可以迎刃而解!

無法寄信?透過神奇的 Mailgun 來解決!

目前網路上充斥著大量的垃圾信件,而這些垃圾信大多數都是由疏於管理的主機所寄出。為了避免這樣的問題產生,Google 並不允許直接在 25/465/587Port 提供寄送郵件服務,必須透過第三方寄信服務或是 G Suite SMTP relay 才能夠寄信,以降低垃圾信件的產生。
因此本文將帶您實際從 Mailgun 帳號申請,到設定 Postfix 與寄送測試信,幫助各位解決無法寄信的問題。

Mailgun 帳號申請與 Postfix 設定教學

Step1. 先至Google Partner頁面,點擊「Try Sending Email With Mailgun」申請 Mailgun 帳戶,否則免費額度只會有 10,000 封哦!

mailgun gcp credit

Step2. 進入後填寫使用者資訊與信用卡資料,記得確認右側的 Plan 是「Google – Pay as you Go」才有提供每月 30,000 封的額度。
※ 若選擇不綁定信用卡,免費額度會降至每月 10,000 封,建議直接綁定信用卡。

mailgun-google plan

Step3. 填寫好後點選「Create Account」送出,之後就會到這一頁,直接點擊「Add A Domain」進行下一步即可。

mailgun-signed-up

Step4. Mailgun建議用戶若只使用寄信功能,可以使用 Subdomain 進行註冊,使用 Subdomain 註冊還是可以使用原有 domain 進行寄信。 舉例來說,依照建議使用「mg.digital-transformation.media」註冊,這樣我仍然可以使用「@digital-transformation.media」來寄送信件。

mailgun-add-domain

Step5. 點擊「Add Domain」後,Mailgun 要求用戶至目前的 DNS 主機設定相對應的紀錄值,以證明此網域確實為你所有。此時就要到所使用的 DNS 主機後台新增 DNS 紀錄值。

mailgun-domain-verify

Step6. 由於「digital-transformation.media」是使用 Google Cloud Platform 提供的 Cloud DNS 服務,故直接至 GCP 後台,將上述的紀錄值一一加入即可。
※ 依 DNS 主機商的不同,可能需要 2~48 小時才會生效。

mailgun-cloud-dns

Step7. 等待 DNS 生效的同時,也一併去當初申請 Mailgun 的信箱收信,至信件中的連結驗證信箱後,才能夠開始寄信。

mailgun-verify-email

Step8. 前往連結後,會要求提供手機號碼進行驗證,才能進行下一步驟。

Step9. 手機驗證完後會回到 Dashboard,繼續前往驗證 DNS 設定值,點選右側的「Verify a custom domain」。

mailgun-verify-domain

Step10. 出現的頁面點擊您所註冊的網域名稱,以此例子為「mg.digital-transformation.media」。

mailgun-verify-custom-domain

Step11. 點擊之後到下方「Domain Verification & DNS」的段落,點選「Check DNS Records NOW」的按鈕,要求 Mailgun 重新偵測一次 DNS 紀錄是否生效。

mailgun-dns-record

Step12. 如果都變成綠色,代表 DNS 設定值正確,且已經生效。若還是黃色或是紅色,代表 DNS 設定值有誤,或是尚未生效,請 2~48 小時後再試試看。

mailgun-domain-verify-complete

Step13. 都變成綠色之後,用滑鼠滾輪回到頁面頂端,記下您的 SMTP 帳號與密碼(Default SMTP Login與Default Password),準備開始設定 Google Cloud Platform 上的執行個體。

mailgun-smtp-credentials

Step14. 用SSH連線到您的執行個體,並使用「sudo su -」的指令,切換至 root 帳號。

mailgun-ssh

Step15. 先建立一個安全的 umask 遮罩,以確保之後建立檔案的安全性,輸入「umask 077」後按 enter。

ssh-umask

Step16. 接下來要安裝 postfix 與 SMTP 驗證相關的套件:

若使用 CentOS,使用該指令:「yum install postfix cyrus-sasl-plain cyrus-sasl-md5 mailx -y」

若是 Debian,改用該指令:「apt-get update && apt-get install postfix libsasl2-modules -y」

此例為CentOS 7 故使用 yum 進行安裝。

Step17. 安裝完後要進行 postfix 設定檔的修改,讓 postfix 知道我要從 Mailgun 寄信。
而 postfix 的設定檔一般會在 /etc/postfix/main.cf,需要用 vim 來進行編輯,故使用「vim /etc/postfix/main.cf 」的指令

ssh-vim

Step18. 我們要在 main.cf 的最後一行加上 Mailgun 的設定值,在 vim 中可以按下大寫「G」,直接到達檔案尾端。並按下「o」新增一行,並進入編輯模式(左下角出現–INSERT–的狀態,才能進行檔案編輯)。

vim-maincf

Step19. 複製並貼上以下的設定值:
relayhost = [smtp.mailgun.org]:2525
smtp_tls_security_level = encrypt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

vim-maincf-pasted

Step20. 接著按鍵盤左上角的 Esc 鍵離開編輯模式,可以看到左下角的–INSERT–消失。

vim-maincf-esc

Step21. 此時要將此設定檔存檔,並離開 vim 文字編輯器。輸入「:wq」,按下 enter 即可。(輸入冒號與 wq:冒號代表給 vim 的指令,w 代表寫入,q 代表離開編輯器。)

vim-wq

Step22. 按下 enter 後,回到 SSH 的畫面,接下來要把帳號密碼提供給 postfix,這樣 postfix 寄信時連線至 Mailgun,才能夠成功登入並寄送信件。直接使用 vim 來建立這個檔案,依照前面的設定內容,postfix 是要去 /etc/postfix/sasl_passwd 這個檔案取得帳號密碼,所以我們要將我們的 SMTP 帳號密碼放在這裡。
直接使用 vim 來建立吧!輸入「vim /etc/postfix/sasl_passwd」後按下 enter,就可以建立新的檔案了。

vim-sasl-pass

Step23. 進入 vim,開始編輯檔案前需要進入編輯模式才能修改檔案內容,此時可以直接按「i」進入編輯模式。貼上:[smtp.mailgun.org]:2525 SMTP_LOGIN:SMTP_PASSWORD

「SMTP_LOGIN」請取代成您的「Default SMTP Login」帳號名稱
「SMTP_PASSWORD」請取代成您的「Default Password」

sasl-pass

Step24. 按下 Esc,–INSERT–消失後,按下「:wq」,再 enter,存檔並離開。

ssh

Step25. 接著利用 postmap 將剛剛的 sasl_passwd 轉換成 postfix 看得懂的資料庫檔案。
輸入指令即可:postmap /etc/postfix/sasl_passwd

postmap

Step26. 確認看看是否有產生.db 的檔案,使用以下指令來檢查。
ls -l /etc/postfix/sasl_passwd.db

有出現代表 postmap 成功執行,沒有出現可能要看一下錯誤訊息或是往上比對是否有步驟漏掉。

checkdbfile

Step27. 如果沒有問題,刪除含有帳號密碼的文字檔吧!以免別人看到您的帳號密碼而被盜用。使用以下指令:
rm /etc/postfix/sasl_passwd

會再問您一次要不要刪除此檔案,輸入 y,再按 enter 代表 yes。

rm-sasl

Step28. 設定檔更新後,通知 postfix 重新載入新的設定檔,需使用以下指令:postfix reload

postfix-reload

Step29. 此時我們可以開始寄測試信了,利用稍早安裝的 mailx 套件做指令列的寄信。
輸入以下指令就可以寄信:
EMAIL@EXAMPLE.COM(請取代成您的信箱,才收得到測試信喔!)
echo ‘Test passed.’ | mail -s Test-Email EMAIL@EXAMPLE.COM

testmail

Step30. 到信箱收信,若有收到剛剛寄出的測試信,代表寄信功能正常了!

testmail-received

這時可以測試看看您的應用程式是否能夠透過 postfix 開始寄信。

經過上述 Google Cloud Platform 的 Mailgun 步驟教學,終於可以從 GCP 執行個體寄發信件了!
由重重的驗證來看,Mailgun 確實非常仔細在避免垃圾與惡意信件,而 Mailgun 自己也有 Dashboard 可以查看寄信狀態,有非常方便的統計圖表可以確認到底每個月寄送多少信件。

但也由於驗證的步驟較多,除了基本的 email 驗證之外、還需要修改 DNS、手機也要進行驗證,造成設定的時間會比較長一些,不過只要設定完成,就可以一勞永逸了。

延伸閱讀

Sendgrid 寄信設定,GCP 第三方寄信服務手把手教學!
在現有的 GCE linux 主機上設定 SFTP 的方式