# think-mail **Repository Path**: yzh52521/think-mail ## Basic Information - **Project Name**: think-mail - **Description**: 一个优美的php邮件类tp-mailer,支持邮件模板、纯文本、附件邮件发送以及更多邮件功能, 邮件发送简单到只需一行代码,原生支持ThinkPHP所有框架,也非常方便其他框架扩展[已支持至6.0] - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: 3.0 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 3 - **Created**: 2020-07-02 - **Last Updated**: 2025-06-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Think Mail **一款支持所有PHP框架的优美的邮件发送类**,ThinkPHP框架【6.0.x】开箱即用,其他框架初始化配置即可使用 基于 symfony mailer 二次开发, 为 ThinkPHP系列框架量身定制, 使 ThinkPHP 支持邮件模板、纯文本、附件邮件发送以及更多邮件功能, 邮件发送简单到只需一行代码 同时了方便其他框架或者非框架使用, think-mail也非常容易拓展融合到其他框架中, 欢迎大家 `Fork` 和 `Star`, 提交代码让think-mail支持更多框架 ## 优雅的发送邮件 **ThinkPHP6.0.x 示例** ``` use mailer\think\Mailer; $mailer = Mailer::instance(); $mailer->from('10086@qq.com@qq.com') ->to('your-mail@domain.com') ->subject('纯文本测试') ->text('欢迎您使用think-mail') ->send(); ## 安装 ``` composer require yzh52521/think-mail ## 配置 在配置文件里配置如下信息, 可以配置在 `mail.php` 或 `config.php` 文件中, 但要保证能通过 `mail.drive`, `mail.host` 访问到配置信息, 内容如下: ``` return [ 'scheme' => 'smtp', 'host' => '', // 服务器地址 'username' => '', 'password' => '', // 密码 'port' => 465, // SMTP服务器端口号,一般为25 'options' => [], 'dsn' => '', 'debug' => false, // 开启debug模式会直接抛出异常, 记录邮件发送日志 'left_delimiter' => '{', // 模板变量替换左定界符, 可选, 默认为 { 'right_delimiter' => '}', // 模板变量替换右定界符, 可选, 默认为 } 'log_drive' => '', // 日志驱动类, 可选, 如果启用必须实现静态 public static function write($content, $level = 'debug') 方法 'log_path' => '', // 日志路径, 可选, 不配置日志驱动时启用默认日志驱动, 默认路径是 /path/to/tp-mailer/log, 要保证该目录有可写权限, 最好配置自己的日志路径 'embed' => 'embed:', // 邮件中嵌入图片元数据标记 ]; public static function write($content, $level = 'debug') { echo '日志内容:' . $content; echo '日志级别:' . $level; } ``` #### log_path 日志驱动为默认是日志存储路径,不配置默认为 `think-mail/log/`,例如可配置为 `ROOT_PATH . 'runtime/log/'` #### embed 图片内联嵌入标识,请参考 [将图片作为元数据嵌入到邮件中](#将图片作为元数据嵌入到邮件中) ## 使用 > 使用use时, ThinkPHP6 的Mailer类的命名空间是 `mailer/think/Mailer` ### 使用think-mailer ``` use mailer\think\Mailer ``` ### 创建实例 不传递任何参数表示邮件驱动使用配置文件里默认的配置 ``` $mailer = Mailer::instance(); ``` ### 设置收件人 以下几种方式任选一种 ``` $mailer->to(['10086@qq.com']); $mailer->to(['10086@qq.com']); $mailer->to('10086@qq.com'); $mailer->to(['tianpian0805@qq.com', '10086@qq.com']); $mailer->to(['tianpian0805@qq.com', '10086@qq.com', 'tianpian0805@163.com']); ``` ### 设置发件人 发件人邮箱地址必须和配置项里一致, 默认会自动设置发件地址 (配置里的addr) 和发件人 (配置里的name) ``` $mailer->from('10086@qq.com'); $mailer->from(['10086@qq.com']); ``` ### 设置邮件主题 ``` $mailer->subject('邮件主题'); ``` ### 设置邮件内容 - HTML ``` $mailer->html('

