php基于socket實現(xiàn)SMTP發(fā)送郵件的方法
來源:易賢網 閱讀:936 次 日期:2015-03-09 15:55:23
溫馨提示:易賢網小編為您整理了“php基于socket實現(xiàn)SMTP發(fā)送郵件的方法”,方便廣大網友查閱!

這篇文章主要介紹了php基于socket實現(xiàn)SMTP發(fā)送郵件的方法,實例分析了php采用socket實現(xiàn)smtp發(fā)送郵件的原理與技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了php基于socket實現(xiàn)SMTP發(fā)送郵件的方法。分享給大家供大家參考。具體分析如下:

php采用socket通過SMTP發(fā)送郵件。

用的是php的php-sockets擴展,可以發(fā)送純文本和html格式的郵件。代碼如下:

代碼如下:

<?php

/**

* 郵件發(fā)送類

* 支持發(fā)送純文本郵件和HTML格式的郵件

* @example

* $config = array(

* "from" => "*****",

* "to" => "***",

* "subject" => "test",

* "body" => "<b>test</b>",

* "username" => "***",

* "password" => "****",

* "isHTML" => true

* );

*

* $mail = new MySendMail();

*

* $mail->setServer("smtp.126.com");

*

* $mail->setMailInfo($config);

* if(!$mail->sendMail()) {

* echo $mail->error();

* return 1;

* }

*/

class MySendMail {

/**

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

* @access private

*/

private $_userName;

/**

* @var 郵件傳輸代理密碼

* @access private

*/

private $_password;

/**

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

* @access protected

*/

protected $_sendServer;

/**

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

* @access protected

*/

protected $_port=25;

/**

* @var 發(fā)件人

* @access protected

*/

protected $_from;

/**

* @var 收件人

* @access protected

*/

protected $_to;

/**

* @var 主題

* @access protected

*/

protected $_subject;

/**

* @var 郵件正文

* @access protected

*/

protected $_body;

/**

* @var 是否是HTML格式的郵件

* @access protected

*/

protected $_isHTML=false;

/**

* @var socket資源

* @access protected

*/

protected $_socket;

/**

* @var 錯誤信息

* @access protected

*/

protected $_errorMessage;

public function __construct($from="", $to="", $subject="", $body="", $server="", $username="", $password="",$isHTML="", $port="") {

if(!empty($from)){

$this->_from = $from;

}

if(!empty($to)){

$this->_to = $to;

}

if(!empty($subject)){

$this->_subject = $subject;

}

if(!empty($body)){

$this->_body = $body;

}

if(!empty($isHTML)){

$this->_isHTML = $isHTML;

}

if(!empty($server)){

$this->_sendServer = $server;

}

if(!empty($port)){

$this->_port = $port;

}

if(!empty($username)){

$this->_userName = $username;

}

if(!empty($password)){

$this->_password = $password;

}

}

/**

* 設置郵件傳輸代理

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

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

* @param int $localPort 本地端口

* @return boolean

*/

public function setServer($server, $port=25) {

if(!isset($server) || empty($server) || !is_string($server)) {

$this->_errorMessage = "first one is an invalid parameter";

return false;

}

if(!is_numeric($port)){

$this->_errorMessage = "first two is an invalid parameter";

return false;

}

$this->_sendServer = $server;

$this->_port = $port;

return true;

}

/**

* 設置郵件

* @access public

* @param array $config 郵件配置信息

* 包含郵件發(fā)送人、接收人、主題、內容、郵件傳輸代理的驗證信息

* @return boolean

*/

public function setMailInfo($config) {

if(!is_array($config) || count($config) < 6){

$this->_errorMessage = "parameters are required";

return false;

}

$this->_from = $config['from'];

$this->_to = $config['to'];

$this->_subject = $config['subject'];

$this->_body = $config['body'];

$this->_userName = $config['username'];

$this->_password = $config['password'];

if(isset($config['isHTML'])){

$this->_isHTML = $config['isHTML'];

}

return true;

}

/**

* 發(fā)送郵件

* @access public

* @return boolean

*/

public function sendMail() {

$command = $this->getCommand();

$this->socket();

foreach ($command as $value) {

if($this->sendCommand($value[0], $value[1])) {

continue;

}

else{

return false;

}

}

$this->close(); //其實這里也沒必要關閉,smtp命令:QUIT發(fā)出之后,服務器就關閉了連接,本地的socket資源會自動釋放

echo 'Mail OK!';

return true;

}

/**

* 返回錯誤信息

* @return string

*/

public function error(){

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

$this->_errorMessage = "";

}

return $this->_errorMessage;

}

/**

* 返回mail命令

* @access protected

* @return array

*/

protected function getCommand() {

if($this->_isHTML) {

$mail = "MIME-Version:1.0\r\n";

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

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

$mail .= "TO:<" . $this->_to . ">\r\n";

$mail .= "Subject:" . $this->_subject ."\r\n\r\n";

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

}

else{

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

$mail .= "TO:<" . $this->_to . ">\r\n";

$mail .= "Subject:" . $this->_subject ."\r\n\r\n";

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

}

$command = array(

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

array("AUTH LOGIN\r\n", 334),

array(base64_encode($this->_userName) . "\r\n", 334),

array(base64_encode($this->_password) . "\r\n", 235),

array("MAIL FROM:<" . $this->_from . ">\r\n", 250),

array("RCPT TO:<" . $this->_to . ">\r\n", 250),

array("DATA\r\n", 354),

array($mail, 250),

array("QUIT\r\n", 221)

);

return $command;

}

/**

* @access protected

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

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

* @param boolean

*/

protected function sendCommand($command, $code) {

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

//發(fā)送命令給服務器

try{

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

//讀取服務器返回

$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 private

* @return boolean

*/

private function socket() {

if(!function_exists("socket_create")) {

$this->_errorMessage = "extension php-sockets must be enabled";

return false;

}

//創(chuàng)建socket資源

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

if(!$this->_socket) {

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

return false;

}

//連接服務器

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

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

return false;

}

socket_read($this->_socket, 1024);

return true;

}

/**

* 關閉socket

* @access private

* @return boolean

*/

private 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;

}

}

/**************************** Test ***********************************/

$config = array(

"from" => "XXXXX",

"to" => "XXXXX",

"subject" => "test",

"body" => "<b>test</b>",

"username" => "XXXXX",

"password" => "******",

//"isHTML" => true

);

$mail = new MySendMail();

$mail->setServer("smtp.126.com");

$mail->setMailInfo($config);

if(!$mail->sendMail()) {

echo $mail->error();

return 1;

}

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

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

更多信息請查看網絡編程

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網