mail 函数使用方法:
\mail::to('tom@example.com')
        ->subject('test subject')
        ->body('<p>hi world</p>')
        ->embed(['img/ban.png', 'img/about.png'])
        ->attach('img/test.pdf')
        ->send();
如果没有 phpdotenv, 需要把相应的 env()改下。
推荐封装一个 css_inline 函数。
如果没有 Facade ,使用方法:
$mailer = new \Classes\Mail;
$mailer->to('tom@example.com')
        ->subject('test subject')
        ->body('<p>hi world</p>')
        ->embed(['img/ban.png', 'img/about.png'])
        ->attach('img/test.pdf')
        ->send();
源码
<?php
namespace Classes;
class Mail
{
    /**
     * Array to store email info
     * @var array
     */
    protected $info = [];
    /**
     * Initialize PHPMailer
     * Destory it after each email sent to avoid previous info left for next send
     * @return object PHPMailer
     */
    protected function mailer()
    {
        $mailer = new \PHPMailer;
        $mailer->isSMTP();                                      // Set mailer to use SMTP
        $mailer->Host     = env('mailer_host');                 // Specify main and backup SMTP servers
        $mailer->SMTPAuth = true;                               // Enable SMTP authentication
        $mailer->Username = env('mailer_user');                 // SMTP username
        $mailer->Password = env('mailer_password');             // SMTP password
        $mailer->Port     = env('mailer_port');
        $mailer->CharSet = 'UTF-8';
        $mailer->isHTML(true);
        return $mailer;
    }
    /**
     * Set email sender to $this->info['from']['email'] and $this->info['from']['name']
     * default is support@example.com
     * @param  string $email sender email
     * @param  string $name  sender name, optional
     * @return object        self object
     */
    public function from($email, $name = null)
    {
        $this->info['from']['email'] = $email;
        $this->info['from']['name'] = $name;
        return $this;
    }
    /**
     * Send email to addresses
     * @param  string|array $to send to email addresses
     * @return object     self object
     */
    public function to($to)
    {
        $this->info['to'] = $to;
        return $this;
    }
    /**
     * cc address. But actually sent separately, can be seen as set multiple to addresses
     * @param  string $cc email address
     * @return object     self object
     */
    public function cc($cc)
    {
        $this->info['cc'] = $cc;
        return $this;
    }
    /**
     * Set email reply to address
     * @param  string $email reply to email, stored as $this->info['replyTo']['email']
     * @param  string $name  reply to name, optional, $this->info['replyTo']['name']
     * @return object        self object
     */
    public function replyTo($email, $name = null)
    {
        $this->info['replyTo']['email'] = $email;
        $this->info['replyTo']['name'] = $name;
        return $this;
    }
    /**
     * Set email subject
     * @param  string $subject email subject, $this->info['subject']
     * @return object          self object
     */
    public function subject($subject)
    {
        $this->info['subject'] = $subject;
        return $this;
    }
    /**
     * Set email body
     * @param  string $body email body, $this->info['body']
     * @return object       self object
     */
    public function body($body)
    {
        $this->info['body'] = $body;
        return $this;
    }
    /**
     * Set email attachments
     * @param  string|array $file email attachments
     * @return object       self object
     */
    public function attach($file)
    {
        $this->info['attach'] = $file;
        return $this;
    }
    /**
     * Set embed images
     * embed 图片需要和 body 中的保持一致,会自动替换
     * @param  string|array $images images to embed
     * @return object         self object
     */
    public function embed($images)
    {
        $this->info['embed'] = $images;
        return $this;
    }
    /**
     * Send email
     * @return integer send email result, 1 for success
     */
    public function send()
    {
        // only send email when have to,subject and body
        if (@$this->info['to'] and @$this->info['subject'] and @$this->info['body']) {
            // get initialized mailer
            $mailer = $this->mailer();
            $this->localSend();
            if (@$this->info['from']['email']) { // use offered sender email&name
                $mailer->setFrom($this->info['from']['email'], @$this->info['from']['name']);
            } else { // use default sender email and name
                $mailer->setFrom('support@example.com', 'Send Name');
            }
            // set email to addresses
            $to = (array) $this->info['to'];
            foreach ($to as $one) {
                $mailer->addAddress($one);
            }
            // set email cc address
            $mailer->addCC(@$this->info['cc']);
            if (@$this->info['replyTo']['email']) { // use offered reply to address&name
                $mailer->addReplyTo(@$this->info['replyTo']['email'], @$this->info['replyTo']['name']);
            }
            // $body = css_inline($this->info['body']);
            $body = $this->info['body'];
 
            // set attachments
            if (@$this->info['attach']) {
                $attach = (array) $this->info['attach'];
                foreach ($attach as $oneAttach) {
                    $mailer->addAttachment($oneAttach);
                }
            }
            // set embed images
            if (@$this->info['embed']) {
                $embed = (array) $this->info['embed'];
                foreach ($embed as $oneImage) {
                    $mailer->AddEmbeddedImage($oneImage, $oneImage);
                    $cid[] = 'cid:' . $oneImage;
                }
                $body = str_replace($embed, $cid, $body);
            }
            $mailer->Subject = $this->info['subject'];
            $mailer->Body    = $body;
            // flush used info, or next send email would be polluted
            $this->info = [];
            // send email and return success mark: 1 for success
            return $mailer->send();
        }
    }
    /**
     * if in dev mode, send all addresses to mailer_recipient
     */
    public function localSend()
    {
        if (dev()) { //使用你自己相应的判断环境的函数
            $email = env('mailer_recipient');
            $this->info['to'] = array_fill(0, count((array) $this->info['to']), $email);
            $this->info['cc'] = @$this->info['cc'] ? $email : null;
        }
    }
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.