欢迎使用think-mailer

'); ``` 或者使用变量替换HTML内容 ``` $mailer->html('

欢迎使用{name}

', ['name' => 'think-mailer']); ``` ### 设置邮件内容 - 纯文本 ``` $mailer->text('欢迎使用think-mailer'); ``` 或者使用变量替换纯文本内容 ``` $mailer->text('欢迎使用{name}', ['name' => 'think-mailer']); ``` ### 设置邮件内容 - 模板 ThinkPHP系列模板, 具体请看ThinkPHP各版本框架的模板怎么用, 第二个参数是要进行模板赋值的数组 ``` $mailer->view('mail/register'); $mailer->view('admin@mail/register', ['account' => $account, 'name' => $name]); ``` ### 将图片作为元数据嵌入到邮件中 邮件内容中包含图片的, 可以直接指定 `img` 标签的 `src` 属性为远程图片地址, 此处图片地址必须为远程图片地址, 必须为一个带域名的完整图片链接, 这似乎很麻烦, 所以你还可以将图片作为元数据嵌入到邮件中, 至于其他文件是否也可以嵌入请自己尝试 下面介绍一下 `think-mail` 如何快速简便的将图片元数据嵌入到邮件中: #### 配置嵌入标签 嵌入元数据需要在模板赋值或者使用 `html()` 传递变量时, 给变量添加特殊的标签, 该嵌入标签默认为 `cid:`, 你可以修改配置文件中 `embed` 项, 修改为你想要的形式 #### 模板或HTML中设置变量 在模板中, 例如 ThinkPHP 全系列都是使用 `{$var}` 的形式传递变量, 假设变量为 `image_src`, 那么模板中填写 `{$image_src}`, 如果是在HTML中, 请使用 `{image_src}`, 注意如果修改过左、右定界符请使用自己定义的左右定界符 #### 传递变量参数和值 在 `html()` 和 `view()` 方法的第二个参数里, 该数组必须有一个变量, 格式为 `['cid:image_src'] => '/path/to/image.jpg']` 或者 `['cid:image_src'] => ['file_stream', 'filename','filemime']]`, 即参数数组的键名是上面配置的 `嵌入标签 + 变量名`, 但值有两种情况: 第一, 如果值为字符串, 则该值为图片的路径 (绝对路径或相对路径) 或者 有效的url地址; 第二, 如果值为数组, 数组为 `['stream','name','mime',]` 的形式, 其中 `stream` 表示图片的数据流, 即是未保存的文件数据流, 例如 `fopen()` 方法获取的文件数据流, 第二个参数为文件名, 默认为 `image`,第三个参数可选, 为文件的mime类型, 默认为 null #### 示例 ``` Mailer::instance() ->form('10086@qq.com') ->to('10086@qq.com') ->subject('测试邮件模板中嵌入图片元数据') ->view('index@mail/index', [ 'date' => date('Y-m-d H:i:s'), 'cid:image' => ROOT_PATH . 'image.jpg', // 'cid:image' => 'https://image34.360doc.com/DownloadImg/2011/08/2222/16275597_64.jpg', // 'cid:image' => [fopen('/path/image1.jpg','r')], // 'cid:image' => [fopen('/path/image1.jpg','r'), 'image','image/jpg'], ]) ->send(); ``` 其中模板的内容如下: ``` 测试邮件

尊敬的yzh52521:

这是一封模板测试邮件

{$date}

