PHP傳送郵件
在專案開發過程中,經常會用到透過程式傳送電子郵件,例如:註冊使用者透過郵件啟用,透過郵件找回密碼,傳送報表等。這裡介紹幾種透過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的配置項:
使用mail函式時php.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兩個檔案,比較簡單的程式碼片段:
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('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協議傳送郵件了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4687/viewspace-2809577/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- php windows 傳送郵件PHPWindows
- PHP回顧之傳送郵件PHP
- SpringBoot整合Mail傳送郵件&傳送模板郵件Spring BootAI
- php 傳送郵件(以QQ為例)PHP
- 傳送郵件
- 郵件傳送
- SpringBoot傳送郵件Spring Boot
- phpcms傳送郵件PHP
- 郵件的傳送
- Laravel傳送郵件Laravel
- Laravel 傳送郵件Laravel
- thinkjs 傳送郵件JS
- nodejs 傳送郵件NodeJS
- java郵件傳送Java
- python傳送郵件Python
- Django——郵件傳送Django
- gmail傳送郵件AI
- SpringBoot郵件傳送Spring Boot
- Java Mail 郵件傳送(二):簡單封裝的郵件傳送JavaAI封裝
- golang傳送郵件(qq郵箱)Golang
- SpringBoot傳送郵件(二)Spring Boot
- SpringBoot傳送郵件(三)Spring Boot
- SpringBoot整合郵件傳送Spring Boot
- 定時傳送郵件
- 使用 smtplib 傳送郵件
- Python SMTP傳送郵件Python
- 郵件傳送API整理API
- Ubuntu的郵件傳送Ubuntu
- Android 快速傳送郵件Android
- 使用phpmailer傳送郵件PHPAI
- 如何傳送電子郵件到別人郵箱?電子郵件傳送的方法
- Springboot 自動傳送郵件Spring Boot
- python實現傳送郵件Python
- Spring Boot整合郵件傳送Spring Boot
- Laravel 傳送郵件報錯Laravel
- Jenkins 如何成功傳送郵件?Jenkins
- Jmeter——SMTP Sampler傳送郵件JMeter
- Alertmanager傳送告警郵件配置