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