``` 在 HTML 中使用一样: ``` Mailer::instance() ->form('10086@qq.com') ->to('10086@qq.com') ->subject('测试邮件模板中嵌入图片元数据') ->html('图片测试', [ 'cid:image' => '/path/to/image.jpg', // 'cid:image' => 'https://image34.360doc.com/DownloadImg/2011/08/2222/16275597_64.jpg', // 'cid:image' => [fopen('/path/to/image1.jpg','r')], // 'cid:image' => [fopen('/path/to/image1.jpg','r'), 'image','image/jpg'], ]) ->send(); ``` ### 添加附件 ``` $mailer->attach('/path/to/file.jpg'); or $mailer->attachContent(fopen('/path/to/file.jpg','r')); ``` 或者指定附件的文件名 ``` $mailer->attach('path/to/foo.jpg', ['fileName'=>文件名.jpg','contentType'=>'image/jpeg']); or $mailer->attachContent(fopen('/path/to/file.jpg','r'),['fileName'=>文件名.jpg','contentType'=>'image/jpeg']); ``` ### 设置字符编码 ``` $mailer->charset('utf8'); ``` ### 设置邮件优先级 ``` $mailer->priority(1); // 可选值有: // 1 Highest // 2 High // 3 Normal // 4 Low // 5 Lowest ``` ### 发送邮件 ``` $mailer->send(); ``` ``` $mailer->form('10086@qq.com') ->to('10086@qq.com') ->subject('邮件主题') ->text('邮件内容') ->send(); ``` 如果执行过邮件发送过邮件发送之后, 需要重新初始化 ``` // 第一次发送 $mailer->form('10086@qq.com') ->to('10086@qq.com') ->subject('邮件主题') ->text('邮件内容') ->send(); // 接着进行第二次发送 $mailer->init(); // 或者直接连贯调用 $mailer->init()->to()->...->send(); ``` 开启 `debug` 模式后, 邮件发送失败会直接以异常抛出, 如果没有开启, 可以通过 `getError()` 获取错误信息 ``` $mailer->getError(); ``` 使用 `getHeaders()` 和 `getHeadersString()` 方法可以获取头信息 `getHeaders()` 返回的是头信息数组, `getHeadersString()` 返回的是头信息字符串 ## 动态配置 `mailer/Config` 可以进行邮件动态配置,可以读取配置或者重新设置默认配置项,也可以用于其他非 ThinkPHP 框架进行配置项初始化 ``` class Config { /** * 初始化配置项 * * @param array $config 请参考配置项里的配置格式,其他非ThinkPHP框架不支持自动探测自动初始化配置项,务必使用该方法初始化配置项 */ public static function init($config = []) { } /** * 获取配置参数 为空则获取所有配置 * * @param string $name 配置参数名 * @param mixed $default 默认值 * * @return mixed */ public static function get($name = null, $default = null) { } /** * 设置配置参数 * * @param string|array $name 配置参数名 * @param mixed $value 配置值 */ public static function set($name, $value) { } } ``` ### 第一步: 初始化配置项 使用 `mailer\lib\Config` 的 `init()` 方法初始化配置项,例如: ``` use mailer\lib\Config // 配置格式参见前面的配置 $config = [ 'scheme' => 'smtp', 'host' => 'smtp.qq.com', ... ]; Config::init($config); ``` ### 第二步: 实现 `$mailer->view()` 方法 写自己的类继承 `mailer\Mailer` 然后实现里面的 `view` 方法, 根据自己的框架渲染出自己的模板,如果不需要使用 `view()` 方法可以忽略这一步,直接进入下一步: ``` /** * 载入一个模板作为邮件内容 * * @param string $template * @param array $param * @param array $config * * @return Mailer */ public function view($template, $param = [], $config = []) { $view = View::instance(ThinkConfig::get('template'), ThinkConfig::get('view_replace_str')); // 处理变量中包含有对元数据嵌入的变量 foreach ($param as $k => $v) { $this->embedImage($k, $v, $param); } $content = $view->fetch($template, $param); return $this->html($content); } ``` ## Issues 如果有遇到问题请提交 [issues](https://github.com/yzh52521/think-mail/issues) ## License Apache 2.0