標題大概是我這陣子最常問的問題,這問題讓我熬夜失眠又頭疼了好一陣子

 

翻遍全網路找到的解決方法都沒有用

原本準備要上線的網站也因為這樣嚴重拖垮進度…(嘆

當然最後還是搞定了,稍做紀錄一下

2014-09-21_204706

如圖,程式發出來的信通通被 Gmail 標記成垃圾,當然也就直接進垃圾信箱,使用者連看到的機會都沒有

先前在開發網站內部測試時完全沒這個問題,準備上線前才發現問題

而開發測試環境跟正式主機的差異只在 Domain 和主機

第一步當然是先測試主機問題,經過一輪交叉測試之後排除了主機問題,程式不管在新主機和舊主機都會發生一樣的問題

$domain = 'http://www.xxx.tw';
$mail = new PHPMailer();
$mail -> IsSMTP();
$mail -> SMTPAuth = true;
$mail -> SMTPDebug = false;
$mail -> SMTPSecure = "ssl";
$mail -> Host = "smtp.zoho.com";
$mail -> Port = 465;
$mail -> CharSet = "utf-8";
$mail -> Username = $sender_username;
$mail -> Password = $sender_password;
$mail -> From = $sender_username;
$mail -> FromName = $sender_name;
$mail -> Subject = $mail_subject;
$mail -> Body = $mail_content . $domain;
$mail -> IsHTML(true);
$mail -> AddAddress($user_email, $user_displayname);

我發信的程式大概是這樣寫,用 PHPmailer 經過 smtp server 發信

值得注意的是,信件內容中會附上 domain 連結,上線前跟開發測試的 mail 除了 domain 這個變數不同以外,剩下都一樣

 

很明顯的,問題就是在 domain

現在的方向又更明確一些,問題就是在 Gmail 因為我的 domain 才判定成垃圾信

用這思路去 Google 可以發現找到的解法有

 

1.幫 domain 新增 SPF 紀錄

2.幫主機加上 PTR 紀錄

3.檢查 domain 有沒有被黑名單

4.檢查 mail 內容

 

第一點很簡單,網路上找找有很多範例,這我有經驗,所以一開始就加上這個了

SPF 紀錄設定大概長這樣,SPF 紀錄基本上就是讓 Gmail 驗證你就是 domain 的擁有者,不是盜用別人信箱,詳細的說明可以參考 Google 的說明文件

如果 SPF 紀錄通過 Gmail 的驗證,你可以在 header 看到下列的字串

Received-SPF: pass (google.com: domain of …

 

之後我檢查了 domain 是不是被列進黑名單,這個網路上有很多網站可以查詢

關鍵字找下 mail sender blacklist 之類的應該就有一票網站了

查詢結果當然是全部通過,剛註冊的 domain 要是被黑單我也無能為力了…

 

至於 PTR 紀錄,就是 IP 跟 domain 之間的反解

舉例來說,osk2.me 會對應到 128.199.162.144,而這 IP 也應該反解到 osk2.me

如果你的主機指定一個以上的 domain,就會需要設定 PTR 紀錄

一開始我發現 mail 的 header 解出來的 domain 和 ip 沒對應到

才懷疑這應該就是問題點


如圖,domain 正解反解的結果不一致

要設定 PTR 必須找你的主機商,像我自己用了 DigitalOcean 的 VPS

在 droplet 設定裡有一項是 rename,改了 droplet 名稱的同時就會幫你更新 PTR 紀錄

在你的帳戶後台的 DNS 裡面可以看見目前的 PTR 紀錄設定

值得注意的是,DigitalOcean DNS 紀錄的預設 TTL 是 24 小時,也就是說,設定更動之後可能要等很久很久才會生效,而且目前沒辦法改變 TTL 值,我自己是開了個 ticket 跟客服聊聊,沒多久就生效了(挖鼻

 

在 Windows 底下查詢 PTR 紀錄可以用 nslookup 指令

輸入 type=ptr 後,再輸入你要查詢的 IP

nslookup

set type=ptr

要查詢的IP

Linux 底下可以用 dig 來查詢

dig –x 要查詢的IP


但是,就是這個但是

PTR 紀錄生效之後 mail 依舊被送進垃圾信箱

再回頭看看第四點,檢查 mail 內容

 

我找了一堆相當實用的 mail 內容檢測網站

http://info.contactology.com/check-mqs

http://isnotspam.com

http://www.emailspamtest.com

http://lyris.com/us-en/contentchecker

雖然對結果來說,這些網站對我是一點幫助都沒有

不過從這些網站學到不少要注意的地方,像是 HTML 要注意不能用什麼標籤、標題要怎麼下…等等

更多類似的網站可以下這些關鍵字

email content checker

spam test

 

經過這些內容檢查,我已經可以自信滿滿的說我的 mail 絕對沒有問題

可是為什麼還是被 Gmail 擋掉…

 

 

然後我開始崩潰

每天寄信到自己信箱,要看到底什麼時候才能寄到信件夾

 

 

結果是這當然一點屁用都沒有XD

 

就在這個 moment!

我不死心又去 Google
(註︰這時候的搜尋結果幾乎都是紫色的字,也就是整個 Google 都被我翻爛了…)

大概就是這種盛況空前(?)的港結


終於找到隱藏在 Google 說明深處的一個連結

https://support.google.com/mail/contact/msgdelivery

標題寫著 Report a delivery problem between your domain and Gmail

要是有跑馬燈能用,我一定要把這標題加上跑馬燈

我又燃起一線希望啦

 

照著網頁上要求的項目填完之後送出,只能開始等

網站都已經拖過上線的黃金期

Google 又毫無音訊

 

我又開始崩潰亂寄信

就像一個魯蛇一直寄情書給變了心的前女友一樣

大概在回報 Google 後的第二天,程式發完信我竟然收到新信通知了

 

這種感覺就像一個魯蛇在網路上幻想他可以寄垃圾信寄到挽回他的前女友,過程中遇到壞(ㄍㄨ)人(ㄍㄡ)被百般組饒,最後還是跟他的前女友復合了一樣(到底是什麼爛故事

 

Anyway,最後我的結論是,垃圾信根本就是 Gmail 誤判,要是早早回報問題就不用後面搞得這麼累啦,Google 真的是誤人大事

 

 

最後我想說的是

FUCK YOU GOOGLE!

osk2 發表在 痞客邦 PIXNET 留言(0) 人氣()