☰
Symfony Notifier AllMySms Bridge 实战指南:通过 DSN 与 AllMySmsOptions 集成法国短信服务
2026/10/2 17:28:53 网站建设 项目流程
  • 后端
  • Web框架

【免费下载链接】symfony

The Symfony PHP framework

项目地址:https://gitcode.com/GitHub_Trending/sy/symfony
点击查看免费下载

本指南以 Symfony 官方仓库中 AllMySms Notifier Bridge 的 README 为核心,完整讲解如何在 Symfony Notifier 中接入法国短信服务商 AllMySms:从 DSN 配置、消息发送,到使用AllMySmsOptions注入发送时间、模拟模式、唯一标识符等高级选项。读完本文,你将掌握allmysms://传输通道的完整配置方式,并能结合源码理解其底层 HTTP 调用与响应处理细节。

一、AllMySms Bridge 是什么

AllMySms 是法国的一家短信批量发送服务商(官网地址见 README)。本仓库中的symfony/all-my-sms-notifier桥接包为 Symfony Notifier 组件提供 AllMySms 集成能力,使开发者可以像使用其他通道(如 Twilio、Vonage)一样,通过统一的消息 API 向 AllMySms 发送短信。

该桥接包位于仓库的 src/Symfony/Component/Notifier/Bridge/AllMySms 目录,由四个核心文件构成:

  • AllMySmsTransport.php:实际执行 HTTP 请求的传输器;
  • AllMySmsTransportFactory.php:负责解析 DSN、创建传输器;
  • AllMySmsOptions.php:承载发送可选参数的消息选项类;
  • 三个测试文件:Tests/AllMySmsTransportTest.php、Tests/AllMySmsTransportFactoryTest.php、Tests/AllMySmsOptionsTest.php,用于验证各组件行为。

二、DSN 配置:一行搞定账号与默认发送号码

README 给出的 DSN 格式如下:

ALLMYSMS_DSN=allmysms://LOGIN:APIKEY@default?from=FROM

其中各字段含义:

DSN 片段含义说明
LOGIN你的用户 ID必填,对应 AllMySms 账号的用户标识
APIKEY你的 AllMySms API 密钥必填,用于 HTTP Basic 认证
FROM发送方号码可选,默认值为36180

在 Symfony 应用中,通常将该 DSN 写入.env文件,然后通过symfony/notifier的Texter服务(服务 id 为texter)直接发送短信,无需手写传输器。

从源码看,DSN 的解析发生在 AllMySmsTransportFactory::create():

  • $this->getUser($dsn)取出 DSN 中的LOGIN;
  • $this->getPassword($dsn)取出APIKEY;
  • $dsn->getOption('from')读取from选项;
  • 当 host 为default时,host 保持为null,最终由传输器内部的HOST常量(api.allmysms.com)决定实际端点。

因此allmysms://LOGIN:APIKEY@default?from=FROM中的default只是一个占位符,实际请求会发往api.allmysms.com。

2.1 需要重点注意的 DSN 校验规则

