Mostafa
Mostafa

Reputation: 33

Send SMS using AWS SNS - .Net Core

I'm trying to use AWS world wide messaging service using C#/.Net Core.

However I do not receive the message in my phone number. Below is the code:

public static async Task<PublishResponse> sendSMS()
        {

            string accessKey = "my Key";
            string secretAccessKey = "my secret key";
            var client = new AmazonSimpleNotificationServiceClient(accessKey, 
            secretAccessKey, RegionEndpoint.USEast1);

            string phoneNumber = "my number";

            PublishRequest req = new PublishRequest();
            req.Message = "Hellloooo from core";
            req.PhoneNumber = "+2" + phoneNumber;   
            PublishResponse res = await client.PublishAsync(req);
            return res;
        }

And I invoke this method in the main function:

 public static void Main(string[] args)
        {
             var respond = sendSMS();     
        }

I appreciate if anyone could help me with this. thanks in advance

Upvotes: 2

Views: 5253

Answers (3)

Mohamad Elnaqeeb
Mohamad Elnaqeeb

Reputation: 563

For new Comers

If you are using Aws toolkit for visual studio as I suppose

Nuget Packages:

AWSSDK.CORE

AWSSDK.Extensions.NETCore.Setup

AWSSDK.SimpleNotificationService

In your program.cs (.net core 6)

using Amazon.SimpleNotificationService;

and add your extensions

builder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions());
builder.Services.AddAWSService<IAmazonSimpleNotificationService>(builder.Configuration.GetAWSOptions());
builder.Services.AddSingleton<ISMSSender, SMSSender>();

In appsettings

    "AWS": {
    "Profile": "aws toolkit profile name",
    "Region": "aws region"
  }

an ISMSSender interface for dependency injection:

public interface ISMSSender
{
    Task<PublishResponse> SendSMSAsync(string phone, string subject, string Message);           
}

Lastly your implementation:

public class SMSSender : ISMSSender
{
    IAmazonSimpleNotificationService _SES;
    public SMSSender(IAmazonSimpleNotificationService SES)
    {
        _SES = SES;
    }
    public Task<PublishResponse> SendSMSAsync(string phone, string subject, string Message)
    {

        var messageAttributes = new Dictionary<string, MessageAttributeValue>();
        
        MessageAttributeValue senderID = new MessageAttributeValue();
        senderID.DataType = "String";
        senderID.StringValue = "sendername";
        MessageAttributeValue sMSType = new MessageAttributeValue();
        sMSType.DataType = "String";
        sMSType.StringValue = "Transactional";//or Promotional according to AWS setup you choosed 
        MessageAttributeValue maxPrice = new MessageAttributeValue();
        maxPrice.DataType = "Number";
        maxPrice.StringValue = "0.5";
        messageAttributes.Add("AWS.SNS.SMS.SenderID", senderID);
        messageAttributes.Add("AWS.SNS.SMS.SMSType", sMSType);
        messageAttributes.Add("AWS.SNS.SMS.MaxPrice", maxPrice);
        var sendRequest = new PublishRequest()           
        {
            Subject = subject,
            Message = Message,
            PhoneNumber =phone,
            MessageAttributes = messageAttributes
        };
        try
        {       
            Console.WriteLine("Sending SMS using AWS SES...");
            var response = _SES.PublishAsync(sendRequest);
            Console.WriteLine("The SMS was sent successfully.");
            return response;
        }
        catch (Exception ex)
        {
            Console.WriteLine("The SMS was not sent.");
            Console.WriteLine("Error message: " + ex.Message);
        }
        throw new NotImplementedException();
    }
}

For usage use dependency injection into your Controller or class

private readonly ISMSSender _smsSender;

public MyController(ISMSSender smsSender)
{
    _smsSender = smsSender;    
}

and then Send Sms:

try
{
    var result = await _smsSender.SendSMSAsync(
       phoneNumber,
           "Title",
           "Message");
}
catch (Exception)
{
    //handle failure
}

In order to send sms from your Ec2 or elastic Beanstalk app go to IAM roles and for role aws-elasticbeanstalk-ec2-role add permission AWSElasticBeanstalkRoleSNS and for role aws-elasticbeanstalk-service-role add permission AmazonSNSFullAccess

Upvotes: 1

the following function worked for me. make sure that the account liked to credential you provided has SNS full access in AWS IAM Console

    public static async Task SendSMS(AWSCredentials basicCred, string phoneNum, string message, string smsType= "Promotional")
    { 
            AmazonSimpleNotificationServiceClient snsClient = new AmazonSimpleNotificationServiceClient(basicCred, Amazon.RegionEndpoint.APSoutheast2);
            PublishRequest pubRequest = new PublishRequest();

            pubRequest.Message = message;
            // add optional MessageAttributes, for example:
            pubRequest.MessageAttributes.Add("AWS.SNS.SMS.SenderID", new MessageAttributeValue
            { StringValue = "SSystems", DataType = "String" });
            pubRequest.MessageAttributes.Add("AWS.SNS.SMS.MaxPrice", new MessageAttributeValue
            { StringValue = "0.50", DataType = "Number" });

            pubRequest.PhoneNumber = phoneNum;
            pubRequest.MessageAttributes.Add("AWS.SNS.SMS.SMSType", new MessageAttributeValue
            { StringValue = smsType, DataType = "String" });

            PublishResponse pubResponse = await snsClient.PublishAsync(pubRequest);
            Console.WriteLine(pubResponse.MessageId);
            Console.ReadLine();
        }

Upvotes: 0

Ashish Jain
Ashish Jain

Reputation: 31

 public static async Task<PublishResponse> SendMessageToMobileAsync(string countryCode, string mobileNumber, string message)
    {
        var accessKey = "xxx";
        var secretKey = "xxx";
        var client = new AmazonSimpleNotificationServiceClient(accessKey, secretKey, RegionEndpoint.USEast1);
        var messageAttributes = new Dictionary<string, MessageAttributeValue>();
        var smsType = new MessageAttributeValue
        {
            DataType = "String",
            StringValue = "Transactional"
        };

        messageAttributes.Add("AWS.SNS.SMS.SMSType", smsType);
        
        PublishRequest request = new PublishRequest
        {
            Message = message,
            PhoneNumber = countryCode + mobileNumber,
            MessageAttributes = messageAttributes
        };

        return await client.PublishAsync(request);

    }

Upvotes: 2

Related Questions