fsockopen函数使用SMTP协议发邮件

文章目录 (?) [+]

            制作Z-Blog插件“异地登录通知”时需要用到邮件功能,考虑到PHPMailer太大并且很多功能都用不到就没有使用。Google了一下,找到个功能简单又足以插件需求的SMTP发件函数,单独测试了一下,嘿,还行,心里还挺美的。

            把函数移植到插件中,我[此处应有哔声——],调了半天愣是没运行成功 ,再看那函数也没看出个所以然来,为了一探究竟便把SMTP发信从SMTP协议到socket通信到PHP代码实现都了解了一遍,自己鼓捣出来一个最简单的SMTP发信函数...[笑哭]


    邮件原文


    <?php
    /**
     * PHP使用fsockopen函数SMTP实现发信
     *
     * @version     1.0
     * @date        2017/01/29 22:31
     * @author      森林生灵 <admin@lanseyujie.com>
     * @link        https://lanseyujie.com
     * @copyright   Copyright(c) 2014-2018, lanseyujie.com
     */
    
    function smtp_mailer($mailto, $subject = 'No Subject', $body = 'No Body') {
        $smtp_host = 'smtp.lanseyujie.com'; //SMTP服务器地址
        $smtp_port = 465; //SMTP服务器端口
        $smtp_openssl = 1; //是否使用SSL加密通信
        $smtp_debug = 1; //是否debug输出运行信息
        $smtp_username = 'service@lanseyujie.com'; //用户账号
        $smtp_password = '1234567890abcdefghij'; //用户密码
        $smtp_from = 'service@lanseyujie.com'; //发件邮箱
    
        $smtp = array(
            //1.EHLO 向服务器标识用户身份发送者 收到 220 或 250 时OK
            array("EHLO ". $smtp_host ."\r\n", "220,250", "EHLO: "),
            //2.AUTH LOGIN 请求登录认证 334 OK
            array("AUTH LOGIN\r\n", "334", "AUTH LOGIN: "),
            //3.发送经Base64加密的用户账号 334 OK
            array(base64_encode($smtp_username) ."\r\n", "334", "Send Base64 Encode username: "),
            //4.发送经Base64加密的用户密码 235 OK
            array(base64_encode($smtp_password) ."\r\n", "235", "Send Base64 Encode password: "),
            //5.Mail From 发送发件人邮箱 250 OK
            array("MAIL FROM: <". $smtp_from .">\r\n", "250", "MAIL FROM: "),
            //6.发送收件人邮箱 250 OK
            array("RCPT TO: <". $mailto .">\r\n", "250", "RCPT TO: "),
            //7.开始发送邮件数据 354 OK
            array("DATA\r\n", "354", "DATA Start: "),
            //8.0 发件人
            array("From: ". $smtp_from ."\r\n", "", ""),
            //8.1 收件人
            array("To: ". $mailto ."\r\n", "", ""),
            //8.2 发件代理客户端
            array("X-Mailer: LANSEYUJIE WebMailer 1.0\r\n", "", ""),
            //8.3 邮件重要级别 1(Highest) 3(Normal) 5(Lowest)
            array("X-Priority: 1 (Highest)\r\n", "", ""),
            //8.4 标题
            array("Subject: ". $subject ."\r\n", "", ""),
            //8.5 编码
            array("Content-Type: text/html; charset=\"utf-8\"\r\n", "", ""),
            //8.6 内容加密方式
            array("Content-Transfer-Encoding: base64\r\n\r\n", "", ""),
            //8.7 Base64 Encode Body
            array(base64_encode($body) ."\r\n", "", ""),
            //9.结束发送邮件数据 250
            array("\r\n.\r\n", "250", "DATA End: "),
            //10.结束会话
            array("QUIT\r\n", "221", "QUIT: ")
        );
    
        $info = '';
    
        //建立socket通信
        if (1 == $smtp_openssl) {
            //SSL加密通信
            $fp = @fsockopen('ssl://'. $smtp_host, $smtp_port);
        }
        else {
            //普通无加密通信
            $fp = @fsockopen($smtp_host, $smtp_port);
        }
        if (!$fp) {
            $info .= "FSOCKOPEN Error: Cannot conect to ". $smtp_host ."\r\n<br />";
        }
    
        //发送smtp数组中的命令/数据
        foreach ($smtp as $request) {
            //发送请求信息
            @fputs($fp, $request[0]);
            //接收响应信息
            if (1 == $smtp_debug && '' != $request[1]) {
            //接收信息
            $response = @fgets($fp, 128);
                $info .= $request[2] . $response ."\r\n<br />";
            }
        }
        //关闭连接 
        @fclose($fp);
        return $info;
    }
    
    
    echo smtp_mailer('test@lanseyujie.com', 'Mailer Test', '<i style="color: red;font-size: 16px;">This is a test mail to verify the Mailer run or not!</i>');



    参考链接:

    [1] http://blog.csdn.net/tpnndhqc/article/details/51240678

    [2] http://www.chilkatsoft.com/p/p_471.asp

    [3] http://blog.csdn.net/kerry0071/article/details/28604267

    本文标题:fsockopen函数使用SMTP协议发邮件
    本文链接:https://www.lanseyujie.com/post/php-fsockopen-smtp-email.html
    版权声明:本文使用「署名 4.0 国际」创作共享协议,转载或使用请遵守署名协议。
    点赞 0 分享 0