设为首页 收藏本站
查看: 1668|回复: 0

[经验分享] php 邮件类

[复制链接]

尚未签到

发表于 2015-8-24 11:14:31 | 显示全部楼层 |阅读模式
  编写一个用php socket 发送邮件的类,简单好用,当用到php程序发送邮件时,
  而在163服务器中,可以在RCPT命令中还可以验证163邮箱是否存在,还有很多用处,
  我现在暂时还没想到。
  记录下,有需要的朋友可以参考下
  <?php
class mail {
    /**
    * 这些即可发送email
    */
    public $host;
    public $port;
    public $user;
    public $password;
    public $mail_form;
    public $rcpt;
    public $body;
    /**
    * 附属在 header 中信息
    */
    public $to_name;
    public $from_name;
    public $subject;
    public $html;

    public $connection;
    public $msg = array();

    // 进行参数初始化
    public function __construct($conf, $rcpt, $header, $body, $html = true) {
        try {
            $this->host = $conf['host'];
            $this->port = $conf['port'];
            $this->user = $conf['user'];
            $this->password = $conf['password'];
            $this->rcpt = $rcpt;
            $this->to_name   = $header['to_name'];
            $this->from_name = $header['from_name'];
            $this->subject   = $header['subject'];
            $this->html      = $html;
            $this->body = base64_encode($body);
        } catch (Exception $e) {
            throw new Exception($e->getMessage());            
        }
    }

    public function connect() {
        $this->connection = @fsockopen($this->host, '25', $errno, $errstr, 10);
        if (!$this->connection) {            
            throw new Exception('connect failed!');
        }
        $greet = $this->callback_code();
        
    }
    public function helo() {
        if($this->is_connect() &&
            $this->send_data('HELO ' . $this->host) &&
            $this->callback_code() == 250
            ) {
             return true;
        } else {
            throw new Exception($this->get_callback_msg_lastest());
            
        }
    }
    public function send_data($cmd) {
        if (is_resource($this->connection)) {
            return @fwrite($this->connection, $cmd."\r\n", strlen($cmd) + 2);
        }
    }
    public function auth(){
        if ($this->is_connect() &&
            $this->send_data('AUTH LOGIN') && $this->callback_code() == 334 &&
            $this->send_data(base64_encode($this->user)) && $this->callback_code() == 334 &&
            $this->send_data(base64_encode($this->password)) && $this->callback_code() == 235 ) {   
            return true;
        } else {
            throw new Exception($this->get_callback_msg_lastest());            
        }
    }
   public function Mail() {
        
        if ($this->is_connect() &&
            $this->send_data("MAIL FROM:<$this->user>") &&
            $this->callback_code() == 250
            ) {
            return true;
        } else  {
           throw new Exception($this->get_callback_msg_lastest());            
        }
   }
    public function is_connect() {
        return is_resource($this->connection);
    }
    public function callback_code() {
        if ($this->is_connect()) {
            $msg = fgets($this->connection);
            if (!empty($msg)) {
                $code = substr($msg, 0, strpos($msg, ' '));
            } else {
                return '';
            }
            $this->msg[] = $msg;
            return $code;
        }
    }
    public function get_callback_msg_lastest() {
        return end($this->msg);
    }
    public function rcpt($rcpt) {
        if ($this->is_connect() &&
            $this->send_data("RCPT TO:<$rcpt>") &&
            $this->callback_code() == 250
            ) {
            return true;
        } else  {
            throw new Exception($this->get_callback_msg_lastest());            
        }
    }
    public function data() {
        if ($this->is_connect() &&
            $this->send_data('DATA') &&
            $this->callback_code() == 354) {
            return true;
        } else {
            throw new Exception($this->get_callback_msg_lastest());
        }
    }

    public function send_mail() {
        try {
            
            $this->connect();
            $this->helo();
            $this->auth();
            $this->Mail();
            if (is_array($this->rcpt)) {
                foreach ($this->rcpt as $rcpt) {
                    $this->rcpt($rcpt);
                }
            } else {
                $this->rcpt($this->rcpt);
            }
            $this->data();
            $header = str_replace("\r\n" . '.', "\r\n" . '..', trim(implode("\r\n", $this->get_header())));
            $body   = str_replace("\r\n" . '.', "\r\n" . '..', $this->body);
            $body   = substr($body, 0, 1) == '.' ? '.' . $body : $body;
            $this->send_data($header);
            $this->send_data('');
            $this->send_data($body);            
            $this->send_data('.');
            if ($this->callback_code()  != 250) {
                throw new Exception('send mail falied!');               
            }
            return true;
        } catch (Exception $e) {
            throw new Exception($e->getMessage());            
        }

    }

    //只能检测同一邮件服务器上email address
    public  function is_email_exist() {


    }

    public function get_header() {
        $header = array();
        $content_type = $this->html ? 'text/html;' : 'text/plain;' ;
        $headers [] = 'Date: ' . gmdate('D, j M Y H:i:s') . ' +0000';
        $to_mail = is_array($this->rcpt) ? implode(',', $this->rcpt) : $this->rcpt;
        $headers [] = 'To: "' . '=? utf8?B?' . base64_encode($this->to_name) . '?=' . '" <' . $to_mail . '>';
        $headers [] = 'From: "' . '=?utf8?B?' . base64_encode($this->from_name) . '?=' . '" <' . $this->user . '>';
        $headers [] = 'Subject: ' . '=?utf8?B?' . base64_encode($this->subject) . '?=';
        $headers [] = 'Content-Type:'.$content_type . ' charset=utf8; format=flowed';
        $headers [] = 'Content-Transfer-Encoding: base64';
        $headers [] = 'Content-Disposition: inline';
        return $headers;
    }

}

/**
* 用函数封装类
*/
function send_mail($conf, $rcpt, $header, $body) {
   
    $mail = new mail($conf, $rcpt, $header, $body);
    if ($mail->send_mail()) {
        echo 'send email successfully!';
    } else {
        echo 'falied!';
    }

}

$conf = array(
    'host'     => 'smtp.163.com',
    'port'     => '25',
    'user'     => 'z1298703836@163.com',
    'password' => 'zeiwei123',
     );
$rcpt = array(
    'z1298703836@sina.com',
    'wei.zen@baisonmail.com'
    );
$header = array(
    'to_name'   => 'willstang',
    'from_name' => 'sinawill',
    'subject'   => 'tst of reo ',
    );
$body = '<h1>sfsfsd</h1>';
$mail = new mail($conf, $rcpt, $header, $body);
$mail->send_mail();

echo '<pre>';
print_r($mail->msg);
  
  熟悉邮件发送的过程,它的stmp协议,
  还有一些发送的细节,如:发送的内容分为两部分, 一部分在头部,另一部分是email的正文,
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103424-1-1.html 上篇帖子: PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同! 下篇帖子: 用php实现远程网络文件下载到服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表