资源马克-20161124- php smtp 带附件的邮件发送

4 篇文章 0 订阅

Problem & Solution

Mark 一个完美的带附件发送的 php smtp 邮件发送代码!

参考

php smtp 邮件发送

<?php

//define("SOL", "\n");
define("EOL", "\r\n");
define("SMTP_HOST", "smtp.163.com");//SMTP服务器
define("SMTP_PORT", "25");//SMTP服务器端口
define("SMTP_USER", "");//SMTP服务器的用户帐号
define("SMTP_PASS", "");//SMTP服务器的用户密码


$from = "";//SMTP服务器的用户邮箱
$to = "";//发送给谁 可用逗号隔开多个邮箱
$cc = "";
$bcc = "";

$subject="这是一个由PHP发送的带附件的邮件";//邮件主题 很多客户端会有乱码,所以转一下码
$body = "这个是一个带附件的邮件发送程序<hr>看到没,这里显示了HTM标签哦;<a href='http://www.google.com/'>请点开链接</a><input type='button' id='aaa' name=\"aaa\"> ".date('Y-m-d H:i:s');//邮件内容
$smtp = new smtp(SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASS, true);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
$smtp->addAttachment("mail.zip");
$smtp->sendmail($to, $from, $subject, $body, $cc, $bcc);


class smtp {

    /* Public Variables */
    public $attachments = array();
    /* Private Variables */
    private $smtp_host;
    private $smtp_port;
    private $time_out;
    private $host_name;
    private $auth;
    private $user;
    private $pass;
    private $sock;

    /* Constractor */
    public function smtp($smtp_host = null, $smtp_port = null, $user = null, $pass = null, $auth = true) {
        $this->smtp_host = (!empty($smtp_host)) ? $smtp_host : SMTP_HOST;
        $this->smtp_port = (!empty($smtp_port)) ? $smtp_port : SMTP_PORT;
        $this->user = (!empty($user)) ? $user : SMTP_PORT;
        $this->pass = (!empty($pass)) ? $pass : SMTP_PORT;
        $this->auth = $auth;
        $this->time_out = 15;
        #
        $this->host_name = "localhost";
        $this->sock = FALSE;
    }

