中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

PHP實現支持SSL連接的SMTP郵件發送類
來源:易賢網 閱讀:1798 次 日期:2015-03-09 16:02:35
溫馨提示:易賢網小編為您整理了“PHP實現支持SSL連接的SMTP郵件發送類”,方便廣大網友查閱!

這篇文章主要介紹了PHP實現支持SSL連接的SMTP郵件發送類,實例分析了php實現smtp郵件發送類的原理與技巧,以及支持SSL連接的方法,需要的朋友可以參考下

本文實例講述了PHP實現支持SSL連接的SMTP郵件發送類。分享給大家供大家參考。具體如下:

該實例代碼測試過了gmail和QQ郵箱的SMTP。具體代碼如下:

代碼如下:

<?php

/**

* 郵件發送類

* 支持發送純文本郵件和HTML格式的郵件,可以多收件人,多抄送,多秘密抄送,帶附件(單個或多個附件),支持到服務器的ssl連接

* 需要的php擴展:sockets、Fileinfo和openssl。

* 編碼格式是UTF-8,傳輸編碼格式是base64

* @example

* $mail = new MySendMail();

* $mail->setServer("", "", "XXXXX"); //設置smtp服務器,普通連接方式

* $mail->setServer("smtp.gmail.com", "", "XXXXX", 465, true); //設置smtp服務器,到服務器的SSL連接

* $mail->setFrom("XXXXX"); //設置發件人

* $mail->setReceiver("XXXXX"); //設置收件人,多個收件人,調用多次

* $mail->setCc("XXXX"); //設置抄送,多個抄送,調用多次

* $mail->setBcc("XXXXX"); //設置秘密抄送,多個秘密抄送,調用多次

* $mail->addAttachment("XXXX"); //添加附件,多個附件,調用多次

* $mail->setMail("test", "<b>test</b>"); //設置郵件主題、內容

* $mail->sendMail(); //發送

*/

