在項目開發過程中,經常會用到通過程序發送電子郵件,例如:注冊用戶通過郵件激活,通過郵件找回密碼,發送報表等。這里介紹幾種通過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可以設置默認的發件人郵箱??匆幌聀hp.ini的配置項:
(2)使用fsockopen方式連接smtp服務器發送
首先需要有一個smtp郵件服務器,可以自己搭建也可以使用網易,新浪等免費的郵件服務器,發送的過程大致如下:
1.建立TCP連接 2.客戶端發送HELO命令以標識發件人自己的身份,然后客戶端發送MAIL命令,服務器端正希望以OK作為響應,表明準備接收 3.客戶端發送RCPT命令,以標識該電子郵件的計劃接收人,可以有多個RCPT行,服務器端則表示是否愿意為收件人接受郵件 4.協商結束,發送郵件,用命令DATA發送 目前絕大多數的服務商都提供SMTP服務,如果我們要使用的MTA需要用戶認證(絕大多數的郵件服務商都需要認證)那就需要我們使用有效的用戶名密碼登陸。以網易的163郵箱為例,首先注冊一個郵箱賬號比如:mytest@163.com,這里我們使用一個寫好的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兩個文件,比較簡單的代碼片段:
<?phprequire_once('./class.phpmailer.php');
include_once("class.smtp.php");$mail = new PHPMailer(true); //實例化PHPMailer類,true表示出現錯誤時拋出異常$mail->IsSMTP(); // 使用SMTPtry { $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('li1209@163.com', '發件人');//發件人的郵箱$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協議發送郵件了。新聞熱點
疑難解答
圖片精選