codewiser/laravel-smscenter-mailer

为Laravel的smsc.ru邮件发送器

v1.0.0 2024-08-15 16:33 UTC

This package is auto-updated.

Last update: 2024-09-10 08:29:07 UTC


README

此包为您的Laravel项目增加了一个邮件发送器——https://smsc.ru服务。

它支持个人邮件发送和群发邮件。

免责声明

由于此邮件发送器针对特定任务进行了测试,因此我们不能保证它将满足您的期望。

安装

只需通过composer安装包。

配置

smsc部分添加到应用程序的mail.mailers配置中

'smsc' => [
    'transport' => 'smsc',
    'endpoint'  => env('SMSC_URL', 'https://smsc.ru/sys'),
    'username'  => env('SMSC_LOGIN'),
    'password'  => env('SMSC_PASSWORD'),
    'secret'    => env('SMSC_SECRET'),
],

服务将信息/错误日志写入在mail.mailers.log.channel配置中定义的通道。

最后,将MAIL_MAILER=smsc设置到您的.env文件中。

群发

创建包含多个收件人的Mailable并发送它

use Illuminate\Support\Facades\Mail;

$recipients = [
    'foo@example.com',
    'bar@example.com',
];

Mail::send(new CustomMailable($recipients));

个人发送

创建仅包含一个收件人的Mailable或使用Notification

获取响应

将邮件发送器的响应通过外观返回到应用程序的唯一方法(我发现的方法)是将响应附加为\Symfony\Component\Mailer\SentMessage的调试信息。

use Codewiser\SmsCenterMailer\SmsCenterContract;
use Illuminate\Support\Facades\Mail;
use Illuminate\Mail\Events\MessageSent;

$recipients = [
    'foo@example.com',
    'bar@example.com',
];

Event::listen(MessageSent::class, function (MessageSent $event) {

    $service = app(SmsCenterContract::class);
    
    // json encoded response
    $response = json_decode($event->sent->getDebug(), true);
    
    // Die if service respond with error
    $service->throw($response);
    
    // Keep $response['id'] for later use
});

Mail::send(new CustomMailable($recipients));

消息投递状态

消息发送后,我们可能想要检查其投递状态。

轮询

我们可以利用SmsCenterService通过其ID检查消息。

命令

use Codewiser\SmsCenterMailer\MessageStatus;
use Codewiser\SmsCenterMailer\SmsCenterContract;
use Codewiser\SmsCenterMailer\SmsCenterStatusEvent;

/**
 * Execute the console command.
 */
public function handle(SmsCenterContract $provider): void
{   
    // For single messages
    $request = $provider->buildSingleStatusPayload(
        message_id: $this->argument('id'),
        route: $this->argument('email')
    );
    
    // For mass sending
    $request = $provider->buildMailOutStatusPayload(
        message_id: $this->argument('id')
    );
    
    // Die if service respond with error
    $response = $provider->throw(
        $provider->send($request)
    );
    
    // Get status
    $status = MessageStatus::tryFrom($response['status']) ?? MessageStatus::undefined;
    
    // Update status or fire event (see Push)
    event(new SmsCenterStatusEvent($this->argument('id'), $status));
}

推送

SMS中心可能会调用您注册的webhook(如果已注册)。入站请求将被验证,并且可能会触发SmsCenterStatusEvent

控制器

use Codewiser\SmsCenterMailer\SmsCenterContract;
use Illuminate\Http\Request;

public function webhook(Request $request, SmsCenterContract $service) {
    
    $service->webhookStatus($request->all());
    
    return response('ok');
}

事件监听器

use Codewiser\SmsCenterMailer\SmsCenterStatusEvent;

/**
 * Handle the event.
 */
public function handle(SmsCenterStatusEvent $event): void
{
    // Find message by $event->id
    // Update message status with $event->status
}