EP-77|做 AI 自動化寄信卻被標記為垃圾郵件?你可能缺少 DKIM 數位簽章
用 Google Apps Script 自動寄信給客戶,正常的信卻被 Gmail 標記成垃圾郵件。問題出在網域少了 DKIM 數位簽章,這篇記錄怎麼用 dig 診斷,再去 Cloudflare 補上 DKIM 與 DMARC。
最近在製作一個 AI 工作流的時候,發現我的信件自動寄給客戶時,都會被標記為垃圾信件。
稍微研究了一下,很快就解決了,不過中途還是會有一些眉角要處理,所以特別記錄起來,如果你也有相同困擾的話,底下是可能的解決方法。
先描述我的情境:
我有一個服務是 AI 工作流的陪跑,就是一對一教學,教人家怎麼做 AI 工作流。
只要購買陪跑服務,我也會同時贈送微課程,其實就是電子書啦,但是有搭配影片這樣。
所以當客戶購買了課程之後,系統就會提供一個 Google 表單。他們在填寫的時候,會有三個選項可以選:
我寫了一個 Google Apps Script 去處理 Google 表單的流程。依照客戶選擇的微課程內容,Google Apps Script 會寄送相對應的 Notion 連結給對方。
寄送是以 iamraven@raven.tw 來寄送,這個 Email 是在 Google Workspace 底下,因為我有購買 Google Workspace。
測試的結果是,信件雖然有成功寄出,但直接被扔進了垃圾郵件中。
信為什麼進垃圾郵件:SPF、DKIM、DMARC 與怎麼診斷
信寄到 Gmail 被丟進垃圾郵件,很常見的原因是寄件網域的郵件驗證沒設定齊全。
收件方會檢查三組放在 DNS 上的設定。
SPF(Sender Policy Framework):宣告哪些伺服器可以用你的網域寄信。
DKIM(DomainKeys Identified Mail):寄信時用一把私鑰幫信件加上數位簽章,收件方再用你放在 DNS 上的公鑰去驗證,確認這封信真的由你的網域授權寄出,而且中途沒被竄改。
DMARC(Domain-based Message Authentication, Reporting and Conformance):規定當 SPF 或 DKIM 驗證沒過時收件方要怎麼處理,以及把驗證報告寄到哪個信箱。
要知道自己缺哪一個,用 dig 指令查 DNS 就好,dig 是一個查 DNS 的指令,要在終端機裡用。
如果你是 Mac,打開內建的「終端機」程式(在 應用程式 → 工具程式 裡面,或用 Spotlight 打 Terminal 找出來),把下面的指令貼進去按 Enter 就有結果。
三筆分別查:
dig +short TXT raven.tw # SPF,找開頭 v=spf1
dig +short TXT google._domainkey.raven.tw # DKIM(Google 預設 selector 是 google)
dig +short TXT _dmarc.raven.tw # DMARC我自己查 raven.tw 的結果是:
SPF 有(v=spf1 include:_spf.google.com ~all),DKIM 跟 DMARC 兩筆都是空的。
所以,我少了 DKIM 數位簽章,是這次自動化發信丟進垃圾郵件的主因,要補上 DKIM 跟 DMARC 這兩筆。
上述這些資料都是要放在 DNS 紀錄裡面。
我的網域在哪買、DNS 又接到哪
要補 DNS 記錄,得先知道你的網域 DNS 是在哪裡管理。
raven.tw 這個網域我是在 Gandi.net 買的。但我沒有用 Gandi 內建的 DNS,而是把網域的 nameserver 指到 Cloudflare,DNS 記錄統一在 Cloudflare 管理。
所以等一下加 DKIM 跟 DMARC,都是去 Cloudflare 加,不是去 Gandi。
怎麼確認你的網域 DNS 接在哪一家:
dig +short NS raven.tw我的回傳是:
jim.ns.cloudflare.com.
anahi.ns.cloudflare.com.看到 cloudflare.com 就代表 DNS 託管在 Cloudflare。
如果你看到的是 Gandi 或別家的 nameserver,那就要去那一家的後台加記錄,步驟的概念一樣,只是介面不同。
在 Google Workspace 產生 DKIM 金鑰
DKIM 的金鑰要從 Google Workspace 管理控制台產生。
用管理員帳號登入,打開這頁:https://admin.google.com/ac/apps/gmail/authenticateemail (路徑是 應用程式 → Google Workspace → Gmail → 驗證電子郵件)。
上方先選網域 raven.tw,再點「產生新記錄」。金鑰長度選 2048 bit,前置字串(selector)保持預設的 google。
它會給你一筆 DNS 記錄,長這樣:
主機名:google._domainkey
值 :v=DKIM1; k=rsa; p=(後面接一長串公鑰)這時候先停手,不要按「開始驗證」。等 DNS 那筆記錄加好、生效之後再回來按,順序顛倒會驗證失敗。
到 Cloudflare 補上 DKIM 與 DMARC 兩筆記錄
登入 Cloudflare,點進 raven.tw,左側選 DNS → 記錄(Records),按「新增記錄」加兩筆資料。
第一筆,DKIM:
Type:TXT
Name:
google._domainkey(只填這樣,Cloudflare 會自動補成 google._domainkey.raven.tw)Content:把 Google 給你的那串
v=DKIM1; k=rsa; p=...整段貼進去
DKIM 這串很長,超過單筆 TXT 的 255 字元上限,DNS 會自動切成好幾段存。Cloudflare 接受長字串、會自己處理,直接貼完整內容就好。
第二筆,DMARC:
Type:TXT
Name:
_dmarcContent:
v=DMARC1; p=none; rua=mailto:iamraven@raven.tw
DMARC 的 p=none 是監控模式,只收報告、不對驗證失敗的信做任何處置,是最安全的設定,不會誤殺你現在正常寄出的信。
rua 後面那個信箱是接收彙整報告的地方,填你自己的信箱,不要填寫我的信箱啊。
兩筆都存好之後,還記得剛剛跟你說不要按「開始驗證」嗎?所以現在請你回到剛剛 Google 那一頁,按「開始驗證」。
用 dig 確認 DKIM 生效
DNS 改完不會立刻生效,先用 dig 確認。
現在要查兩個地方:一個是直接問 Cloudflare 的權威伺服器(記錄到底加上去了沒),一個是問公共 DNS(有沒有傳播出去)。
# DKIM
dig +short TXT google._domainkey.raven.tw @jim.ns.cloudflare.com # 權威
dig +short TXT google._domainkey.raven.tw @8.8.8.8 # 傳播
# DMARC
dig +short TXT _dmarc.raven.tw @8.8.8.8如果兩邊都有回傳值,就代表記錄上線了、也傳播出去了,Cloudflare 通常幾分鐘內就好。
查 DKIM 的時候,你會看到那串值被切成兩段、各自包在引號裡,這是 DNS 對超過 255 字元的正常分段,收件方驗證時會自動接回去,不用管它。
最後就要驗證真正寄出的信有沒有帶上 DKIM 簽章:
寄一封測試信到 Gmail,打開信、點右上「顯示原始郵件」,看到 DKIM: 'PASS' with domain raven.tw 就代表成功了。
Google 按了「開始驗證」之後,通常幾十分鐘到幾小時內會開始幫你的信簽章,DNS 既然已經生效,多半不會拖太久。
CTA
如果要把自動化寄信的腳本設定到不再被丟到垃圾郵件夾,雖然看似很簡單,但是其中還是有很多的關卡。如果沒有人帶你做,你可能光是搞清楚「程式該放哪個帳號、DKIM 要去 Gandi 還是 Cloudflare 設定」,就可能耗掉你一整個週末。
如果你正在把自己的工作流自動化,卻一直卡在這種接不起來的環節,可以直接找我聊。我的「AI 一人公司啟動諮詢」會幫你把目前最卡的地方,一條一條搞清楚,讓你少撞幾次牆、早一點把系統跑起來。







