官網表單垃圾訊息:擋掉機器人又不趕走真客戶
詢問單信箱每天二十幾封廣告,真客戶的單子被埋在裡面兩星期沒人回。從蜜罐欄位、驗證碼取捨到伺服器端過濾與收件分流,四層防護三週走完。

「每天早上打開詢問單信箱,二十幾封裡面有十八封是英文廣告、虛擬貨幣投資、SEO 代操報價,剩下兩封才是真的客戶。看久了乾脆不看,結果某天才發現,一張三十萬的詢問單躺在裡面兩個星期沒人回。」
這是不少中小企業官網上線半年後會遇到的情況。表單本身沒有壞掉,壞掉的是它變成一個誰都能往裡面丟東西的投信口。而真正的損失不是信箱變亂,是你開始不相信那個信箱,於是真客戶的詢問也跟著被忽略。
Photo by Genevieve Ridgway on Unsplash
一、先分清楚是誰在灌
三種來源的處理方式完全不同,先看一個月的紀錄判斷自己以哪一種為主,再決定要補哪一層:
自動腳本。程式在網路上掃 <form>,看到輸入欄就填、看到送出鈕就送。特徵很好認:內容和你的業務毫無關係、需求欄塞滿連結、同一分鐘內連送好幾筆。這類通常佔最大比例,也最容易處理。
人工代發。真的有人坐在電腦前填,內容針對你的行業寫得還算像樣,但目的是推銷 SEO、網站代工或海外採購。數量不多,技術上也幾乎擋不掉,只能靠收件端分流。
被當成寄信跳板。表單欄位沒做過濾,被人塞進換行符號與額外的收件者,拿你的伺服器寄廣告信。這種最嚴重,後果是你的網域被列入黑名單,連報價單都寄不出去。
二、第一層:訪客感覺不到的隱形門檻
這一層最該先做,因為成本幾乎是零,而且對真客戶沒有任何干擾。
蜜罐欄位(honeypot)。在表單裡放一個用 CSS 藏起來的欄位,例如命名成 website_url,用 position:absolute;left:-9999px 移出畫面——不要用 display:none,有些腳本看得出來。真人看不到也填不到,腳本會照填。後端收到這個欄位有值就靜靜丟掉,不要回報錯誤訊息,否則對方知道被擋了就會調整。
填表秒數門檻。表單載入時在隱藏欄位寫入時間戳,送出時比對差值。真人要填完姓名、電話、需求,很少在三秒內完成;低於三秒就當可疑。要注意這個時間戳得在伺服器端簽章或加密,否則對方改一下就過了。
不要在頁面上放純文字 email。把 [email protected] 直接寫在 HTML 裡,等於公開給爬信件位址的程式收走。改成表單、用 JavaScript 組合、或做成圖片,都能減少信箱本身的垃圾量。
欄位名稱不要太標準。有些腳本靠 name="email"、name="message" 判斷該填什麼。改成 contact_mail、inquiry_detail 這類命名,會讓一部分腳本填錯位置。這招效果有限,但不花時間。
三、第二層:驗證碼要不要上,上哪一種
Photo by Bernd Dittrich on Unsplash
驗證碼能擋掉的量最多,但也是最容易傷到轉換率的一層。建議先把第一層做完、觀察一兩週,再決定要不要加。
reCAPTCHA v3(免費)。訪客不需要點任何東西,背後給出一個 0 到 1 的分數,由你決定低於多少要擋或送人工審。優點是無感,缺點是會載入 Google 的腳本並分析訪客行為,歐盟客戶多的網站要考慮隱私合規,頁面也多一點載入負擔。門檻設太嚴會誤擋真人,可以從 0.3 起跳,而且別直接丟掉,先標記起來。
Cloudflare Turnstile(免費)。定位類似,但不做廣告追蹤,隱私爭議較小,多數情況下訪客只要勾一下甚至完全無感。如果官網本來就掛在 Cloudflare 後面,整合成本很低。
傳統圖形驗證碼。要訪客辨識扭曲文字那種。擋得住,但對中高齡與用手機的訪客特別不友善,也有無障礙問題。如果你的客群年紀偏長,這招的代價通常大於收益。
自問自答題。例如「本公司主要生產什麼材質的產品?」對通用腳本很有效,對人工代發沒用,而且會卡住還不熟悉你產品的新客戶。比較適合放在內部或經銷商表單,不適合放在主要詢問單。
有個原則值得記住:擋下來的東西不要直接消失。先改成「標記為可疑並另存一份」,跑一個月再看有沒有真客戶被誤殺。
四、第三層:送出之後的伺服器端過濾
前兩層是在門口,這一層是在收件之後。先釐清一個常見誤解:前端的 JavaScript 檢查只是體驗,不是防護。腳本可以完全不經過你的頁面,直接對後端端點送資料,所以所有判斷都要在伺服器端再做一次。
幾個實際有用的規則:
- 連結數。需求說明裡出現三個以上網址,多半是廣告。
- 欄位格式。電話欄位要求台灣號碼格式(09 開頭十碼或市話區碼),能擋掉大量亂填。但如果你做外銷,就要放寬並另外分流,不然擋到的是真客戶。
- 換行與郵件標頭字元。凡是會進到郵件標頭的欄位(收件者、主旨、寄件者名稱),一律過濾掉換行字元與
Bcc:、Content-Type:這類字串。這是防止表單被拿去寄廣告信的關鍵一步,不要省。 - 同來源頻率。同一個 IP 在十分鐘內送出三筆以上就暫時拒收。但要留意同一家公司多人詢問、或電信業者共用 IP 的情況,門檻別設太低。
- 關鍵字名單。累積自己的名單,例如 SEO services、crypto、guest post、backlink。這份名單要靠自己長出來,直接抄別人的效果有限。
還有一件事常被忽略:表單一定要把每一筆都寫進資料庫,不要只靠通知信。信會漏、會被歸進垃圾桶,資料庫不會。
五、第四層:收件端的分流與回頭檢查
就算前三層都做了,還是會有漏網的。這一層的目的不是再擋一次,而是讓漏網的不要淹掉真客戶。
分流。讓「通過全部檢查」與「標記為可疑」寄到不同信箱或不同標籤。真客戶那一箱保持乾淨,可疑那一箱一天看一次就夠。
自動回覆。對通過檢查的詢問自動回一封「已收到,兩個工作日內回覆」。這不只是禮貌,也是你後台有沒有在運作的日常檢查——哪天自動回覆停了,你會馬上發現。
每月十分鐘的回頭檢查。翻一遍可疑那箱,看有沒有真客戶。有的話就是門檻設太嚴,把規則放寬一格。這一步最常被跳過,也是為什麼誤擋常常存在半年卻沒人知道。
指派與時效。詢問單進來後要有人認領、有回覆期限。有些公司垃圾訊息擋掉了,真客戶還是沒回,因為沒有人負責看那個信箱。
六、幾個常見但效果不好的做法
- 把必填欄位加到八、九個。腳本照填,真客戶跑掉。欄位越多轉換率越低,這等於用轉換率換清潔度,多數情況不划算。
- 只靠前端驗證。如前面所說,後端端點是公開的,繞過前端幾乎不需要技術門檻。
- 乾脆關掉表單只留電話。等於把願意打字但不想打電話的客戶整批放掉,尤其是下班後才有空看網站的那群人。
- 一次把所有防護開到最大。然後分不出是哪一層在誤擋。一層一層上,每層觀察一兩週,才知道哪一條規則該調。
結語:三個星期可以走完的順序
第一週。裝上蜜罐欄位與時間戳門檻、把頁面上的純文字 email 拿掉、確認每一筆詢問都有寫進資料庫。這一週幾乎不會動到真客戶的體驗。
第二週。看第一週擋掉多少。如果量還是大,加上 Turnstile 或 reCAPTCHA v3,但先只標記、不丟棄;同時把換行與郵件標頭字元的過濾補上。
第三週。做收件分流與自動回覆,並把「每月檢查誤擋」排進行事曆。
這件事的價值不在信箱變乾淨,而在於你會重新開始認真看每一封詢問單。一個月漏掉一張真單子的成本,通常比做完這些事的成本高得多。