在項目開發過程中,經常會用到通過程式發送電子郵件,例如:注冊使用者通過郵件激活,通過郵件找回密碼,發送報表等。這裡介紹幾種通過PHP發送電子郵件的 方式(1)通過mail()函數發送郵件(2)使用fsockopen方式連接配接smtp伺服器發送(3)使用phpmailer郵件類發送。個人推薦使用 phpmailer郵件類發送,phpmailer比較友善使用且功能強大,接下來對這幾種方式分别做一下介紹。
(1)通過mail()函數發送郵件
PHP中的mail() 函數允許從腳本中直接發送電子郵件,格式:
mail($to,$subject,$message,$headers,$parameters);
to 必需。規定郵件的接收者。
subject 必需。規定郵件的主題。該參數不能包含任何換行字元。
message 必需。規定要發送的消息。
headers 可選。規定額外的報頭,比如 From(發件人), Cc(抄送) 以及 Bcc(密送)。
parameters 可選。規定 sendmail 程式的額外參數。
需要特别mail()函數用法相當簡單,但并不我們使用mail()函數就可以直接發送郵件了,需要我們做一些配置,在Windows與Linux系統上的配置方式有些不同。我們發送郵件需郵件伺服器,如果是Linux伺服器需要在php.ini中的sendmail_path設定為伺服器的路徑,如果Linux在安裝時安裝了sendmail,可以這樣設定:
sendmail_path = /usr/sbin/sendmail
如果安裝的是Qmail等其他Mail伺服器則填寫對應的路徑即可。
如果是Windwos作業系統則需要配置SMTP和smtp_port着兩個參數,例如:
SMTP = localhost
smtp_port = 25
如果将SMTP設定為localhost則本機必須安裝郵件伺服器才能正常發信,當然也可以設定其他郵件伺服器的域名或IP位址,還有一個可選參數是sendmail_from可以設定預設的發件人郵箱。看一下php.ini的配置項:
(2)使用fsockopen方式連接配接smtp伺服器發送
首先需要有一個smtp郵件伺服器,可以自己搭建也可以使用網易,新浪等免費的郵件伺服器,發送的過程大緻如下:
1.建立TCP連接配接
2.用戶端發送HELO指令以辨別發件人自己的身份,然後用戶端發送MAIL指令,伺服器端正希望以OK作為響應,表明準備接收
3.用戶端發送RCPT指令,以辨別該電子郵件的計劃接收人,可以有多個RCPT行,伺服器端則表示是否願意為收件人接受郵件
4.協商結束,發送郵件,用指令DATA發送
目前絕大多數的服務商都提供SMTP服務,如果我們要使用的MTA需要使用者認證(絕大多數的郵件服務商都需要認證)那就需要我們使用有效的使用者名密碼登
陸。以網易的163郵箱為例,首先注冊一個郵箱賬号比如:[email protected],這裡我們使用一個寫好的email.class.php來實作與
SMTP伺服器實作通信并發送郵件的功能,使用前需要在配置檔案config.php中配置一下各項參數,詳細說明可以參考附件中的示例代碼。
(3)使用phpMailer郵件類發送電子郵件(特别推薦)
先來幾句廢話:
phpMailer是一個非常強大的php發送郵件類,可以設定發送郵件位址、回複位址、郵件主題、html網頁,上傳附件,并且使用起來非常友善。
phpMailer的特點:
1、在郵件中包含多個 TO、CC、BCC 和 REPLY-TO。
2、平台應用廣泛,支援的 SMTP 伺服器包括 Sendmail、qmail、Postfix、Gmail、Imail、Exchange 等等。
3、支援嵌入圖像,附件,HTML 郵件。
4、可靠的強大的調試功能。
5、支援 SMTP 認證。
6、自定義郵件頭。
7、支援 8bit、base64、binary 和 quoted-printable 編碼。
使用phpMailer發送郵件需要class.phpmailer.php和class.smtp.php兩個檔案,比較簡單的代碼片段:
require_once('./class.phpmailer.php');
include_once("class.smtp.php");
$mail = new PHPMailer(true); //執行個體化PHPMailer類,true表示出現錯誤時抛出異常
$mail->IsSMTP(); // 使用SMTP
try {
$mail->CharSet ="UTF-8";//設定郵件編碼
$mail->Host = "smtp.163.com"; // SMTP server
$mail->SMTPDebug = 1;// 啟用SMTP調試 1 = errors 2 = messages
$mail->SMTPAuth = true;// 伺服器需要驗證
$mail->Port = 25;//預設端口
$mail->Username = "testuser"; //SMTP伺服器的使用者帳号
$mail->Password = "testpwd";//SMTP伺服器的使用者密碼
$mail->AddReplyTo('****@com133.com', '回複'); //收件人回複時回複到此郵箱
$mail->AddAddress('****@test.com', '李明'); //收件人如果多人發送循環執行AddAddress()方法即可 還有一個方法時清除收件人郵箱ClearAddresses()
$mail->SetFrom('[email protected]', '發件人');//發件人的郵箱
$mail->Subject = '這裡是郵件的标題';
$mail->Body = '郵件内容';
$mail->IsHTML(true);
$mail->Send();
echo "Message Sent OK";
} catch (phpmailerException $e) {
echo $e->errorMessage();//從PHPMailer捕獲異常
} catch (Exception $e) {
echo $e->getMessage();
}
?>
如果使用phpMailer發送html網頁隻需添加代碼:
$body = file_get_contents('tpl.html'); //擷取html網頁内容
$mail->MsgHTML(eregi_replace("[\]",'',$body));
注:使用MsgHTML()方法時發送的郵件内容不僅僅是html代碼,而且可以将html代碼中的圖檔等内容作為附件嵌入到頁面中一起發送,這在發送圖
文并茂的資訊時比較常用。并且使用該方法時無需對Body屬性指派也無需使用IsHTML()方法(即使使用也沒有效果)。
通過SSL安全連接配接發送郵件
目前很多郵箱使用SLL加密方式連接配接發信,例如谷歌的GMAIL目前隻支援加密連接配接,網易、騰訊等服務商目前也支援SLL加密方式連接配接。SSL協定端口号通常是465(具體視服務商而定),如果通過SSL方式發送郵件隻需增加一個屬性即可:
$mail->SMTPSecure = "ssl";
同時端口号更改為SSL的端口号,例如:
$mail->Port = 465;
這樣就可以通過SSL協定發送郵件了。