ホームページ  >  記事  >  バックエンド開発  >  ソケットを使用して電子メールを送信する

ソケットを使用して電子メールを送信する

不言
不言オリジナル
2018-04-26 14:40:522068ブラウズ

今回は Socket を使ってメールを送信する方法について紹介します。興味のある方はぜひご覧ください。

その方法は次のとおりです。 nette/mail コンポーネントを使用して電子メールを送信します。

以下の内容は、「PHP コアテクノロジーとベストプラクティス」から編集されたものです。
PHP には mail() 関数が組み込まれていますが、SMTP プロトコルを使用して電子メールを送信したい場合は、SMTP サーバーをインストールする必要があります。インストールしたくない場合は、Socket を使用して電子メールを送信できます。 SMTP プロトコルは TCP プロトコルに基づいて構築されているため、原則として SMTP プロトコルの仕様に従って SMTP サーバーとの通信には Socket が使用されます。

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 サービスが有効になる必要があります。 M コード: tsmtp_mail.php

<?php

class 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(&#39;Please enter valid from/to email.&#39;);            return false;
        }        //判断主题内容是否为空
        if (empty($subject) or empty($content)){            $this->show_debug(&#39;Please enter subject/content.&#39;);            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/>";
        }
    }

}
ee
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

PHP のソケットプログラミングのソケットメソッドを実装するための Php

以上がソケットを使用して電子メールを送信するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。