class MySendMail {

/**

* @var string 郵件傳輸代理用戶名

* @access protected

*/

protected $_userName;

/**

* @var string 郵件傳輸代理密碼

* @access protected

*/

protected $_password;

/**

* @var string 郵件傳輸代理服務器地址

* @access protected

*/

protected $_sendServer;

/**

* @var int 郵件傳輸代理服務器端口

* @access protected

*/

protected $_port;

/**

* @var string 發件人

* @access protected

*/

protected $_from;

/**

* @var array 收件人

* @access protected

*/

protected $_to = array();

/**

* @var array 抄送

* @access protected

*/

protected $_cc = array();

/**

* @var array 秘密抄送

* @access protected

*/

protected $_bcc = array();

/**

* @var string 主題

* @access protected

*/

protected $_subject;

/**

* @var string 郵件正文

* @access protected

*/

protected $_body;

/**

* @var array 附件

* @access protected

*/

protected $_attachment = array();

/**

* @var reource socket資源

* @access protected

*/

protected $_socket;

/**

* @var reource 是否是安全連接

* @access protected

*/

protected $_isSecurity;

/**

* @var string 錯誤信息

* @access protected

*/

protected $_errorMessage;

/**

* 設置郵件傳輸代理,如果是可以匿名發送有郵件的服務器,只需傳遞代理服務器地址就行

* @access public

* @param string $server 代理服務器的ip或者域名

* @param string $username 認證賬號

* @param string $password 認證密碼

* @param int $port 代理服務器的端口,smtp默認25號端口

* @param boolean $isSecurity 到服務器的連接是否為安全連接,默認false

* @return boolean

*/

public function setServer($server, $username="", $password="", $port=25, $isSecurity=false) {

$this->_sendServer = $server;

$this->_port = $port;

$this->_isSecurity = $isSecurity;

$this->_userName = empty($username) ? "" : base64_encode($username);

$this->_password = empty($password) ? "" : base64_encode($password);

return true;

}

/**

* 設置發件人

* @access public

* @param string $from 發件人地址

* @return boolean

*/

public function setFrom($from) {

$this->_from = $from;

return true;

}

/**

* 設置收件人,多個收件人,調用多次.

* @access public

* @param string $to 收件人地址

* @return boolean

*/

public function setReceiver($to) {

$this->_to[] = $to;

return true;

}

/**

* 設置抄送,多個抄送,調用多次.

* @access public

* @param string $cc 抄送地址

* @return boolean

*/

public function setCc($cc) {

$this->_cc[] = $cc;

return true;

}

/**

* 設置秘密抄送,多個秘密抄送,調用多次

* @access public

* @param string $bcc 秘密抄送地址

* @return boolean

*/

public function setBcc($bcc) {

$this->_bcc[] = $bcc;

return true;

}

/**

* 設置郵件附件,多個附件,調用多次

* @access public

* @param string $file 文件地址

* @return boolean

*/

public function addAttachment($file) {

if(!file_exists($file)) {

$this->_errorMessage = "file " . $file . " does not exist.";

return false;

}

$this->_attachment[] = $file;

return true;

}

/**

* 設置郵件信息

* @access public

* @param string $body 郵件主題

* @param string $subject 郵件主體內容,可以是純文本,也可是是HTML文本

* @return boolean

*/

public function setMail($subject, $body) {

$this->_subject = base64_encode($subject);

$this->_body = base64_encode($body);

return true;

}

/**

* 發送郵件

* @access public

* @return boolean

*/

public function sendMail() {

$command = $this->getCommand();

$this->_isSecurity ? $this->socketSecurity() : $this->socket();

foreach ($command as $value) {

$result = $this->_isSecurity ? $this->sendCommandSecurity($value[0], $value[1]) : $this->sendCommand($value[0], $value[1]);

if($result) {

continue;

}

else{

return false;

}

}

//其實這里也沒必要關閉,smtp命令:QUIT發出之后,服務器就關閉了連接,本地的socket資源會自動釋放

$this->_isSecurity ? $this->closeSecutity() : $this->close();

return true;

}

/**

* 返回錯誤信息

* @return string

*/

public function error(){

if(!isset($this->_errorMessage)) {

$this->_errorMessage = "";

}

return $this->_errorMessage;

}

/**

* 返回mail命令

* @access protected

* @return array

*/

protected function getCommand() {

$separator = "----=_Part_" . md5($this->_from . time()) . uniqid(); //分隔符

$command = array(

array("HELO sendmail\r\n", 250)

);

if(!empty($this->_userName)){

$command[] = array("AUTH LOGIN\r\n", 334);

$command[] = array($this->_userName . "\r\n", 334);

$command[] = array($this->_password . "\r\n", 235);

}

//設置發件人

$command[] = array("MAIL FROM: <" . $this->_from . ">\r\n", 250);

$header = "FROM: <" . $this->_from . ">\r\n";

//設置收件人

if(!empty($this->_to)) {

$count = count($this->_to);

if($count == 1){

$command[] = array("RCPT TO: <" . $this->_to[0] . ">\r\n", 250);

$header .= "TO: <" . $this->_to[0] .">\r\n";

}

else{

for($i=0; $i<$count; $i++){

$command[] = array("RCPT TO: <" . $this->_to[$i] . ">\r\n", 250);

if($i == 0){

$header .= "TO: <" . $this->_to[$i] .">";

}

elseif($i + 1 == $count){

$header .= ",<" . $this->_to[$i] .">\r\n";

}

else{

$header .= ",<" . $this->_to[$i] .">";

}

}

}

}

//設置抄送

if(!empty($this->_cc)) {

$count = count($this->_cc);

if($count == 1){

$command[] = array("RCPT TO: <" . $this->_cc[0] . ">\r\n", 250);

$header .= "CC: <" . $this->_cc[0] .">\r\n";

}

else{

for($i=0; $i<$count; $i++){

$command[] = array("RCPT TO: <" . $this->_cc[$i] . ">\r\n", 250);

if($i == 0){

$header .= "CC: <" . $this->_cc[$i] .">";

}

elseif($i + 1 == $count){

$header .= ",<" . $this->_cc[$i] .">\r\n";

}

else{

$header .= ",<" . $this->_cc[$i] .">";

}

}

}

}

//設置秘密抄送

if(!empty($this->_bcc)) {

$count = count($this->_bcc);

if($count == 1) {

$command[] = array("RCPT TO: <" . $this->_bcc[0] . ">\r\n", 250);

$header .= "BCC: <" . $this->_bcc[0] .">\r\n";

}

else{

for($i=0; $i<$count; $i++){

$command[] = array("RCPT TO: <" . $this->_bcc[$i] . ">\r\n", 250);

if($i == 0){

$header .= "BCC: <" . $this->_bcc[$i] .">";

}

elseif($i + 1 == $count){

$header .= ",<" . $this->_bcc[$i] .">\r\n";

}

else{

$header .= ",<" . $this->_bcc[$i] .">";

}

}

}

}

//主題

$header .= "Subject: =?UTF-8?B?" . $this->_subject ."?=\r\n";

if(isset($this->_attachment)) {

//含有附件的郵件頭需要聲明成這個

$header .= "Content-Type: multipart/mixed;\r\n";

}

elseif(false){

//郵件體含有圖片資源的,且包含的圖片在郵件內部時聲明成這個,如果是引用的遠程圖片,就不需要了

$header .= "Content-Type: multipart/related;\r\n";

}

else{

//html或者純文本的郵件聲明成這個

$header .= "Content-Type: multipart/alternative;\r\n";

}

//郵件頭分隔符

$header .= "\t" . 'boundary="' . $separator . '"';

$header .= "\r\nMIME-Version: 1.0\r\n";

//這里開始是郵件的body部分,body部分分成幾段發送

$header .= "\r\n--" . $separator . "\r\n";

$header .= "Content-Type:text/html; charset=utf-8\r\n";

$header .= "Content-Transfer-Encoding: base64\r\n\r\n";

$header .= $this->_body . "\r\n";

$header .= "--" . $separator . "\r\n";

//加入附件

if(!empty($this->_attachment)){

$count = count($this->_attachment);

for($i=0; $i<$count; $i++){

$header .= "\r\n--" . $separator . "\r\n";

$header .= "Content-Type: " . $this->getMIMEType($this->_attachment[$i]) . '; name="=?UTF-8?B?' . base64_encode( basename($this->_attachment[$i]) ) . '?="' . "\r\n";

$header .= "Content-Transfer-Encoding: base64\r\n";

$header .= 'Content-Disposition: attachment; filename="=?UTF-8?B?' . base64_encode( basename($this->_attachment[$i]) ) . '?="' . "\r\n";

$header .= "\r\n";

$header .= $this->readFile($this->_attachment[$i]);

$header .= "\r\n--" . $separator . "\r\n";

}

}

//結束郵件數據發送

$header .= "\r\n.\r\n";

$command[] = array("DATA\r\n", 354);

$command[] = array($header, 250);

$command[] = array("QUIT\r\n", 221);

return $command;

}

/**

* 發送命令

* @access protected

* @param string $command 發送到服務器的smtp命令

* @param int $code 期望服務器返回的響應嗎

* @return boolean

*/

protected function sendCommand($command, $code) {

echo 'Send command:' . $command . ',expected code:' . $code . '<br />';

//發送命令給服務器

try{

if(socket_write($this->_socket, $command, strlen($command))){

//當郵件內容分多次發送時,沒有$code,服務器沒有返回

if(empty($code)) {

return true;

}

//讀取服務器返回

$data = trim(socket_read($this->_socket, 1024));

echo 'response:' . $data . '<br /><br />';

if($data) {

$pattern = "/^".$code."+?/";

if(preg_match($pattern, $data)) {

return true;

}

else{

$this->_errorMessage = "Error:" . $data . "|**| command:";

return false;

}

}

else{

$this->_errorMessage = "Error:" . socket_strerror(socket_last_error());

return false;

}

}

else{

$this->_errorMessage = "Error:" . socket_strerror(socket_last_error());

return false;

}

}catch(Exception $e) {

$this->_errorMessage = "Error:" . $e->getMessage();

}

}

/**

* 安全連接發送命令

* @access protected

* @param string $command 發送到服務器的smtp命令

* @param int $code 期望服務器返回的響應嗎

* @return boolean

*/

protected function sendCommandSecurity($command, $code) {

echo 'Send command:' . $command . ',expected code:' . $code . '<br />';

try {

if(fwrite($this->_socket, $command)){

//當郵件內容分多次發送時,沒有$code,服務器沒有返回

if(empty($code)) {

return true;

}

//讀取服務器返回

$data = trim(fread($this->_socket, 1024));

echo 'response:' . $data . '<br /><br />';

if($data) {

$pattern = "/^".$code."+?/";

if(preg_match($pattern, $data)) {

return true;

}

else{

$this->_errorMessage = "Error:" . $data . "|**| command:";

return false;

}

}

else{

return false;

}

}

else{

$this->_errorMessage = "Error: " . $command . " send failed";

return false;

}

}catch(Exception $e) {

$this->_errorMessage = "Error:" . $e->getMessage();

}

}

/**

* 讀取附件文件內容,返回base64編碼后的文件內容

* @access protected

* @param string $file 文件

* @return mixed

*/

protected function readFile($file) {

if(file_exists($file)) {

$file_obj = file_get_contents($file);

return base64_encode($file_obj);

}

else {

$this->_errorMessage = "file " . $file . " dose not exist";

return false;

}

}

/**

* 獲取附件MIME類型

* @access protected

* @param string $file 文件

* @return mixed

*/

protected function getMIMEType($file) {

if(file_exists($file)) {

$mime = mime_content_type($file);

/*if(! preg_match("/gif|jpg|png|jpeg/", $mime)){

$mime = "application/octet-stream";

}*/

return $mime;

}

else {

return false;

}

}

/**

* 建立到服務器的網絡連接

* @access protected

* @return boolean

*/

protected function socket() {

//創建socket資源

$this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));

