誰動了你的mail(),PHP?

IvanTian發表於2012-07-04

PHP編寫郵件傳送的函式時候,會出現一個很奇怪的問題,那就是: Warning: mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in ....... of course,這個紅色不是網頁上顯示的,只是為了這樣說明,不過你可以設定顯示的顏色,這個嘛,這個要留給你考究了。

通過internet搜尋了相關的回答,包括相關的技術部落格,大家都是很簡單的闡述瞭解決方案.大多是隻是提到修改:php.ini 中的[mail function] 函式,將smtp的相關功能進行開啟即可,以下是詳細的修改: [mail function] SMTP = localhost smtp_port = 25 sendmail_from = youremailUsual@domin.com ;這裡有必要註釋下,這個郵件是From方面. sendmail_path = "" ;起初是空的,這裡在後面做說明. mail_add_x_header = on ;這裡是預設on的 無需更改

到這一步,修改完畢,重啟apache,當然這個操作,我實在CMD下操作的,話說這個操作,還鬧了一個小笑話.How stupid i am !

重啟完畢,重新整理頁面,錯誤仍然存在.

這裡陷入糾結的地步,stackoverflow 中提到了IIS(windows 預設的伺服器),在控制皮膚-管理工具下竟然找不到這一項,由於是win7的緣故,在新增和刪除程式下,把它開啟即可,注意操作,後來可以在管理工具下找到,雙擊開啟,此時看到smtp的項都很激動.雙擊開啟,配置了相關的引數,如截圖所示:

說句實話,這一步做的比較腦殘,那上面是ASP.net的選項,管你PHP毛事.

痛定思痛,維基百科查了smtp的協議詳細解釋,連線Click Here:簡單郵件協議 回來繼續修改,[mail function],如下: ;以126郵箱的設定為例子 SMTP = smtp.126.com smtp_port = 25 sendmail_from = my126EmailAddress@126.com sendmail_path = "" mail_add_x_header = on

同時修改了程式中$from變數的數值,為了保持一致.

[因為之前做了測試,程式中新增 phpinfo()函式,執行後,在頁面搜尋 mail項,你會發現會有一個 Localhost Value 和 master Value ,當然這個很好理解,Localhost Value指的是你程式中設定的數值,master Value是php.ini的設定] 執行後,神奇的錯誤消失了,不過出現瞭如下的錯誤: mail(): SMTP server response: 553 You are not authorized to send mail, authentication is required aaf353e4-8ac5-416e-9cd5-6b54fc592764

之後改了其他的郵箱,如QQ,Gamil等,錯誤都如上面提示,看了一個熟悉的單詞authorized ,就明白啥意思了.

到這一步貌似離成功不遠了,想起以前使用客戶端配置郵箱使用者的時候,最後一步都會詢問你是不是需要開啟"伺服器身份驗證".最後一不小心搜到了一個叫做sendmail的檔案包,下載地址如下:sendmail 之後,最好在PHP的根目錄下新建一個資料夾,取名叫做:sendmail,之後託壓縮包進去,再解壓出來,修改一個叫做sendmail.ini的檔案,修改的地方如下:

;take the fomus email provider in China 126 for example [sendmail] smtp_server= smtp.126.com
smtp_port=25 default_domin =126.com auth_username= strings in your email address before char '@'
auth_password= your password which allow you to login in your email-box hostname= 126.com

之後,你就要修改 php.ini,還是老地方: SMTP = smtp.126.com ;這裡修改為localhost 也是一樣,其他選項保持不變. smtp_port = 25 sendmail_from = my126EmailAddress@126.com sendmail_path = "your sendmail path/sendemail.exe -t " ;當然這個路徑的前半部分必須包括你的PHP安裝的根目錄,將"\"換成"/",我想是必須要做的. mail_add_x_header = on

到這裡配置完成,重啟你的apache,重新整理頁面,錯誤的消失,因為程式中設定的$to是自己的126和QQ郵箱,當然迴圈發的.

當看到桌面右下角QQ上彈出三豐郵件提示的時候,I know that I resolve it .開啟郵件的內容,和我在頁面輸入的內容完全一致,而且有些內容還是從本地的資料庫中讀出來的。
successfully Happiness!

相關文章