Files
hdk-core/docs/Email.md

2.4 KiB

Email | 邮件

提供一套通用 Service 用于定制需求,和一套现成的事件/监听器用于异步发送。

服务类

\Singularity\HDK\Core\Service\EmailService

  • 发送纯文本邮件的 \Singularity\HDK\Core\Service\EmailService::sendText()
  • 发送 Html 富文本邮件的 \Singularity\HDK\Core\Service\EmailService::sendHtml()

事件机制

这种方式无法监听邮件发送的结果!

如果你需要根据邮件发送的结果进行处理, 请使用服务类进行自定义

更好的方法可能是在事件发生后触发异步队列, 但如果将异步队列封装在本包中, 相当于强制引用本库的项目使用异步队列机制, 这是我们不愿意看到的。 所以这里的监听器只是集成了同步发送的操作。

如果你想要定义更好的设计, 你可以直接使用提供的 Service 类进行定制。

或许这里还有优化空间😄

事件

\Singularity\HDK\Core\Events\EmailWillSent

监听器

\Singularity\HDK\Core\Listener\EmailWillSentListener

使用方法

监听器已经通过 ConfigProvider 机制注册, 所以你只需要在要发送邮件的地方调度这个事件即可。

这也就意味着,你无法调用这个事件,但不触发这个监听器。 如果你有这样做的必要,请创建一个自己的事件。 这也是为了保证功能的完整性和原子性。

具体使用方法,如下代码所示:

<?php
namespace App\Service;

use Hyperf\Di\Annotation\Inject;
use Psr\EventDispatcher\EventDispatcherInterface;
use App\Event\UserRegistered;use Singularity\HDK\Core\Events\EmailWillSent; 

class UserService
{
    /**
     * @var EventDispatcherInterface
     */
    #[Inject]
    private $eventDispatcher;
    
    public function register()
    {
        // 我们假设存在 User 这个实体
        $user = new User();
        $result = $user->save();
        
        // ↓
        // 这里 dispatch(object $event) 会逐个运行监听该事件的监听器
        $this->eventDispatcher->dispatch(new EmailWillSent(
            target: $user->mobile,
            subject: '注册成功通知',
            type: 'html', // 默认 text 可以不传
            content: <<<HTML
<h1>恭喜你,注册成功!</h1>
HTML,
        ));
        // ↑
        
        return $result;
    }
}