    /* Main Function */
    public function sendmail($to, $from, $subject = "", $body = "", $cc = "", $bcc = "") {
        $bndp = md5(uniqid("")) . rand(1000, 9999);
        $bnd  = md5(uniqid("")) . rand(1000, 9999);
        list ($msec, $sec) = explode(" ", microtime());

        $mail_from = $this->strip_line_breaks($from);
        $mail_to = explode(",", $to);
        $body = preg_replace("/(^|(\r\n))(\\.)/", "", $body);
        if ($cc != "") $mail_to = array_merge($mail_to, explode(",", $cc));
        if ($bcc != "") $mail_to = array_merge($mail_to, explode(",", $bcc));

        $headers  = "MIME-Version:1.0" . EOL;
        $headers .= "To: " . $to . EOL;
        if ($cc != "") {
        $headers .= "Cc: " . $cc . EOL;
        }
        $headers .= "From: $from<" . $from . ">" . EOL;
        $headers .= "Subject: " . $subject . EOL;
        $headers .= "Date: " . date("r") . EOL;
        $headers .= "X-Mailer: Webmail ver 1.0 (PHP Version/" . phpversion() . ")" . EOL;
        $headers .= "Message-ID: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $from . ">" . EOL;
        if (count($this->attachments) > 0) {
            $headers .= "Content-Type: multipart/mixed;" . EOL . chr(9) . " boundary=\"" . $bndp . "\"" . EOL . EOL;
            $headers .= '--'.$bndp . EOL;
            $headers .= 'Content-Type : multipart/alternative; boundary="' . $bnd . '"' . EOL . EOL;
            $headers .= '--' . $bnd . EOL;
            $headers .= 'Content-Type: text/plain; charset=utf-8' . EOL;
            $headers .= "Content-Transfer-Encoding: 8bit" . EOL . EOL;
            $headers .= $body . EOL;
            $headers .= '--' . $bnd . EOL;
            $headers .= 'Content-type: text/html; charset=utf-8' . EOL;
            $headers .= "Content-Transfer-Encoding: 8bit" . EOL . EOL;
            $headers .= $body . EOL;
            $headers .= '--' . $bnd . '--' . EOL;

            foreach ($this->attachments as $att) {
                $headers .= "--" . $bndp . EOL . $att;
            }
            $headers .= '--' . $bndp . '--' . EOL;
            $this->clear_attachments();
        } else {
            $headers .= 'Content-Type : multipart/alternative;boundary="'.$bnd.'"' . EOL . EOL;
            $headers .= '--'.$bnd . EOL;
            $headers .= 'Content-Type: text/plain; charset=utf-8' . EOL;
            $headers .= "Content-Transfer-Encoding: 8bit" . EOL . EOL;
            $headers .= $body . EOL;
            $headers .= '--'.$bnd . EOL;
            $headers .= 'Content-type: text/html; charset=utf-8' . EOL;
            $headers .= "Content-Transfer-Encoding: 8bit" . EOL . EOL;
            $headers .= $body . EOL;
            $headers .= '--'.$bnd.'--' . EOL;
        }

        $sent = TRUE;
        foreach ($mail_to as $rcpt_to) {
            $rcpt_to = $this->strip_line_breaks($rcpt_to);
            if (!$this->smtp_sockopen($rcpt_to)) {
                $this->log_write("Error: Cannot send email to " . $rcpt_to);
                $sent = FALSE;
                continue;
            }
            if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $headers, $body)) {
                $this->log_write("E-mail has been sent to <" . $rcpt_to . ">");
            } else {
                $this->log_write("Error: Cannot send email to <" . $rcpt_to . ">");
                $sent = FALSE;
            }
            fclose($this->sock);
        }
        $this->log_write("{$mail_to} send over;");
        return $sent;
    }

    public function addAttachment($file, $dispo = "attachment") {
        $file_data = (file_exists($file)) ? file_get_contents($file) : "";
        if ($file_data != "") {
            $filename = basename($file);
            $ext = pathinfo($filename, PATHINFO_EXTENSION);
            $chunks = chunk_split(base64_encode($file_data));
            $parts  = "Content-Type: application/$ext; name=\"" . $filename . "\"" . EOL;
            $parts .= "Content-Transfer-Encoding: base64" . EOL;
            $parts .= "Content-Disposition: " . $dispo . "; filename=\"" . $filename . "\"" . EOL . EOL;
            $parts .= $chunks . EOL . EOL;
            $this->attachments[] = $parts;
        }
    }

    private function clear_attachments() {
        unset($this->attachments);
        $this->attachments = array();
    }

    /* Private Functions */
    private function smtp_send($helo, $from, $to, $header, $body = "") {
        if (!$this->smtp_putcmd("HELO", $helo)) {
            //$this->log_write("Error: Error occurred while sending HELO command.");
            return FALSE;
        }
        #auth
        if ($this->auth) {
            if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
                //$this->log_write("Error: Error occurred while sending HELO command.");
                return FALSE;
            }
            if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
                //$this->log_write("Error: Error occurred while sending HELO command.");
                return FALSE;
            }
        }
        if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) {
            //$this->log_write("Error: Error occurred while sending MAIL FROM command.");
            return FALSE;
        }
        if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) {
            //$this->log_write("Error: Error occurred while sending RCPT TO command.");
            return FALSE;
        }
        if (!$this->smtp_putcmd("DATA")) {
            //$this->log_write("Error: Error occurred while sending DATA command.");
            return FALSE;
        }
        if (!$this->smtp_message($header, $body)) {
            //$this->log_write("Error: Error occurred while sending message.");
            return FALSE;
        }
        if (!$this->smtp_eom()) {
            //$this->log_write("Error: Error occurred while sending <CR><LF>.<CR><LF> [EOM].");
            return FALSE;
        }
        if (!$this->smtp_putcmd("QUIT")) {
            //$this->log_write("Error: Error occurred while sending QUIT command.");
            return FALSE;
        }
        return TRUE;
    }
    private function smtp_sockopen($address) {
        if ($this->smtp_host == "") {
            return $this->smtp_sockopen_mx($address);
        } else {
            return $this->smtp_sockopen_relay();
        }
    }
    private function smtp_sockopen_relay() {
        $this->log_write("Trying to Connect " . $this->smtp_host . ":" . $this->smtp_port . "...");
        $this->sock = @fsockopen($this->smtp_host, $this->smtp_port, $errno, $errstr, $this->time_out);
        if (!($this->sock && $this->smtp_ok())) {
            $this->log_write("Error: connenct error" . $errstr . " (" . $errno . ")");
            return FALSE;
        }
        $this->log_write("Connected Ok");
        return TRUE;
    }
    private function smtp_sockopen_mx($address) {
        $domain = preg_replace("/^.+@([^@]+)$/", "\1", $address);
        if (!@getmxrr($domain, $MXHOSTS)) {
            $this->log_write("Error: Cannot resolve MX \"" . $domain . "\"");
            return FALSE;
        }
        foreach ($MXHOSTS as $host) {
            $this->log_write("Trying to " . $host . ":" . $this->smtp_port);
            $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
            if (!($this->sock && $this->smtp_ok())) {
                $this->log_write("Connect Error ," . $errstr . " (" . $errno . ")");
                continue;
            }
            $this->log_write("Connected to mx host " . $host);
            return TRUE;
        }
        $this->log_write("Error: Cannot connect to any mx hosts (" . implode(", ", $MXHOSTS) . ")");
        return FALSE;
    }
    private function smtp_message($header, $body) {
        fputs($this->sock, $header . "\r\n" . $body);
        return TRUE;
    }
    private function smtp_eom() {
        fputs($this->sock, "\r\n.\r\n");
        return $this->smtp_ok();
    }
    private function smtp_ok() {
        $response = str_replace("\r\n", "", fgets($this->sock, 512));
        if (!preg_match("/^[23]/", $response)) {
            fputs($this->sock, "QUIT\r\n");
            fgets($this->sock, 512);
            $this->log_write("Error: Remote host returned \"" . $response . "\"");
            return FALSE;
        }
        return TRUE;
    }
    private function smtp_putcmd($cmd, $arg = "") {
        if ($arg != "") $cmd = ($cmd == "") ? $arg : ($cmd . " " . $arg);
        fputs($this->sock, $cmd . "\r\n");
        return $this->smtp_ok();
    }
    private function strip_line_breaks($address) {
        $address = preg_replace("/([\t\r\n])+/", "", $address);
        $address = preg_replace("/^.*<(.+)>.*$/", "", $address);
        return $address;
    }
    public function log_write($message) {
        $message = date("M d H:i:s ") . get_current_user() . "[" . getmypid() . "]: " . $message;
        file_put_contents(dirname(__FILE__) . '/mail.log', $message . PHP_EOL, FILE_APPEND | LOCK_EX);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值