>  기사  >  백엔드 개발  >  소켓을 사용하여 이메일 보내기

소켓을 사용하여 이메일 보내기

不言
不言원래의
2018-04-26 14:40:522068검색

이 기사는 소켓을 사용하여 이메일을 보내는 방법에 관한 것입니다. 관심 있는 친구들은 한 번 살펴보세요.

이전에 "PHP를 사용하여 이메일 보내기"라는 기사를 작성했습니다. 이메일을 보내려면 nette/mail 구성 요소를 사용하십시오.

다음 내용은 "PHP 핵심 기술 및 모범 사례"를 편집한 것입니다.
PHP에는 mail() 기능이 내장되어 있지만 SMTP 프로토콜을 사용하여 이메일을 보내려면 SMTP 서버를 설치해야 합니다. 설치를 원하지 않으면 소켓을 사용하여 이메일을 보낼 수 있습니다. SMTP 프로토콜은 TCP 프로토콜을 기반으로 구축되므로 원칙적으로 SMTP 프로토콜 사양에 따라 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 서비스를 활성화해야 합니다. 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/>";
        }
    }

}

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.