Heim  >  Artikel  >  Backend-Entwicklung  >  Senden Sie E-Mails über Socket

Senden Sie E-Mails über Socket

不言
不言Original
2018-04-26 14:40:522068Durchsuche

In diesem Artikel geht es um die Verwendung von Socket zum Senden von E-Mails.

Ich habe zuvor einen Artikel geschrieben ist die Verwendung von nette/mail. Die Komponente sendet E-Mails.

Der folgende Inhalt wurde aus „PHP Core Technology and Best Practices“ zusammengestellt.
PHP verfügt über eine integrierte mail()-Funktion. Wenn Sie jedoch das SMTP-Protokoll zum Senden von E-Mails verwenden möchten, müssen Sie einen SMTP-Server installieren. Wenn Sie es nicht installieren möchten, können Sie Socket zum Senden von E-Mails verwenden. Das SMTP-Protokoll baut auf dem TCP-Protokoll auf, sodass Socket im Prinzip für die Interaktion mit dem SMTP-Server gemäß den Spezifikationen des SMTP-Protokolls verwendet wird.

Der SMTP-Verbindungs- und Sendevorgang läuft wie folgt ab:
1) Stellen Sie eine TCP-Verbindung her.
2) Der Client sendet den HELO-Befehl, um den Absender selbst zu identifizieren, und der Client sendet den MAIL-Befehl. Der Server antwortet mit OK und zeigt damit an, dass er empfangsbereit ist.
3) Melden Sie sich mit dem AUTH-Befehl beim SMTP-Server an und geben Sie den Benutzernamen und das Passwort ein (Beachten Sie, dass sowohl der Benutzername als auch das Passwort Base64-verschlüsselt sein müssen).
4) Der Client sendet einen RCPT-Befehl, um den beabsichtigten Empfänger der E-Mail zu identifizieren. Es können mehrere RCPT-Zeilen vorhanden sein. Der Server antwortet mit „OK“ und zeigt damit an, dass er bereit ist, die E-Mail an den Empfänger zu senden.
5) Nachdem die Verhandlung abgeschlossen ist, verwenden Sie zum Senden den Befehl DATA.
6) Beenden Sie mit einem „.“-Zeichen, senden Sie den Eingabeinhalt zusammen, beenden Sie diesen Versand und beenden Sie den Vorgang mit dem QUIT-Befehl.
Verwenden Sie beispielsweise Telnet, um eine SMTP-Sitzung zu erstellen, wobei S für den Server und C für den Client steht. Der Code lautet wie folgt:

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

Ich wollte ursprünglich die qq-Mailbox zum Senden von E-Mails verwenden , aber die Seite ist alt, nachdem SMTP im qq-Postfach aktiviert wurde. Sie können E-Mails normal über das 163-Postfach senden.
Code:
smtp_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/>";
        }
    }

}

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

Verwandte Empfehlungen:

php implementiert das Senden der hexadezimalen Socket-Methode

PHP-Methode zum Implementieren von Socket

Detailliertes Beispiel für die PHP-Socket-Programmierung


Das obige ist der detaillierte Inhalt vonSenden Sie E-Mails über Socket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn