如何通过Twilio API从PHP(Laravel)发送批量SMS消息
Laravel 中使用 Twilio 批量发送 SMS 解决方案
一、基于 Twilio 消息服务的代码实现
首先确保已安装 Twilio PHP SDK:
composer require twilio/sdk
可以通过 Laravel Artisan 命令实现批量发送,以下是完整的命令类示例:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Twilio\Rest\Client; class SendBulkSms extends Command { protected $signature = 'sms:bulk-send'; protected $description = '通过 Twilio 消息服务批量发送 SMS'; public function handle() { // 从配置读取 Twilio 凭证 $twilioSid = config('services.twilio.sid'); $twilioToken = config('services.twilio.token'); $messagingServiceSid = config('services.twilio.messaging_service_sid'); $client = new Client($twilioSid, $twilioToken); // 实际场景从数据库获取成员号码列表,确保是 E.164 格式(如 +1234567890) $phoneNumbers = \App\Models\Member::pluck('phone')->toArray(); // 分批处理,避免触发速率限制 $batchSize = 50; $batches = array_chunk($phoneNumbers, $batchSize); foreach ($batches as $batch) { foreach ($batch as $number) { // 用队列异步发送,每条延迟1秒,符合Twilio默认速率限制 dispatch(function () use ($client, $messagingServiceSid, $number) { try { $client->messages->create( $number, [ 'messagingServiceSid' => $messagingServiceSid, 'body' => '【你的组织名称】紧急通知:园区临时管控,请留意后续更新。' ] ); \Log::info("短信发送成功:{$number}"); } catch (\Exception $e) { \Log::error("短信发送失败 {$number}:{$e->getMessage()}"); // 可将失败号码存入单独表,后续重试 \App\Models\FailedSms::create(['phone' => $number, 'error' => $e->getMessage()]); } })->delay(now()->addSeconds(1)); } // 每批发送后短暂停顿,降低服务压力 sleep(5); } $this->info('批量短信任务已全部分发至队列'); } }
在 .env 文件中配置 Twilio 相关信息:
TWILIO_SID=你的Twilio账户SID TWILIO_TOKEN=你的Twilio认证令牌 TWILIO_MESSAGING_SERVICE_SID=你的消息服务SID
二、必须注意的关键点
- 严格遵守速率限制:Twilio 默认速率为每秒1条(美国地区),其他地区可能有调整,必须通过队列延迟发送来规避限流,否则会收到 429 错误。
- 号码格式校验:所有接收号码必须是 E.164 标准格式,存储到数据库前一定要做校验,否则会导致发送失败。
- 失败重试机制:务必记录发送失败的号码,通过单独的任务定时重试,避免遗漏重要通知。
- 消息合规性:不同国家/地区的短信有不同的合规要求,比如国内需要签名,欧美地区不能包含违规内容,提前确认规则避免被运营商拦截。
- 发送号码扩容:如果单次发送量较大(比如2200条),建议给消息服务绑定多个发送号码,Twilio 会自动轮询可用号码,提升发送效率。
- 成本预估:提前确认 Twilio 对应地区的短信价格,批量发送前做好成本核算,避免超出预算。
内容的提问来源于stack exchange,提问作者wonder95
相关产品推荐
相关产品推荐

