分享一个邮件发送的 Job

<?php

namespace App\Jobs;

use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Mail\Message;

/**
 * 发邮件
 * Class SendEmail
 * @package App\Jobs
 */
class SendEmail extends BaseJob
{
    /**
     * @var string|array
     */
    private $address;
    /**
     * @var array
     */
    private $parameter;

    /**
     * Create a new job instance.
     *
     * $address 发送邮件地址,字符串或者数组
     *
     * $parameter 支持的参数有:
     * view 为发送模板,data 为view中的填充数据
     * content 为纯文本邮件
     * subject 发送标题
     * form 邮件发件地址  from_name 发件别名 (可为空)
     * attachment 附件地址 attachment_as 附件显示名称 attachment_mime 附件的文档格式 (可为空)
     *
     * @param string|array $address
     * @param array $parameter
     */
    public function __construct($address, array $parameter = [])
    {
        $this->address = $address;
        $this->parameter = $parameter;
    }

    /**
     * Execute the job.
     *
     * @param Mailer $mailer
     * @return void
     */
    public function handle(Mailer $mailer)
    {
        $parameter = $this->parameter;

        $content = $parameter['content'] ?? '';
        $data = $parameter['data'] ?? '';
        $view = $parameter['view'] ?? '';

        if ($view) {
            $mailer->send($view, $data, function (Message $message) {
                self::sendCallback($message);
            });
        } elseif ($content) {
            $mailer->raw($content, function (Message $message) {
                self::sendCallback($message);
            });
        }

    }

    private function sendCallback(Message $message)
    {
       $parameter = $this->parameter;
        $from = $parameter['from'] ?? '';
        $subject = $parameter['subject'] ?? '';
        $from_name = $parameter['from_name'] ?? '';
        $attachment = $parameter['attachment'] ?? '';
        $attachment_as = $parameter['attachment_as'] ?? '';
        $attachment_mime = $parameter['attachment_mime'] ?? '';

        $m = $message
            ->to($this->address)
            ->subject($subject);

        if ($from) {
            $m->from($from, $from_name ?: null);
        }

        if ($attachment) {
            $options = [];

            if ($attachment_as) {
                if (!str_contains($attachment_as, '?UTF-8?B?')) {
                    $attachment_as = "=?UTF-8?B?" . base64_encode($attachment_as) . "?=.";
                }
                $options['as'] = $attachment_as;
            }

            if ($attachment_mime) {
                $options['mime'] = $attachment_mime;
            }
            $m->attach($attachment, $options);
        }
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

这是什么原理?

 if (!str_contains($attachment_as, '?UTF-8?B?')) {
                    $attachment_as = "=?UTF-8?B?" . base64_encode($attachment_as) . "?=.";
                }
5年前 评论

@lovecn 附件的名字如果是中文,可能会乱码

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!