Envoyer un e-mail à l'aide de Socket

不言
Libérer: 2023-03-22 22:38:02
original
2073 Les gens l'ont consulté

Cet article concerne l'utilisation de Socket pour envoyer des e-mails. Maintenant, je le partage avec vous. Les amis intéressés peuvent y jeter un œil

J'ai écrit un article avant "Utiliser PHP pour envoyer des e-mails". consiste à utiliser le composant nette/mail pour envoyer un courrier électronique.

Le contenu suivant est compilé à partir de « Technologie de base PHP et meilleures pratiques ».
PHP a une fonction mail() intégrée, mais si vous souhaitez utiliser le protocole SMTP pour envoyer des e-mails, vous devez installer un serveur SMTP. Si vous ne souhaitez pas l'installer, vous pouvez utiliser Socket pour envoyer des e-mails. Le protocole SMTP est construit sur le protocole TCP, donc en principe, Socket est utilisé pour interagir avec le serveur SMTP selon les spécifications du protocole SMTP.

Le processus de connexion et d'envoi SMTP est le suivant :
1) Établir une connexion TCP.
2) Le client envoie la commande HELO pour identifier l'expéditeur lui-même, et le client envoie la commande MAIL. Le serveur répond par OK, indiquant qu'il est prêt à recevoir.
3) Utilisez la commande AUTH pour vous connecter au serveur SMTP et entrez le nom d'utilisateur et le mot de passe (Notez que le nom d'utilisateur et le mot de passe doivent être cryptés en base64).
4) Le client envoie une commande RCPT pour identifier le destinataire prévu de l'e-mail. Il peut y avoir plusieurs lignes RCPT. Le serveur répond OK, indiquant qu'il est prêt à envoyer l'e-mail au destinataire.
5) Une fois la négociation terminée, utilisez la commande DATA pour envoyer.
6) Terminez par un signe ".", envoyez le contenu d'entrée ensemble, terminez cet envoi et quittez avec la commande QUIT.
Par exemple, utilisez Telnet pour créer une session SMTP, où S représente le serveur et C représente le client. Le code est le suivant :

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
Copier après la connexion

Je voulais à l'origine utiliser la boîte aux lettres qq pour envoyer des e-mails. , mais la page est ancienne après l'activation de SMTP dans la boîte aux lettres qq. Une erreur s'est produite. Vous pouvez envoyer des e-mails normalement en utilisant la boîte aux lettres 163. La boîte aux lettres doit activer le service POP3/SMTP.
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/>";
        }
    }

}
Copier après la connexion

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);
Copier après la connexion

Recommandations associées :

php implémente l'envoi de la méthode de socket hexadécimale

Méthode php pour implémenter socket

Exemple détaillé de programmation de socket en php


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal