codewiser / laravel-smscenter-mailer
为Laravel的smsc.ru邮件发送器
v1.0.0
2024-08-15 16:33 UTC
Requires
- php: ^8.1
- laravel/framework: ^10.0|^11.0
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 }