# SMS Sending The ABP Framework provides an abstraction to sending SMS. Having such an abstraction has some benefits; - You can then **easily change** your SMS sender without changing your application code. - If you want to create **reusable application modules**, you don't need to make assumption about how the SMS are sent. ## Installation It is suggested to use the [ABP CLI](CLI.md) to install this package. ### Using the ABP CLI Open a command line window in the folder of the project (.csproj file) and type the following command: ```bash abp add-package Volo.Abp.Sms ``` ### Manual Installation If you want to manually install; 1. Add the [Volo.Abp.Sms](https://www.nuget.org/packages/Volo.Abp.Sms) NuGet package to your project: ``` Install-Package Volo.Abp.Sms ``` 2. Add the `AbpSmsModule` to the dependency list of your module: ```csharp [DependsOn( //...other dependencies typeof(AbpSmsModule) //Add the new module dependency )] public class YourModule : AbpModule { } ``` ## Sending SMS [Inject](Dependency-Injection.md) the `ISmsSender` into any service and use the `SendAsync` method to send a SMS. **Example:** ```csharp using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.Sms; namespace MyProject { public class MyService : ITransientDependency { private readonly ISmsSender _smsSender; public MyService(ISmsSender smsSender) { _smsSender = smsSender; } public async Task DoItAsync() { await _smsSender.SendAsync( "+012345678901", // target phone number "This is test sms..." // message text ); } } } ``` The given `SendAsync` method in the example is an extension method to send an SMS with primitive parameters. In addition, you can pass an `SmsMessage` object which has the following properties: - `PhoneNumber` (`string`): Target phone number - `Text` (`string`): Message text - `Properties` (`Dictionary`): Key-value pairs to pass custom arguments ## NullSmsSender `NullSmsSender` is a the default implementation of the `ISmsSender`. It writes SMS content to the [standard logger](Logging.md), rather than actually sending the SMS. This class can be useful especially in development time where you generally don't want to send real SMS. **However, if you want to actually send SMS, you should implement the `ISmsSender` in your application code.** ## Implementing the ISmsSender You can easily create your SMS sending implementation by creating a class that implements the `ISmsSender` interface, as shown below: ```csharp using System.IO; using System.Threading.Tasks; using Volo.Abp.Sms; using Volo.Abp.DependencyInjection; namespace AbpDemo { public class MyCustomSmsSender : ISmsSender, ITransientDependency { public async Task SendAsync(SmsMessage smsMessage) { // Send sms } } } ``` ## More [ABP Commercial](https://commercial.abp.io/) provides Twilio integration package to send SMS over [Twilio service](https://docs.abp.io/en/commercial/latest/modules/twilio-sms).