使用Socket發送郵件

來源:互聯網
上載者:User

本篇文章是介紹關於使用Socket發送郵件,現在分享給大家,有興趣的朋友可以看一下

之前寫過一篇《使用PHP發送郵件》,方法是利用nette/mail組件發送郵件。

以下內容整理自《PHP核心技術與最佳實務》。
PHP有一個內建的mail()函數,但是要想使用SMTP協議發送郵件,需要安裝SMTP伺服器。如果不想安裝,可以使用Socket發送郵件。SMTP協議建立在TCP協議之上,所以原則上按照SMTP協議的規範,使用Socket跟SMTP伺服器進行互動。

SMTP串連與發送過程如下:
1)建立TCP串連。
2)用戶端發送HELO命令以標識寄件者自己的身份,用戶端發送MAIL命令。伺服器以OK作為響應,表明準備接收。
3)使用AUTH命令登陸SMTP伺服器,輸入使用者名稱和密碼(注意,使用者名稱和密碼都需要base64加密)。
4)用戶端發送RCPT命令,標識該電子郵件的計劃接收人,可以有多個RCPT行。伺服器以OK作為響應,表示願意為收件者發送郵件。
5)協商結束後,使用DATA命令發送。
6)以”.”號表示結束,輸入內容一起發送出去,結束此次發送,用QUIT命令退出。
例如,使用Telnet建立一個SMTP會話,其中S代表格服務器,C代表用戶端,代碼如下:

C: open smtp.qq.com 25S: 220 esmtp4.qq.com Esmtp QQ Mail ServerC: HELO smtp qq.comS: 250 esmtp4.qq.comC: AUTH loginS: 334 VXNlcm5hbWU6C: 這裡輸入使用base64加密過的使用者名稱S: 334 UGFzc3dvcmQ6C: 這裡輸入使用base64加密過的密碼S:235 Authentication successfulC: MAIL FROM:<liexusong@qq.com>S: 250 sender <liexusong@qq.com> OKC: RCPT TO:<liexusong@163.com>S: 250 recipient <liexusong@163.com> OKC: DATAS: 354 Enter mail,end with "." on a line by itselfC: This is example from smtp protocolC:.S: 250 message sentC: QUITS: 221 goodbye

本來想用qq郵箱發郵件,但是qq郵箱開啟SMTP後頁面老是出錯,使用163郵箱可以正常發送郵件,郵箱需開啟POP3/SMTP服務。
代碼:
smtp_mail.php

<?phpclass smtp_mail{    private $host;    private $port=25;    private $user;    private $pwd;    private $debug=false;   //是否開啟偵錯模式 預設不開啟    private $sock;          //儲存與SMTP伺服器串連的控制代碼    private $mail_format=0; //郵件格式 0為普通文本 1為HTML郵件    public function smtp_mail($host,$port,$user,$pwd,$mail_format=0,$debug=false){        $this->host=$host;        $this->port=$port;        $this->user=$user;        $this->pwd=$pwd;        $this->mail_format=$mail_format;        $this->debug=$debug;        //串連SMTP伺服器        /**         * fsockopen() 初始化一個通訊端串連到指定主         * 最後一個參數為timeout,串連時限         */        $this->sock=fsockopen($this->host,$this->port,$errno,$errstr,10);        if (!$this->sock){//串連失敗            exit("Error number: $errno, Error message: $errstr\n");        }        //取得伺服器資訊        $response=fgets($this->sock);        //若包含220,表示已經成功串連到伺服器        if (strstr($response,"220")===false){//首次出現地址|false            exit("Server error: $response\n");        }    }    //將命令發送到伺服器,然後取得伺服器反饋資訊,判斷命令是否執行成功    private function do_command($cmd,$return_code){        fwrite($this->sock,$cmd);        $response=fgets($this->sock);        if (strstr($response,"$return_code")===false){            $this->show_debug($response);            return false;        }        return true;    }    //發送郵件    public function send_mail($from,$to,$subject,$content){        //判斷收發件郵箱地址是否合法        if (!$this->is_email($from) or !$this->is_email($to)){            $this->show_debug('Please enter valid from/to email.');            return false;        }        //判斷主題內容是否為空白        if (empty($subject) or empty($content)){            $this->show_debug('Please enter subject/content.');            return false;        }        //整合郵件資訊,發送郵件主體時要以\r\n.\r\n作為結尾        $detail="From:".$from."\r\n";        $detail.="To:".$to."\r\n";        $detail.="Subject:".$subject."\r\n";        if ($this->mail_format==1){            $detail.="Content-Type: text/html;\r\n";        }else{            $detail.="Content-Type: text/plain;\r\n";        }        $detail.="charset=utf-8\r\n\r\n";        $detail.=$content;        //此處應該有判斷命令是否執行成功        $this->do_command("HELO smtp.qq.com\r\n",250);        $this->do_command("AUTH LOGIN\r\n",334);        $this->do_command("$this->user\r\n",334);        $this->do_command("$this->pwd\r\n",235);        $this->do_command("MAIL FROM:<".$from.">\r\n",250);        $this->do_command("RCPT TO:<".$to.">\r\n",250);        $this->do_command("DATA\r\n",354);        $this->do_command($detail."\r\n.\r\n",250);        $this->do_command("QUIT\r\n",221);        return true;    }    //判斷是否為合法郵箱    private function is_email($emial){        if(filter_var($emial,FILTER_VALIDATE_EMAIL)){            return true;        }else{            return false;        }    }    //顯示調試資訊    private function show_debug($message){        if ($this->debug){            echo "<p>Debug: $message</p><br/>";        }    }}

index.php

<?phpinclude_once "smtp_mail.php";$host="smtp.163.com";$port=25;$user="你的賬戶名@163.com";$pwd="授權碼";$from="你的賬戶名@163.com";$to="目標郵箱";$subject="Test Smtp Mail";$content="This is example email for you.";$mail=new smtp_mail($host,$port,base64_encode($user),base64_encode($pwd),1,true);$mail->send_mail($from,$to,$subject,$content);

相關推薦:

php實現發送16進位socket的方法

php實現socket的方法

執行個體詳解php的socket編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.