[PHP]SMTP error from remote mail server after end of data 這樣解

我們製作一個網站,
免不了的就是會設計一些表單,
像是留言啦、加入會員啦或是購物表單等等,
這些表單在網友完成後,
大多會讓網站系統在背景中,
使用 PHP 的郵件功能(mail),
來通知網友,或是站長:有人留言囉(或是加入會員、或有人下單了)。
 
這本是一個再簡單不過的小功能(感覺上是百年前就存在的功能了^^),
但是有時候,
我們會突然發現,咦?怎麼有些郵件的通知不見了呢?
明明直接到網站後台去查,
留言也是成功的,會員也加入了,訂單也下好了,
可是系統怎麼沒有乖乖的寄出通知信呢?
 
追蹤一下,發現在 cPanel 的 Email Delivery Route 中,
會看到這些系統沒有寄出的通知信,
都發出一個錯誤訊息:
SMTP error from remote mail server after end of data: 550-5.7.1 
Unauthenticated email from yahoo.com.tw is not accepted due to
550-5.7.1 domain's DMARC policy.
Please contact administrator of yahoo.com.tw
550-5.7.1

 
喔!原來這是因為在撰寫系統通知信的功能時,
為求方便,
直接在 PHP 的 Mail 功能中,
將寄件人(From)欄位填上了網友的郵件,
但這個郵件卻不是這個網友直接寄出的(因為是系統代寄的),
為了防止偽造郵件或是詐騙郵件,
所以 Yahoo或是Gmail等大型的郵件供應服務都採用了 DMARC 的規則,
當他們發現這封信不是由他們驗證的主機發出的時候,
就會檔下來了。
 
快速解決的方法如下(使用PHP Mail功能):
$headers = 'MIME-Version: 1.0' . "\n";
$headers .= "Content-type: text/html; charset=utf-8" . "\n";
$headers .= "Return-Path: 用網友的郵件"."\n";
$headers .= "To: 5min.reading@gmail.com" . "\n";
$headers .= 'Reply-To: 用網友的郵件' . "\r\n" .
$headers .= "From: 5min.reading@gmail.com" . "\n";

 
這樣就可以了,
簡單來說,就是 From 這一項不要用網友(或會員、消費者)郵件地址,
然後加入 Return-Path 以及 Reply-To 這兩個欄位,
並把網友的郵件地址設在這裡,
這樣就可以了喔 ^^
 
修正之後,就不會再遺失郵件通知,
同時在收信時,
也可以很方便的直接以回覆的方式,
就可以把回覆的內容寄給網友囉。
 
試試看吧。