PHPackages                             duan617/easy-sms - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Mail &amp; Notifications](/categories/mail)
4. /
5. duan617/easy-sms

ActiveLibrary[Mail &amp; Notifications](/categories/mail)

duan617/easy-sms
================

The easiest way to send short message.

v1.0.1(3y ago)1100MITPHPPHP &gt;=5.6

Since Jul 18Pushed 3y agoCompare

[ Source](https://github.com/duanfuxing/easy-sms)[ Packagist](https://packagist.org/packages/duan617/easy-sms)[ RSS](/packages/duan617-easy-sms/feed)WikiDiscussions master Synced 4w ago

READMEChangelogDependencies (3)Versions (3)Used By (0)

Easy SMS
========

[](#easy-sms)

📲 一款满足你的多种发送需求的短信发送组件

[![Build Status](https://camo.githubusercontent.com/814ea79126c74f22c92b49fa44bfffbcf43f30f7de605360709317170b2c5676/68747470733a2f2f7472617669732d63692e6f72672f6f766572747275652f656173792d736d732e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/overtrue/easy-sms)[![Latest Stable Version](https://camo.githubusercontent.com/a646ffdf9238784175d5a52667970266042625f9b803007ee1d419c286e235cb/68747470733a2f2f706f7365722e707567782e6f72672f6f766572747275652f656173792d736d732f762f737461626c652e737667)](https://packagist.org/packages/overtrue/easy-sms)[![Latest Unstable Version](https://camo.githubusercontent.com/2cd72de2e8062c47e0430b88d50e198a9352e2a9766329a27fdb5b6996b5c5c1/68747470733a2f2f706f7365722e707567782e6f72672f6f766572747275652f656173792d736d732f762f756e737461626c652e737667)](https://packagist.org/packages/overtrue/easy-sms)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/7804f253686e9945b55cb3fbab9a6aad9edb3ae9853d28b400d4c697c0b01629/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6f766572747275652f656173792d736d732f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/overtrue/easy-sms/?branch=master)[![Code Coverage](https://camo.githubusercontent.com/2ee8f0077642b1aa146386a539770cf2e2511f775b86b3c1122c447d4571565f/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6f766572747275652f656173792d736d732f6261646765732f636f7665726167652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/overtrue/easy-sms/?branch=master)[![Total Downloads](https://camo.githubusercontent.com/9bdf0ac234d5ece86aec3f05d2290e1088b5d53257dfc52e647d6033d4b14e48/68747470733a2f2f706f7365722e707567782e6f72672f6f766572747275652f656173792d736d732f646f776e6c6f616473)](https://packagist.org/packages/overtrue/easy-sms)[![License](https://camo.githubusercontent.com/1381d132dd990a678f3624830b0f588e16a401db90cfad8b8f86a4befb246765/68747470733a2f2f706f7365722e707567782e6f72672f6f766572747275652f656173792d736d732f6c6963656e7365)](https://packagist.org/packages/overtrue/easy-sms)

特点
--

[](#特点)

1. 支持目前市面多家服务商
2. 一套写法兼容所有平台
3. 简单配置即可灵活增减服务商
4. 内置多种服务商轮询策略、支持自定义轮询策略
5. 统一的返回值格式，便于日志与监控
6. 自动轮询选择可用的服务商
7. 更多等你去发现与改进...

平台支持
----

[](#平台支持)

- [阿里云](https://www.aliyun.com/)
- [云片](https://www.yunpian.com)
- [Submail](https://www.mysubmail.com)
- [螺丝帽](https://luosimao.com/)
- [容联云通讯](http://www.yuntongxun.com)
- [互亿无线](http://www.ihuyi.com)
- [聚合数据](https://www.juhe.cn)
- [SendCloud](http://www.sendcloud.net/)
- [百度云](https://cloud.baidu.com/)
- [华信短信平台](http://www.ipyy.com/)
- [253云通讯（创蓝）](https://www.253.com/)
- [融云](http://www.rongcloud.cn)
- [天毅无线](http://www.85hu.com/)
- [腾讯云 SMS](https://cloud.tencent.com/product/sms)
- [阿凡达数据](http://www.avatardata.cn/)
- [华为云](https://www.huaweicloud.com/product/msgsms.html)
- [网易云信](https://yunxin.163.com/sms)
- [云之讯](https://www.ucpaas.com/index.html)
- [凯信通](http://www.kingtto.cn/)
- [七牛云](https://www.qiniu.com/)
- [UE35.net](http://uesms.ue35.cn/)
- [Ucloud](https://www.ucloud.cn)
- [短信宝](http://www.smsbao.com/)

环境需求
----

[](#环境需求)

- PHP &gt;= 5.6

安装
--

[](#安装)

```
$ composer require "overtrue/easy-sms"
```

**For Laravel notification**

如果你喜欢使用 [Laravel Notification](https://laravel.com/docs/5.8/notifications), 可以考虑直接使用朋友封装的拓展包：

使用
--

[](#使用)

```
use Overtrue\EasySms\EasySms;

$config = [
    // HTTP 请求的超时时间（秒）
    'timeout' => 5.0,

    // 默认发送配置
    'default' => [
        // 网关调用策略，默认：顺序调用
        'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,

        // 默认可用的发送网关
        'gateways' => [
            'yunpian', 'aliyun',
        ],
    ],
    // 可用的网关配置
    'gateways' => [
        'errorlog' => [
            'file' => '/tmp/easy-sms.log',
        ],
        'yunpian' => [
            'api_key' => '824f0ff2f71cab52936axxxxxxxxxx',
        ],
        'aliyun' => [
            'access_key_id' => '',
            'access_key_secret' => '',
            'sign_name' => '',
        ],
        //...
    ],
];

$easySms = new EasySms($config);

$easySms->send(13188888888, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
]);
```

短信内容
----

[](#短信内容)

由于使用多网关发送，所以一条短信要支持多平台发送，每家的发送方式不一样，但是我们抽象定义了以下公用属性：

- `content` 文字内容，使用在像云片类似的以文字内容发送的平台
- `template` 模板 ID，使用在以模板ID来发送短信的平台
- `data` 模板变量，使用在以模板ID来发送短信的平台

所以，在使用过程中你可以根据所要使用的平台定义发送的内容。

```
$easySms->send(13188888888, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
]);
```

你也可以使用闭包来返回对应的值：

```
$easySms->send(13188888888, [
    'content'  => function($gateway){
        return '您的验证码为: 6379';
    },
    'template' => function($gateway){
        return 'SMS_001';
    },
    'data' => function($gateway){
        return [
            'code' => 6379
        ];
    },
]);
```

你可以根据 `$gateway` 参数类型来判断返回值，例如：

```
$easySms->send(13188888888, [
    'content'  => function($gateway){
        if ($gateway->getName() == 'yunpian') {
            return '云片专用验证码：1235';
        }
        return '您的验证码为: 6379';
    },
    'template' => function($gateway){
        if ($gateway->getName() == 'aliyun') {
            return 'TP2818';
        }
        return 'SMS_001';
    },
    'data' => function($gateway){
        return [
            'code' => 6379
        ];
    },
]);
```

发送网关
----

[](#发送网关)

默认使用 `default` 中的设置来发送，如果某一条短信你想要覆盖默认的设置。在 `send` 方法中使用第三个参数即可：

```
$easySms->send(13188888888, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
 ], ['yunpian', 'juhe']); // 这里的网关配置将会覆盖全局默认值
```

返回值
---

[](#返回值)

由于使用多网关发送，所以返回值为一个数组，结构如下：

```
[
    'yunpian' => [
        'gateway' => 'yunpian',
        'status' => 'success',
        'result' => [...] // 平台返回值
    ],
    'juhe' => [
        'gateway' => 'juhe',
        'status' => 'failure',
        'exception' => \Overtrue\EasySms\Exceptions\GatewayErrorException 对象
    ],
    //...
]
```

如果所选网关列表均发送失败时，将会抛出 `Overtrue\EasySms\Exceptions\NoGatewayAvailableException` 异常，你可以使用 `$e->results` 获取发送结果。

你也可以使用 `$e` 提供的更多便捷方法：

```
$e->getResults();               // 返回所有 API 的结果，结构同上
$e->getExceptions();            // 返回所有调用异常列表
$e->getException($gateway);     // 返回指定网关名称的异常对象
$e->getLastException();         // 获取最后一个失败的异常对象
```

自定义网关
-----

[](#自定义网关)

本拓展已经支持用户自定义网关，你可以很方便的配置即可当成与其它拓展一样的使用：

```
$config = [
    ...
    'default' => [
        'gateways' => [
            'mygateway', // 配置你的网站到可用的网关列表
        ],
    ],
    'gateways' => [
        'mygateway' => [...], // 你网关所需要的参数，如果没有可以不配置
    ],
];

$easySms = new EasySms($config);

// 注册
$easySms->extend('mygateway', function($gatewayConfig){
    // $gatewayConfig 来自配置文件里的 `gateways.mygateway`
    return new MyGateway($gatewayConfig);
});

$easySms->send(13188888888, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
]);
```

国际短信
----

[](#国际短信)

国际短信与国内短信的区别是号码前面需要加国际码，但是由于各平台对国际号码的写法不一致，所以在发送国际短信的时候有一点区别：

```
use Overtrue\EasySms\PhoneNumber;

// 发送到国际码为 31 的国际号码
$number = new PhoneNumber(13188888888, 31);

$easySms->send($number, [
    'content'  => '您的验证码为: 6379',
    'template' => 'SMS_001',
    'data' => [
        'code' => 6379
    ],
]);
```

定义短信
----

[](#定义短信)

你可以根据发送场景的不同，定义不同的短信类，从而实现一处定义多处调用，你可以继承 `Overtrue\EasySms\Message` 来定义短信模型：

```
