網站開發

WordPress外掛WP Mail SMTP搭配SendGrid成功寄信的兩大關鍵設定

在WordPress的運作上寄信我想是個滿基本的需求,但為了這個而自己架設Mail Server肯定是下下策。安裝外掛去串接第三方的寄信服務是最好的選擇,即使你發現你的WordPress安裝好之後信就可以寄出了還是建議這麼做,因為沒有讓信走正規的路很容易就被列入垃圾郵件,除非說你只是要寄給自己那就另當別論。

「WP Mail SMTP」- WordPress中有名的寄信串接外掛

在WordPress中最有名氣的寄信(串接)外掛應該是「WP Mail SMTP」這個了吧,這個外掛的安裝啟用數量已達到兩百萬以上,有一千兩百多個評分,分數是4.5分,所以表現可以說是非常棒的。正因為這個外掛如此熱門,所以如何安裝使用其實問一下Google大神就一大堆資料了,本篇文章也不針對這部份再贅述。

送信服務平台的選擇

在外掛不付費升級成Pro版的狀況下,能串接的第三方送信服務商總共有五間,而如果送信服務商端也想免費使用的話(其實每一間的免費都是有條件的,但這裡我們把每天額度內使用免費就當作免費),就剩下「Sendinblue」和「SendGrid」這兩家了。

而我最後選擇的是「SendGrid」,原因是我在測試「Sendinblue」時雖然可以正確送信,但是都會被Gmail列到垃圾郵件之內,這代表送給其他人時也是同樣結果,應該也是代表這家公司在送信的處理上沒有處理得很好,或著已經被人濫用得太嚴重了,所以才會有如此的結果。

簡單又不簡單的串接設定

大部分的教學文章或影片,都是教你到SendGrid上把API Key建立好,接著回到WP Mail SMTP外掛設定頁面把Key貼上儲存收工,看起來就是如此的簡單。

這個影片算是說明得不錯的,值得參考。

對,「如此簡單」的串接設定讓我弄了一兩個小時都還是無法成功送出任何一封信,幾度放棄了是不甘心又繼續研究,終於讓我找到幾個設定上要注意的關鍵點。

這在其他教學文章或影片很少有提到,或是沒有特別劃為重點提示該注意,但這些地方雖然一錯誤,會讓你試到天荒地老都還是無法送信,這就是我寫這篇文章的理由。

對了,再岔開一個話題,只是想找答案的人這一段可以整個跳過。WP Mail SMTP在「傳送測試郵件」功能中,若傳送錯誤並不會回傳告訴你詳細的錯誤訊息,只會跟你說需要協助的話請買Pro版將會有Support團隊,真的是耍了心機。我想如果在一開始就看到詳細的錯誤訊息,應該會省下超級多的時間。不過坦白說,不想花錢就是這樣,人家幫你寫了這個外掛應該就該心懷感謝了,沒義務在幫你解決遇到的問題,不想自己花時間就花錢也是天經地義。

好,前面說了那麼多,終於來到本篇文章的重點了。

成功送信的關鍵設定

除了建立好API Key並將Key貼上外掛儲存之外,要成功送信還有兩大關鍵設定。

必需在SendGrid上完成Sender Authentication設定

這個簡單說就是要知道送信者是誰,而且確定這個送信者不是被冒用的,目的主要都是在杜絕垃圾郵件。

而認證的方式有分為兩種,「Domain Authentication」和「Single Sender Verification」。從字面上大概就可以窺探意思,使用Domain Authentication是針對Domain去認證,只要是這個domain下的帳號都可以是合格的送信者,例如userA@domain.com、userB@domain.com、userC@domain.com等等等都可以。而如果是Single Sender Verification,他是針對單一個Email地址去認證,也就是說認證了userA@domain.com,往後只有userA@domain.com是合格的送信者,其他的都不是。

假設你是自己擁有domain的,那請不要考慮就請用Domain Authentication的方式去做驗證,原因文章繼續往下看你就知。而設定方式就是按照網頁上給的DNS record資訊設定進自己的domain DNS Server就好了,如果是管理跟設定domain應該一看就懂,這邊就不多贅述。

而如果沒有自己的domain可用,則可以用Single Sender Verification的方式,如此只要有一個屬於自己的Email Address即可。

不過這個方法是有但書的,如果你拿來驗證的Email Address是Google、Yahoo或是Outlook等等大服務商的,這樣雖然在SendGrid上認證可以通過,但在實際的信寄出之後,很有可能會被列為垃圾郵件,這是因為這些大服務商都有實作DMARC的機制在保護自己的Email服務免於垃圾郵件的侵擾。