if(!$this->_socket) {

$this->_errorMessage = socket_strerror(socket_last_error());

return false;

}

socket_set_block($this->_socket);//設置阻塞模式

//連接服務器

if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) {

$this->_errorMessage = socket_strerror(socket_last_error());

return false;

}

$str = socket_read($this->_socket, 1024);

if(!preg_match("/220+?/", $str)){

$this->_errorMessage = $str;

return false;

}

return true;

}

/**

* 建立到服務器的SSL網絡連接

* @access protected

* @return boolean

*/

protected function socketSecurity() {

$remoteAddr = "tcp://" . $this->_sendServer . ":" . $this->_port;

$this->_socket = stream_socket_client($remoteAddr, $errno, $errstr, 30);

if(!$this->_socket){

$this->_errorMessage = $errstr;

return false;

}

//設置加密連接,默認是ssl,如果需要tls連接,可以查看php手冊stream_socket_enable_crypto函數的解釋

stream_socket_enable_crypto($this->_socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);

stream_set_blocking($this->_socket, 1); //設置阻塞模式

$str = fread($this->_socket, 1024);

if(!preg_match("/220+?/", $str)){

$this->_errorMessage = $str;

return false;

}

return true;

}

/**

* 關閉socket

* @access protected

* @return boolean

*/

