基于PHP自带的mail函数实现发送邮件以及带有附件的邮件功能

Posted selfim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于PHP自带的mail函数实现发送邮件以及带有附件的邮件功能相关的知识,希望对你有一定的参考价值。

phpmail函数简介

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

其中: $to 必需。规定邮件的接收者
$subject 必需。规定邮件的主题。该参数不能包含任何换行字符。
$message 必需。规定要发送的消息。
$additional_headers 规定额外的报头,比如 From, Cc 以及 Bcc等
$additional_parameters 规定 sendmail 程序的额外参数

参考代码(Linux服务器下测试有效)

<?php

class SendMailApi
{
    /**
     * @param  $to 收件人
     * @param  $subject 邮件主题
     * @param  $message 发送的消息
     * @param  $from 发件人
     * @param  $content_type 类型
     * @param  $attache 附件
     */
    public function sendMail($to, $subject, $message, $from, $content_type, $attache = array())
    {
        if (!empty($from)) $head = "From:   $from\\n";
        if (empty($content_type)) $content_type = "text/plain";

        if (is_array($attache)) {
            $boundary = "===" . md5(uniqid("")) . "===";
            $head .= "Mime-Version:   1.0\\nContent-Type:   multipart/mixed;   boundary=\\"";
            $head .= "$boundary\\"\\n\\nThis   is   a   multi-part   message   in   MIME   format.\\n\\n";
            $head .= "--$boundary\\n";
            $head .= "Content-Type:   $content_type\\n";
            $head .= "\\n$message\\n\\n";

            while (list($key, $val) = each($attache)) {
                $fd = fopen("$val", "r") or die("unable to open file$val");
                $contents = chunk_split(base64_encode(fread($fd, filesize("$val"))));
                fclose($fd);
                $head .= "--$boundary\\n";
                $head .= "Content-Type:   application/octet-stream;   name=\\"" . basename($val);
                $head .= "\\"\\nContent-Transfer-Encoding:   BASE64\\n";
                $head .= "Content-Disposition:   attachment;   filename=\\"" . basename($val);
                $head .= "\\"\\n\\n" . $contents . "\\n\\n";
            }
            $head .= "--" . $boundary . "--\\n\\n";
        } else {
            if (!empty($content_type)) {
                $head .= "Content-Type:  $content_type\\n";
                $head .= "\\n$message\\n";
            }
        }
        return mail($to, $subject, "", $head);
    }
    public function sendMailTest()
    {

        $to = "xxxxx@xxxx.com";         // 邮件接收者
        $subject = "test";                // 邮件标题
        $from = "xxx@xxxxx.com";   // 邮件发送者
        $subject = "=?UTF-8?B?" . base64_encode($subject) . "?=";
        $order_bn = date(\'Ymd\').substr(implode(NULL, array_map(\'ord\', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
        $memer_id = self::mt_rand(1000000,9999999);
        $ship_mobile = \'139xxxxxxxx\';
        //产生随机数据
        $res = array(
            0 =>
                array(
                    \'order_bn\' => $order_bn,
                    \'member_id\' => $memer_id ,
                    \'ship_mobile\' => $ship_mobile,
                ),
            1 =>
                array(
                    \'order_bn\' => $order_bn,
                    \'member_id\' => $memer_id,
                    \'ship_mobile\' => $ship_mobile,
                ),
            2 =>
                array(
                    \'order_bn\' => $order_bn,
                    \'member_id\' => $memer_id,
                    \'ship_mobile\' => $ship_mobile,
                ),
            3 =>
                array(
                    \'order_bn\' => $order_bn,
                    \'member_id\' => $memer_id,
                    \'ship_mobile\' => $ship_mobile,
                ),
            4 =>
                array(
                    \'order_bn\' => $order_bn,
                    \'member_id\' => $memer_id,
                    \'ship_mobile\' => $ship_mobile,
                ),
            5 =>
                array(
                    \'order_bn\' => $order_bn,
                    \'member_id\' => $memer_id,
                    \'ship_mobile\' => $ship_mobile,
                ),
            6 =>
                array(
                        \'order_bn\' => $order_bn,
                        \'member_id\' => $memer_id,
                        \'ship_mobile\' => $ship_mobile,
                    ));
        $csv_header = array(\'订单号\', \'会员id\', \'手机号\');
        $file_name = date("Y-m-d") . ".csv";
        $fp = fopen("$file_name", \'a\');
        // 处理头部标题
        $header = implode(\',\', $csv_header) . PHP_EOL;
        // 处理内容
        $content = \'\';
        foreach ($res as $k => $v) {
            $content .= implode(\',\', $v) . PHP_EOL;
        }
        // 拼接
        $csv = $header . $content;
        // 写入并关闭资源
        fwrite($fp, $csv);
        fclose($fp);
        //添加附件
        $attache = array($file_name);
        $message = " This is a test";  // 邮件正文
        $headers = "From: $from" . "\\n";// 头部信息设置
        $headers .= "MIME-Version: 1.0" . "\\n";
        $headers .= "Content-type: text/html; charset=uft-8" . "\\r\\n";
        $headers .= "Content-Transfer-Encoding: 8bit";
        if(filter_var($to, FILTER_VALIDATE_EMAIL)&&filter_var($from, FILTER_VALIDATE_EMAIL)){
            $rst = $this->sendMail($to, $subject, $message, $from, \'\', $attache);
         }
        @unlink($file_name);
        var_dump($rst);
    }
}
//测试
$mailObj = new SendMailApi();
$rst = $mailObj->sendMailTest();

测试效果

以上是关于基于PHP自带的mail函数实现发送邮件以及带有附件的邮件功能的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有附件的 PEAR Mail 包使用 PHP 发送电子邮件

带有 xampp 和 hMailServer 的 PHP mail() [重复]

linux下使用自带mail发送邮件

linux下使用自带mail发送邮件

通过电子邮件发送带有 PHP 和 HTML 错误消息“Cannot POST mail.php”的表单

laravel框架总结(十五) -- 发送邮件