簡單的說狀況大概就是,你對收件方宣稱你是abc@gmail.com,但事實上這封郵件是由SendGrid的郵件伺服器送出的,機器的IP不會在Google認可的範圍內,郵件也沒有經過Google簽署過,如此在有實作DMARC的郵件服務商接收郵件時,SPF跟DKIM Check都會失敗,基本上很容易就會掉入垃圾郵件中。

註:SendGrid官方有關於DMARC的相關說明請參考這裡

「寄件者電子郵件地址」設定必需跟SendGrid上的Sender相符合

這邊就是第二個關鍵點,在「WP Mail SMTP」外掛設定頁上的「寄件者電子郵件地址」設定項目並不是隨你高興填,請與前一個項目完成的Sender Authentication設定內容相符合,並且將「強制使用 [寄件者電子郵件地址] 設定」勾選起來。

紅色框線內就是要注意的兩個設定,填上對的電子郵件地址並下方打勾。

如果你能理解前面Sender Authentication設定到底在幹嘛,這邊為何要這樣設應該不難理解。會特別寫出這點的原因是,如果你外掛這邊的寄件者地址設定無法跟SendGrid端是相符合的,那SendGrid連給你寄信的機會都不給,在驗證階段就直接擋下。

那這邊的設定該如何跟SendGrid的Sender Authentication相配?

如果你用的是Domain Authentication的方式,那如同前面所說,只要你的domain.com認證過,userA@domain.com、userB@domain.com、userC@domain.com等等等都可以使用。但如果選的是Single Sender Verification認證方式,你認證了userA@domain.com,就只能在這裡設定userA@domain.com為寄件者。

好用的寄件測試方式

前面提過,雖然WP Mail SMTP有提供「傳送測試郵件」的功能,但是他只會告訴你「成功」或「不成功」,若不成功則不會有任何的錯誤訊息,這對除錯一點幫助都沒有。

好加在SendGrid的API可以讓我們用curl的方式來打,雖然可能跟WP Mail SMTP串接的方式不一定相同,但我想大多數的錯誤應該都可以測得出來,而且這邊會有非常完整的錯誤訊息。只不過因為要使用curl,所以前提是你要有個command line可以使用,其實最好的方式是在WordPress系統那台伺服器上測試。

export SENDGRID_API_KEY='xxx'

curl --request POST \
  --url https://api.sendgrid.com/v3/mail/send \
  --header "Authorization: Bearer $SENDGRID_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"personalizations": [{"to": [{"email": "shjheng@gmail.com"}]}],"from": {"email": "shjheng@gmail.com"},"subject": "Sending with SendGrid is Fun","content": [{"type": "text/plain", "value": "and easy to do anywhere, even with cURL"}]}'

上面的curl送出後會收到下方的error message,仔細看不難懂錯在哪裡。原因就是我的from是帶shjheng@gmail.com,但實際上我在SendGrid上是用Domain Authentication驗證了zieger.tw這個domain,不相符的狀況下是不能寄信的。

{“errors”:[{“message”:”The from address does not match a verified Sender Identity. Mail cannot be sent until this error is resolved. Visit https://sendgrid.com/docs/for-developers/sending-email/sender-identity/ to see the Sender Identity requirements”,”field”:”from”,”help”:null}]}

所以在此將from修改成service@zieger.tw後在此用curl送出,就沒有收到任何錯誤訊息了。

curl --request POST \
  --url https://api.sendgrid.com/v3/mail/send \
  --header "Authorization: Bearer $SENDGRID_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"personalizations": [{"to": [{"email": "shjheng@gmail.com"}]}],"from": {"email": "service@zieger.tw"},"subject": "Sending with SendGrid is Fun","content": [{"type": "text/plain", "value": "and easy to do anywhere, even with cURL"}]}'
成功收到信囉!

總結

如果前面有很多你看不懂的地方那也沒關係,我最後再簡化一下,其實只要記住有以下兩個關鍵點要完成:

  1. 在SendGrid上一定要完成Sender Authentication (不管是Domain Authentication或是Single Sender Verification)
  2. WP Mail SMTP外掛的「寄件者電子郵件地址」設定必需跟SendGrid上的Sender內容相符合

若你真的覺得這樣的設定太麻煩了或實在無法理解,那我建議就改用Sendinblue吧,Sendinblue真的就只需要將API拿到手後貼上儲存就收工了,不過我想也正因為如此所以他被垃圾郵件侵擾的很嚴重,同時也代表你寄出的郵件有極大的可能也一樣被列為垃圾郵件,不過如果你不在意這點那就無所謂了。

祝大家都能順利完成設定囉!

Avatar

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料