>  기사  >  백엔드 개발  >  Socket_php 팁을 기반으로 이메일을 보내기 위해 SMTP를 구현하는 PHP 방법

Socket_php 팁을 기반으로 이메일을 보내기 위해 SMTP를 구현하는 PHP 방법

WBOY
WBOY원래의
2016-05-16 20:21:591384검색

이 기사의 예에서는 PHP가 소켓을 기반으로 이메일을 보내기 위해 SMTP를 구현하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

php는 소켓을 사용하여 SMTP를 통해 이메일을 보냅니다.
php의 php-sockets 확장을 사용하면 일반 텍스트 및 html 형식으로 이메일을 보낼 수 있습니다. 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

/**
* 이메일 보내기 수업
* 일반 텍스트 이메일 및 HTML 형식 이메일 전송 지원
* @예제
* $config = 배열(
* "from" => "*****",
* "에" => "***",
* "주제" => "테스트",
* "본문" => "테스트>",
* "사용자 이름" => "***",
* "비밀번호" => "****",
* "isHTML" => 참
* );
*
* $mail = 새로운 MySendMail();
*
* $mail->setServer("smtp.126.com");
*
* $mail->setMailInfo($config);
* if(!$mail->sendMail()) {
* echo $mail->error();
* 1을 반환;
* }
*/
MySendMail 클래스 {
    /**
* @var 메일 전송 에이전트 사용자 이름
* @액세스 비공개
​*/
    개인 $_userName;
    /**
* @var 메일 전송 에이전트 비밀번호
* @액세스 비공개
​*/
    개인 $_password;
    /**
* @var 메일 전송 프록시 서버 주소
* @접속 보호됨
​*/
    보호된 $_sendServer;
    /**
* @var 메일 전송 프록시 서버 포트
* @접속 보호됨
​*/
    보호됨 $_port=25;
    /**
* @var 발신자
* @접속 보호됨
​*/
    $_from;
보호됨     /**
* @var 수신자
* @접속 보호됨
​*/
    보호된 $_to;
    /**
* @var 테마
* @접속 보호됨
​*/
    보호된 $_subject;
    /**
* @var 이메일 내용
* @접속 보호됨
​*/
    보호된 $_body;
    /**
* @var HTML 형식의 이메일인가요
* @접속 보호됨
​*/
    보호됨 $_isHTML=false;
    /**
* @var 소켓 리소스
* @접속 보호됨
​*/
    보호된 $_socket;
    /**
* @var 오류 메시지
* @접속 보호됨
​*/
    보호된 $_errorMessage;
    공개 함수 __construct($from="", $to="", $subject="", $body="", $server="", $username="", $password="",$isHTML=" ", $port="") {
        if(!empty($from)){
            $this->_from = $from;
        }
        if(!empty($to)){
            $this->_to = $to;
        }
        if(!empty($subject)){
            $this->_subject = $subject;
        }
        if(!empty($body)){
            $this->_body = $body;
        }
        if(!empty($isHTML)){
            $this->_isHTML = $isHTML;
        }
        if(!empty($server)){
            $this->_sendServer = $서버;
        }
        if(!empty($port)){
            $this->_port = $port;
        }
        if(!empty($username)){
            $this->_userName = $username;
        }
        if(!empty($password)){
            $this->_password = $password;
        }
    }
    /**
* 메일 전송 에이전트 설정
* @param string $server 프록시 서버의 IP 또는 도메인 이름
* @param int $port 프록시 서버의 포트, SMTP 기본 포트 25
* @param int $localPort 로컬 포트
* @return 부울
​*/
    공용 함수 setServer($server, $port=25) {
        if(!isset($server) || 비어 있음($server) || !is_string($server)) {
            $this->_errorMessage = "첫 번째 매개변수가 유효하지 않습니다.";
            false를 반환합니다.
        }
        if(!is_numeric($port)){
            $this->_errorMessage = "처음 두 개는 잘못된 매개변수입니다.";
            false를 반환합니다.
        }
        $this->_sendServer = $서버;
        $this->_port = $port;
        true를 반환합니다.
    }
    /**
* 이메일 설정
* @접속공개
* @param array $config 이메일 구성 정보
* 이메일 발신자, 수신자, 제목, 내용, 이메일 전송 담당자의 확인 정보가 포함되어 있습니다
* @return 부울
​*/
    공개 함수 setMailInfo($config) {
        if(!is_array($config) || count($config) < 6){
            $this->_errorMessage = "매개변수가 필요합니다";
            false를 반환합니다.
        }
        $this->_from = $config['from'];
        $this->_to = $config['to'];
        $this->_subject = $config['subject'];
        $this->_body = $config['body'];
        $this->_userName = $config['사용자 이름'];
        $this->_password = $config['password'];
        if(isset($config['isHTML'])){
            $this->_isHTML = $config['isHTML'];
        }
        true를 반환합니다.
    }
    /**
* 이메일 보내기
* @접속공개
* @return 부울
​*/
    공개 함수 sendMail() {
        $command = $this->getCommand();
        $this->소켓();
        foreach($command를 $value로) {
            if($this->sendCommand($value[0], $value[1])) {
                계속;
            }
            그렇지 않으면{
                false를 반환합니다.
            }
        }
        $this->close(); //其实这里也没必要关闭,smtp命令:QUIT发信后,服务器就关闭了连接,本地적소켓资源会自动释放
        echo '메일 OK!';
        true를 반환합니다.
    }
    /**
* 반환 오류 메시지
* @return 문자열
​*/
    공개 함수 오류(){
        if(!isset($this->_errorMessage)) {
            $this->_errorMessage = "";
        }
        $this->_errorMessage;
반환     }
    /**
* 메일 명령어로 돌아가기
* @접속 보호됨
* @return 배열
​*/
    보호된 함수 getCommand() {
        if($this->_isHTML) {
            $mail = "MIME 버전:1.0rn";
            $mail .= "콘텐츠 유형:텍스트/html;charset=utf-8rn";
            $mail .= "FROM:테스트<" . $this->_from . ">rn";
            $mail .= "받는 사람:<" . $this->_to . ">rn";
            $mail .= "제목:" . $this->_subject ."rnrn";
            $mail .= $this->_body . "rn.rn";
        }
        그렇지 않으면{
            $mail = "FROM:테스트<" . $this->_from . ">rn";
            $mail .= "받는 사람:<" . $this->_to . ">rn";
            $mail .= "제목:" . $this->_subject ."rnrn";
            $mail .= $this->_body . "rn.rn";
        }
        $명령 = 배열(
                array("HELO sendmailrn", 250),
                array("AUTH LOGINrn", 334),
                array(base64_encode($this->_userName) . "rn", 334),
                array(base64_encode($this->_password) . "rn", 235),
                array("MAIL FROM:<" . $this->_from . ">rn", 250),
                array("RCPT TO:<" . $this->_to . ">rn", 250),
                array("DATArn", 354),
                배열($mail, 250),
                array("QUITrn", 221)
        );
        $명령을 반환하세요;
    }
    /**
* @접속 보호됨
* @param string $command 서버로 보낸 SMTP 명령
* @param int $code 서버에서 응답이 반환될 것으로 예상하십니까
* @param 부울
​*/
    보호된 함수 sendCommand($command, $code) {
        echo '명령 보내기:' . $ 명령 . ',예상 코드:' . $코드 . '
';
        //发送命令给服务器
        시도해 보세요{
            if(socket_write($this->_socket, $command, strlen($command))){
                //读取服务器返回
                $data = 트림(socket_read($this->_socket, 1024));
                에코 '응답:' . $데이터 . '

';
                if($data) {
                    $pattern = "/^".$code."/";
                    if(preg_match($pattern, $data)) {
                        true를 반환합니다.
                    }
                    그렇지 않으면{
                        $this->_errorMessage = "오류:" . $데이터 . "|**| 명령:";
                        false를 반환합니다.
                    }
                }
                그렇지 않으면{
                    $this->_errorMessage = "오류:" . 소켓_strerror(socket_last_error());
                    false를 반환합니다.
                }
            }
            그렇지 않으면{
                $this->_errorMessage = "오류:" . 소켓_strerror(socket_last_error());
                false를 반환합니다.
            }
        }catch(예외 $e) {
            $this->_errorMessage = "오류:" . $e->getMessage();
        }
    }
    /**
* 서버에 네트워크 연결을 설정하세요
* @액세스 비공개
* @return 부울
​*/
    개인 함수 소켓() {
        if(!function_exists("socket_create")) {
            $this->_errorMessage = "php-socket 확장 기능을 활성화해야 합니다";
            false를 반환합니다.
        }
        //소켓소켓
        $this->_socket = 소켓_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
        if(!$this->_socket) {
            $this->_errorMessage = 소켓_strerror(socket_last_error());
            false를 반환합니다.
        }
        //连接服务器
        if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) {
            $this->_errorMessage = 소켓_strerror(socket_last_error());
            false를 반환합니다.
        }
        소켓_read($this->_socket, 1024);
        true를 반환합니다.
    }
    /**
    * 소켓
    * @액세스 비공개
    * @return 부울
    */
    개인 함수 close() {
        if(isset($this->_socket) && is_object($this->_socket)) {
            $this->_socket->close();
            true를 반환합니다.
        }
        $this->_errorMessage = "가까울 수 있는 리소스가 없습니다.";
        false를 반환합니다.
    }
}
/**************************** 시험 *********************** ************/
$config = 배열(
        "에서" => "XXXXX",
        "에" => "XXXXX",
        "주제" => "테스트",
        "본체" => "테스트",
        "사용자 이름" => "XXXXX",
        "비밀번호" => "********",
        //"isHTML" => 사실
    );
$mail = 새로운 MySendMail();
$mail->setServer("smtp.126.com");
$mail->setMailInfo($config);
if(!$mail->sendMail()) {
    echo $mail->error();
    1을 반환;
}

希望本文所述对大家程序设计有所帮助。

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