《PHP實戰:php基于socket實現SMTP發送郵件的方法》要點:
本文介紹了PHP實戰:php基于socket實現SMTP發送郵件的方法,希望對您有用。如果有疑問,可以聯系我們。
本文實例講述了php基于socket實現SMTP發送郵件的方法.分享給大家供大家參考.具體分析如下:PHP實例
php采用socket通過SMTP發送郵件.
用的是php的php-sockets擴展,可以發送純文本和html格式的郵件.代碼如下:
PHP實例
代碼如下:
<?php
/**
* 郵件發送類
* 支持發送純文本郵件和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 發件人
??? * @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 郵件配置信息
??? * 包含郵件發送人、接收人、主題、內容、郵件傳輸代理的驗證信息
??? * @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;
??? }
??? /**
??? * 發送郵件
??? * @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發出之后,服務器就關閉了連接,本地的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 發送到服務器的smtp命令
??? * @param int $code 期望服務器返回的響應嗎
??? * @param boolean
??? */
??? protected function sendCommand($command, $code) {
??????? echo 'Send command:' . $command . ',expected code:' . $code . '<br />';
??????? //發送命令給服務器
??????? 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;
??????? }
??????? //創建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程序設計有所幫助.PHP實例
歡迎參與《PHP實戰:php基于socket實現SMTP發送郵件的方法》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/11878.html