测试文件 AllMySmsTransportFactoryTest.php 还揭示了几条容易被忽略的约束:

  • 缺少APIKEY(如allmysms://login@default)或缺少LOGIN(如allmysms://:apiKey@default)都会被判定为不完整 DSN(incomplete DSN),无法创建传输器;
  • 只有allmysms://scheme 才被支持(见supportsProvider与unsupportedSchemeProvider),其他 scheme 会抛出UnsupportedSchemeException;
  • from是可选项,DSN 中可省略(如allmysms://login:apiKey@host.test),也可显式指定(如allmysms://login:apiKey@host.test?from=TEST)。

2.2ssl选项:按需关闭 HTTPS

从 CHANGELOG.md 可以看到,8.2 版本新增了sslDSN 选项,用于让请求走明文 HTTP。对应源码中,工厂通过$this->getSsl($dsn)决定传输器使用的协议(默认启用 HTTPS)。一般生产环境保持默认即可,只有在明确的调试或内网场景下才考虑?ssl=0。

三、发送短信:从 SmsMessage 到 Texter

与其他 Notifier 通道一致,发送流程是:创建SmsMessage→ 绑定可选选项 → 交给texter发送。README 给出的完整示例:

use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Bridge\AllMySms\AllMySmsOptions; $sms = new SmsMessage('+1411111111', 'My message'); $options = (new AllMySmsOptions()) ->alerting(1) ->campaignName('API') ->cliMsgId('test_cli_msg_id') ->date('2023-05-23 23:47:25') ->simulate(1) ->uniqueIdentifier('unique_identifier') ->verbose(1) // ... ; // Add the custom options to the sms message and send the message $sms->options($options); $texter->send($sms);

其中SmsMessage构造函数的两个核心参数分别是接收方手机号(+1411111111)和短信正文(My message)。$texter即 Symfony 的TexterInterface服务,在框架应用中直接注入即可。

3.1 传输器支持的消息类型

从 AllMySmsTransport::supports() 可以看到,该传输器只支持SmsMessage,并且其携带的 options 必须是AllMySmsOptions实例(或为 null):

  • 若传入ChatMessage或其他消息类型,会抛出UnsupportedMessageTypeException(测试中unsupportedMessagesProvider对此有明确覆盖);
  • 因此不要把该桥接用于 Slack、Telegram 等聊天场景,它专司短信。

四、AllMySmsOptions:为短信注入高级选项

AllMySmsOptions实现自 Notifier 的MessageOptionsInterface,全部方法均返回static,支持链式调用,最终通过toArray()输出选项数组。各方法及其底层存储键(见 AllMySmsOptions.php)如下:

方法存储键类型说明
alerting(int)alertingint告警提示开关,传1启用
campaignName(string)campaignNamestring在 AllMySms 后台标识本次发送所属营销活动名称
cliMsgId(string)cliMsgIdstring客户端消息 ID,便于回执对账
date(string)datestring定时发送时间,README 示例格式为2023-05-23 23:47:25
simulate(int)simulateint模拟模式,传1表示不真实下发、仅做测试
uniqueIdentifier(string)uniqueIdentifierstring唯一标识符,用于去重或追踪
verbose(int)verboseint详细日志开关,传1启用

这些选项的键名与 AllMySms 官方 HTTP API(v9.0)请求参数一一对应,完整字段含义可参考 README 中给出的官方 API 文档链接。测试文件 AllMySmsOptionsTest.php 验证了链式调用后toArray()的输出结构,可作为编写时的对照参考。

除上述方法外,AllMySmsOptions的构造函数还接收一个可选的初始数组(new AllMySmsOptions(['from' => 'foo'])),测试中的supportedMessagesProvider展示了这一用法,方便从已有数组直接构造选项对象。

五、底层原理:doSend 如何把消息变成 HTTP 请求

理解传输器内部逻辑有助于排查发送失败问题。核心实现在 AllMySmsTransport::doSend(),其调用链如下:

  1. 组装请求体:从SmsMessage读取from(优先取消息自身的getFrom(),为空时回退到 DSN 配置的from,再回退到默认36180)、to(手机号)与text(正文),与 options 数组合并,并用array_filter()剔除空值;
  2. 发起 POST 请求:目标端点为https://api.allmysms.com/sms/send/(协议由ssl选项决定),使用 HTTP Basic 认证(auth_basic传入 login 与 apiKey),请求体为 JSON;
  3. 处理响应:
    • 网络层失败(TransportExceptionInterface)会包装为TransportException,提示 "Could not reach the remote AllMySms server.";
    • 期望的 HTTP 状态码是201;若状态码不符,会从响应体中提取description与code抛出异常;
    • 即使返回 201,若响应缺少smsId字段,同样视为失败并抛异常;
  4. 构造 SentMessage:将响应中的nbSms(发送条数)、balance(账户余额)、cost(本次费用)写入SentMessage的附加信息,并把smsId设为消息 ID。

测试 AllMySmsTransportTest.php 的testSentMessageInfo用 MockHttpClient 模拟了 201 响应,并断言getInfo('nbSms')、getInfo('balance')、getInfo('cost')能正确取回这些值——这也印证了 CHANGELOG 中 7.3 版本 "AddnbSms,balance, andcostinfo into returnedSentMessage" 的说明。

5.1 传输器字符串表示

AllMySmsTransport::__toString()会输出形如allmysms://api.allmysms.com或allmysms://api.allmysms.com?from=TEST的字符串,这在toStringProvider测试中有对应断言,可用于日志记录或SentMessage的传输通道标识。

六、环境要求与安装前提

依据桥接包的 composer.json,使用该桥接需满足:

  • PHP 版本>= 8.4.1;
  • symfony/http-client:^7.4 或 ^8.0;
  • symfony/notifier:^8.2。

由于桥接包位于本仓库的 Notifier Bridge 目录,通常在 Symfony 项目中通过 Composer 安装对应包名symfony/all-my-sms-notifier,然后在.env中配置ALLMYSMS_DSN环境变量即可被 Notifier 自动发现(Notifier 会依据 DSN scheme 匹配到AllMySmsTransportFactory,其getSupportedSchemes()返回['allmysms'])。

七、小结

围绕 README 的 DSN 与消息选项两条主线,本桥接的使用要点可归纳为:

  1. 用allmysms://LOGIN:APIKEY@default?from=FROM配置环境变量,LOGIN/APIKEY必填,from可选且默认36180;
  2. 发送时构建SmsMessage,需要高级能力时用AllMySmsOptions链式配置alerting、campaignName、cliMsgId、date、simulate、uniqueIdentifier、verbose,再$sms->options($options)后交给$texter->send($sms);
  3. 传输器只支持SmsMessage,底层以 HTTP Basic 认证 POST 到api.allmysms.com/sms/send/,成功以 201 +smsId为判据,并可通过SentMessage::getInfo()获取nbSms、balance、cost等计费信息。

若需深入验证各行为,可直接阅读 Tests 目录下的三个测试文件,它们覆盖了 DSN 解析、选项序列化与成功响应解析等关键路径。

  • 后端
  • Web框架

【免费下载链接】symfony

The Symfony PHP framework

项目地址:https://gitcode.com/GitHub_Trending/sy/symfony
点击查看免费下载
上一篇:CANN/hccl主机通信端口范围配置
下一篇:探索Khoj:您的第二大脑AI助手——最新功能与用户案例全解析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询