protected function close() {

if(isset($this->_socket) && is_object($this->_socket)) {

$this->_socket->close();

return true;

}

$this->_errorMessage = "No resource can to be close";

return false;

}

/**

* 關閉安全socket

* @access protected

* @return boolean

*/

protected function closeSecutity() {

if(isset($this->_socket) && is_object($this->_socket)) {

stream_socket_shutdown($this->_socket, STREAM_SHUT_WR);

return true;

}

$this->_errorMessage = "No resource can to be close";

return false;

}

}

希望本文所述對大家的php程序設計有所幫助。

更多信息請查看IT技術專欄

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久中文久久字幕| 在线电影国产精品| 欧美日韩蜜桃| 在线高清一区| 性一交一乱一区二区洋洋av| 日韩午夜一区| 久久这里只有精品视频首页| 黄色精品网站| 欧美不卡三区| 美女成人午夜| 国产一区二区精品久久| 亚洲一二三区视频在线观看| 欧美丝袜一区二区| 亚洲少妇自拍| 亚洲第一狼人社区| 欧美日韩一二三四五区| 欧美专区亚洲专区| 亚洲欧洲精品一区二区| 欧美日本网站| 午夜精品短视频| 韩国精品久久久999| 欧美激情a∨在线视频播放| 亚洲人www| 国产精品午夜av在线| 久久蜜桃资源一区二区老牛| 亚洲国产精品va在看黑人| 亚洲欧美伊人| 国产一区二区0| 久久婷婷国产综合精品青草| 91久久久在线| 国产欧美亚洲视频| 欧美福利一区二区| 亚洲一区中文| 91久久精品视频| 国产乱码精品一区二区三区忘忧草| 久久精品视频在线看| 这里只有视频精品| 一色屋精品视频在线看| 欧美日韩另类综合| 久久精品综合| 亚洲欧美国产制服动漫| 在线看一区二区| 国产欧美成人| 欧美午夜精品理论片a级按摩| 久久香蕉国产线看观看av| 亚洲一区制服诱惑| 日韩一区二区久久| 亚洲国产精品成人综合色在线婷婷| 国产女优一区| 欧美日韩在线电影| 欧美激情中文字幕乱码免费| 久久九九免费视频| 欧美在线免费视频| 亚洲免费在线观看视频| 亚洲精品视频中文字幕| 最近中文字幕日韩精品| 亚洲第一久久影院| 在线日韩一区二区| 国内成人精品一区| 狠狠色综合播放一区二区| 国产精品毛片va一区二区三区 | 亚洲人在线视频| 国内视频精品| 国产亚洲高清视频| 精品动漫3d一区二区三区免费 | 国产一区二区三区最好精华液 | 国产精品chinese| 欧美成人一品| 欧美激情无毛| 欧美日韩三区| 国产精品日日做人人爱 | 欧美日韩在线视频首页| 欧美人成免费网站| 欧美视频精品一区| 国产精品久久久久高潮| 国产精品手机在线| 激情亚洲成人| 亚洲精品一区二区三区樱花 | 一本久久综合亚洲鲁鲁五月天| av成人老司机| 欧美一区二区三区视频在线| 亚洲欧美日韩国产综合精品二区| 国产日韩1区| 亚洲一区二区三区精品在线观看| 一区二区成人精品 | 国产伦精品一区二区三区四区免费 | 欧美日韩国产精品一区| 欧美激情在线免费观看| 欧美日韩亚洲成人| 国产精品日韩一区| 欧美日韩一卡| 国产精品一区二区在线观看不卡| 国内精品免费午夜毛片| 亚洲激情在线| 欧美一区二区三区啪啪| 蜜臀av一级做a爰片久久| 欧美日韩第一页| 国内外成人免费激情在线视频网站 | 欧美三日本三级三级在线播放| 欧美亚洲成人网| 国外视频精品毛片| 一区二区国产在线观看| 久久国产一区| 欧美日韩成人在线| 伊人久久久大香线蕉综合直播| 一区二区三区视频在线播放| 久久成人资源| 欧美午夜精品久久久久久孕妇| 精品二区视频| 午夜精品在线观看| 欧美精品一二三| 一色屋精品视频在线看| 一区二区欧美日韩视频| 久久人人爽人人| 国产精品视频网址| av成人毛片| 狼人社综合社区| 国产欧美日韩综合一区在线播放| 亚洲国产美女| 久久久久免费| 国产精品入口麻豆原神| 99精品免费网| 欧美大胆a视频| 樱桃视频在线观看一区| 亚洲欧美卡通另类91av| 欧美精品一区二区三区很污很色的| 黄色精品免费| 久久久久久网| 在线播放亚洲| 久久久精品视频成人| 国产视频丨精品|在线观看| 亚洲人成网站色ww在线 | 久久国产精品一区二区三区四区| 欧美日韩在线另类| 亚洲精品久久久久久久久久久| 久久精品视频在线免费观看| 国产模特精品视频久久久久 | 久久精品女人的天堂av| 国产欧美精品在线观看| 欧美一二区视频| 国产午夜久久| 美女精品在线观看| 亚洲精品123区| 欧美日韩一区二区精品| 一区二区电影免费观看| 欧美视频在线一区二区三区| 亚洲乱码视频| 欧美日韩一二区| 999亚洲国产精| 国产精品永久免费视频| 久久久精品999| 亚洲精品一区二区三区福利| 欧美日本亚洲视频| 亚洲综合视频在线| 欧美日韩精品系列| 亚洲九九爱视频| 欧美在线999| 久久成人在线| 国产欧美一区二区三区另类精品 | 鲁大师成人一区二区三区| 久久久xxx| 国产精品久久久久久久久动漫 | 久久久久国产精品午夜一区| 亚洲精品小视频| 欧美精品一区二区三区在线播放| 亚洲国产精品电影| 国产农村妇女精品一区二区 | 影音先锋亚洲电影| 国产一区二区三区高清| 黄色日韩网站| 亚洲国产中文字幕在线观看| 一区免费观看视频| 亚洲精品欧美日韩| 亚洲在线视频免费观看| 久久久www成人免费精品| 国产一区二区三区四区五区美女| 欧美在线视频导航| 国产一区二区三区无遮挡| 欧美一区日本一区韩国一区| 韩国一区二区三区美女美女秀| 国产婷婷色一区二区三区四区| 一本色道久久88精品综合| 欧美一区二区三区四区高清| 国产精品一区二区在线观看| 女仆av观看一区| 欧美一区二区三区精品电影| 亚洲精品影院在线观看| 激情久久一区| 亚洲第一伊人| 国产自产女人91一区在线观看| 欧美性jizz18性欧美| 欧美精品日韩一区| 欧美人与性动交a欧美精品| 久久综合给合| 久久久久国产精品一区三寸| 99riav1国产精品视频| 亚洲精品资源美女情侣酒店| 日韩视频在线播放| 亚洲国产专区校园欧美| 一本久道久久综合婷婷鲸鱼|