在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下的帳號都可以是合格的送信者,例如[email protected]、[email protected]、[email protected]等等等都可以。而如果是Single Sender Verification,他是針對單一個Email地址去認證,也就是說認證了[email protected],往後只有[email protected]是合格的送信者,其他的都不是。
假設你是自己擁有domain的,那請不要考慮就請用Domain Authentication的方式去做驗證,原因文章繼續往下看你就知。而設定方式就是按照網頁上給的DNS record資訊設定進自己的domain DNS Server就好了,如果是管理跟設定domain應該一看就懂,這邊就不多贅述。
而如果沒有自己的domain可用,則可以用Single Sender Verification的方式,如此只要有一個屬於自己的Email Address即可。
不過這個方法是有但書的,如果你拿來驗證的Email Address是Google、Yahoo或是Outlook等等大服務商的,這樣雖然在SendGrid上認證可以通過,但在實際的信寄出之後,很有可能會被列為垃圾郵件,這是因為這些大服務商都有實作DMARC的機制在保護自己的Email服務免於垃圾郵件的侵擾。
簡單的說狀況大概就是,你對收件方宣稱你是[email protected],但事實上這封郵件是由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認證過,[email protected]、[email protected]、[email protected]等等等都可以使用。但如果選的是Single Sender Verification認證方式,你認證了[email protected],就只能在這裡設定[email protected]為寄件者。
好用的寄件測試方式
前面提過,雖然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": "[email protected]"}]}],"from": {"email": "[email protected]"},"subject": "Sending with SendGrid is Fun","content": [{"type": "text/plain", "value": "and easy to do anywhere, even with cURL"}]}'
上面的curl送出後會收到下方的error message,仔細看不難懂錯在哪裡。原因就是我的from是帶[email protected],但實際上我在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修改成[email protected]後在此用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": "[email protected]"}]}],"from": {"email": "[email protected]"},"subject": "Sending with SendGrid is Fun","content": [{"type": "text/plain", "value": "and easy to do anywhere, even with cURL"}]}'

總結
如果前面有很多你看不懂的地方那也沒關係,我最後再簡化一下,其實只要記住有以下兩個關鍵點要完成:
- 在SendGrid上一定要完成Sender Authentication (不管是Domain Authentication或是Single Sender Verification)
- WP Mail SMTP外掛的「寄件者電子郵件地址」設定必需跟SendGrid上的Sender內容相符合
若你真的覺得這樣的設定太麻煩了或實在無法理解,那我建議就改用Sendinblue吧,Sendinblue真的就只需要將API拿到手後貼上儲存就收工了,不過我想也正因為如此所以他被垃圾郵件侵擾的很嚴重,同時也代表你寄出的郵件有極大的可能也一樣被列為垃圾郵件,不過如果你不在意這點那就無所謂了。
祝大家都能順利完成設定囉!
- 旅遊攝影| 探訪山中特色小鎮 – 飛驒古川 - 2023-08-18
- 日本名古屋 熱田神宮|多啦A夢的任意門,自由穿梭在城市與山林之間 - 2023-08-13
- 《JOKER電影交響音樂會》 心得紀錄 - 2022-03-13