1. 程式人生 > >windows下使用php自帶的mail函式實現簡單的郵件傳送例項(QQ親試成功)

windows下使用php自帶的mail函式實現簡單的郵件傳送例項(QQ親試成功)

問題:

初學php,打算實現一下找回密碼功能。當然這涉及到不少的問題,我直接想到的是怎麼發郵件的問題,這便是今天要解決的問題了。

查資料:

為解決這個問題,到網上查了很多資料,也看到網上有很多相關的資料,可能是由於鄙人比較笨,試了很多前人的方法,也總還是出現這樣那樣的問題,著實讓人鬱悶,還好最終實現了,故做下總結,權當筆記。

我的實現方法如下:

環境及工具:

win7_64bit

phpstudy(初學者推薦工具)包含php5.3、sendmail(沒有的話可網上下)

兩個QQ號一個發一個收(我只有QQ郵箱,所以沒測試其他郵箱,如163等)

操作:

1、需要用到mail函式,大家可以呼叫<? php phpinfo(); ?>來檢視自己的伺服器是否支援這個函式。這裡mail郵件函式是 PHP 核心的組成部分。無需安裝即可使用這些函式。

2、作為郵件傳送方的QQ必須開啟SMTP服務,不開啟是無法實現在php指令碼中使用該QQ郵箱實現郵箱傳送的。具體如何設定可到網上百度。

3、25號埠用於SMTP,如果被佔用或被防火牆禁止訪問,我想也是會失敗的。雖然我在實踐的時候沒出問題,但是如果出問題,這方面還是應該考慮一下。

4、php.ini配置如下:

SMTP = smtp.qq.com

smtp_port = 25

mail.add_x_header = On

sendmail_path="F:\phpStudy\phpStudy\tools\sendmail\sendmail.exe -t"

sendmail_path便是你的sendmail的路徑,網上有說,該路徑不宜過長,也不知道我這個算不算長,反正沒出問題。我們知道,在php.ini所做的修改要想生效,都得重啟apache。在實踐中,由於種種原因(例如在執行中的專案,不可能輕易讓你重啟),負責伺服器的傢伙99%不讓你改配置檔案,但我們又要實現某些功能,又不知道相關配置是否符合要求,那咋辦?還好,php為我們提供了ini_set()這樣的函式,顧名思義,通過該函式可以在php指令碼中動態的修改php.ini配置。當然這種配置只在當前指令碼有效。(據說有些php.ini的配置不能php.ini外更改,這和相關配置的可修改範圍有關)

5、sendmail.ini配置如下

smtp_server=smtp.qq.com

smtp_port=25

smtp_ssl=auto

error_logfile=error.log建議開啟(將前面的分號去掉),便於查詢問題

debug_logfile=debug.log 建議開啟(將前面的分號去掉),便於查詢問題

auth_username=*****@qq.com傳送郵件的QQ郵箱號

auth_password=***** 郵箱密碼

force_sender=*****@qq.com要同上上

force_sender該配置網上有說可以隨意,填不填都行。不知道在實際操作中我的哪些行為出錯了,反正我不填,或亂填都會失敗。檢視sendmail資料夾的error.log檔案,可以看到這樣的提示“mail from address must be same as authorization user”,翻譯一下,大概意思是“郵件從地址必須同授權使用者的一樣

”。所以,force_sender的值必須與auth_username的值時一樣的。如果你的郵件傳送也失敗,那可以試著修改這裡。

測試程式碼:

<?php 

// php.ini動態配置

ini_set('sendmail_path','F:\phpStudy\phpStudy\tools\sendmail\sendmail.exe -t');

ini_set('SMTP','smtp.qq.com ');

ini_set('smtp_port','25');

ini_set('mail.add_x_header','On');

$from = 'mail測試';

$to = '*****@qq.com';//發給的QQ郵箱

$subject = '測試';

$message = '這是使用php的mail函式在指令碼中發來的郵件';

$message = wordwrap($message, 70); //mail()該函式規定要傳送的訊息每行不能超過70個字

/**
 * (Windows 下)當 PHP 直接連線到 SMTP 伺服器時,如果在一行開頭髮現一個句號,則會被刪掉。
 * 要避免此問題,將單個句號替換成兩個句號。
 */
$message = str_replace("\n.", "\n..", $message);

$headers = 'MIME-Version: 1.0' . "\r\n";

$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";

$headers .= 'From: ' . $from . "\r\n";

if (mail($to, $subject, $message, $headers)){
    echo '傳送成功!';
}else{
echo "傳送失敗!";
}

?>
總結:

最終能實現傳送郵件,但可以看到這些郵件都會被騰訊判定為垃圾郵件放到垃圾箱中,不知道他是怎麼判定的,我們的程式又該如何修改,才能解決該問題(網上也沒找到具體方案)。還有在查資料的過程中有說可以搭建自己的郵件伺服器,感覺好高大上,有時間去了解下。第一次寫部落格,只是感覺自己花了時間去做的事,應該總結總結,萬一以後用到,可以更方便的查詢。

參考資料:

http://blog.sina.com.cn/s/blog_4a4a8c7d01015bwb.html

http://www.w3school.com.cn/php/php_ref_mail.asp

http://www.cnblogs.com/vipsoft/archive/2012/05/02/2478847.html

http://jingyan.baidu.com/article/90895e0f96807a64ec6b0be7.html

http://blog.csdn.net/webmail_server/article/details/8113724