I'm using a script to send with Amazon SNS some text messages through their API in PHP. The problem which I am trying to solve is how I can test my script without sending everytime the text message. Is there a possibility to enter a kind of 'developing key' whichs give me a full send report in PHP without sending the text message to my mobile phone? I previous used Messagebird and there is this possible.
Thank you.
require './vendor/autoload.php';
error_reporting(E_ALL);
ini_set("display_errors", 1);
$params = array(
'credentials' => array(
'key' => 'ABCKEY123',
'secret' => 'ABCSECRET123',
),
'region' => 'us-east-1',
'version' => 'latest'
);
$sns = new \Aws\Sns\SnsClient($params);
$args = array(
"SenderID" => "NAME",
"SMSType" => "Transactional",
"Message" => "Message",
"PhoneNumber" => "+31612345678"
);
$result = $sns->publish($args);
echo "<pre>";
var_dump($result);
echo "</pre>";
You would either need to modify your code to NOT send to Amazon SNS, or you could have it send to an Amazon SNS topic that simply sends the message as an email.
Related
I am trying to send an SMS with the latest version of the Aws SDK, in my project I do not use any type of PHP frameworks.
I don't want to send mass notifications to a bunch of phone numbers subscribed to a specific topic when an action happens, I want to send a notification to a specific phone number when an action happens.
I'm testing with this code that the AWS documentation provides but it doesn't work:
require_once('../aws/aws-autoloader.php');
use Aws\Sns\SnsClient;
use Aws\Exception\AwsException;
$SnSclient = new SnsClient([
'profile' => 'default',
'region' => 'us-east-1',
'version' => '2010-03-31'
]);
$message = 'YOUR_MESSAGE';
$phone = 'PHONE_NUMBER';
$result = $SnSclient->publish([
'Message' => $message,
'PhoneNumber' => $phone,
]);
var_dump($result);
Right in the publish part it throws me an Error 500
$result = $SnSclient->publish([
'Message' => $message,
'PhoneNumber' => $phone,
]);
What should I do? I greatly appreciate your help!
I tried to use the V2 API to send SMS in the SNS service, and it worked, but it obligated me to create a topic and a subscription with the cellphone number target.
The documentation tells that i am not obligated to create a topic and subscription for the destination cellphone number to send SMS, so i discovered that i must use V3 API to send SMS without TopicARN obligation.
After to use a PHP server with 5.5 version, and V3 API, the TOPIC ARN was not asked, but it took so much time, more than 1 minute, and i got the 503 error as server response, there is no error on log_error.
Could you try to help me?
The code i used and worked on V2 but not V3:
require 'aws-autoloader.php';
use Aws\Sns\SnsClient;
$snsClient = SnsClient::factory(array(
'key' => 'mykey',
'secret' => 'mysecret',
'version' => 'latest',
'region' => 'us-west-2'
));
$destination = array('+number'); // this way works on V2, but not on V3
//$destination = '+number'; // tried like this too
try {
$resp = $snsClient->publish(array(
'PhoneNumber' => $destination,
'Message' => utf8_encode('Message')
));
echo $resp->get('MessageId');
} catch(Exception $e)
{
echo $e->getMessage(); // I didn´t get exception, i got server error 503
}
I found the problem, after the start to use the PHP API V3 i must start like this:
$snsClient = SnsClient::factory(array(
'version' => 'latest',
'region' => 'us-west-2',
'credentials' => array(
'key' => 'mykey',
'secret' => 'mysecret',
)
));
But i still with problems, i receive this message:
Error executing "Publish" on "https://sns.us-west-2.amazonaws.com"; AWS HTTP error: Client error: POST https://sns.us-west-2.amazonaws.com resulted in a 400 Bad Request response: Sender InvalidPara (truncated...) InvalidParameter (client): Invalid parameter: TopicArn or TargetArn Reason: no value for required parameter - Sender InvalidParameter Invalid parameter: TopicArn or TargetArn Reason: no value for required parameter
I didn´t set up the TopicARN or TargetARN because i don´t want to create a subscription for each target number, and the documentation tells me that i can send for a number without register it.
Any help?
When sending SMS you don't need TopicArn. Just do like this:
First install aws/aws-sdk-php. Using composer:
composer require aws/aws-sdk-php
Create a php file with:
require './vendor/autoload.php';
error_reporting(E_ALL);
ini_set("display_errors", 1);
$params = array(
'credentials' => array(
'key' => 'YOUR_KEY_HERE',
'secret' => 'YOUR_SECRET_HERE',
),
'region' => 'us-east-1', // < your aws from SNS Topic region
'version' => 'latest'
);
$sns = new \Aws\Sns\SnsClient($params);
$args = array(
"SenderID" => "SenderName",
"SMSType" => "Transational",
"Message" => "Hello World! Visit www.tiagogouvea.com.br!",
"PhoneNumber" => "FULL_PHONE_NUMBER"
);
$result = $sns->publish($args);
echo "<pre>";
var_dump($result);
echo "</pre>";
The result must have one array with many data, including MessageId.
I am attempting to send mail using AWS SES sendEmail method, and I'm having trouble with an error. I have read this question: AWS SDK Guzzle error when trying to send a email with SES
I am dealing with a very similar issue. The original poster indicates that they have a solution, but did not post the solution.
My code:
$response = $this->sesClient->sendEmail('example#example.com',
array('ToAddresses' => array($to)),
array('Subject.Data' => array($subject), 'Body.Text.Data' => array($message)));
Guzzle code producing the error (from aws/Guzzle/Service/Client.php):
return $this->getCommand($method, isset($args[0]) ? $args[0] : array())->getResult();
Error produced:
Catchable fatal error: Argument 2 passed to Guzzle\Service\Client::getCommand() must be of the type array, string given
Looking at the Guzzle code, I can see that the call to getCommand will send a string if args[0] is set and is a string. If args[0] is NOT set then an empty array is sent.
What am I missing here please?
SOLUTION:
It turns out I was trying to use SDK1 data structures on the SDK2 code base. Thanks to Charlie Smith for helping me to understand what I was doing wrong.
For others (using AWS SDK for PHP 2) :
Create the client -
$this->sesClient = \Aws\Ses\SesClient::factory(array(
'key' =>AWS_ACCESS_KEY_ID,
'secret' => AWS_SECRET_KEY,
'region' => Region::US_EAST_1
));
Now, structure the email (don't forget that if you're using the sandbox you will need to verify any addresses you send to. This restriction doesn't apply if you have been granted production status) -
$from = "Example name <example#example.com>";
$to ="example#verified.domain.com";
$subject = "Testing AWS SES SendEmail()";
$response = $this->sesClient->getCommand('SendEmail', array(
'Source' => $from,
'Destination' => array(
'ToAddresses' => array($to)
),
'Message' => array(
'Subject' => array(
'Data' => $subject
),
'Body' => array(
'Text' => array(
'Data' => "Hello World!\n Testing AWS email sending."
),
'Html' => array(
'Data' => "<h1>Hello World!</h1><p>Testing AWS email sending</p>"
)
),
),
))->execute();
That should work now.
Here is the relevant section in the AWS SDK for PHP 2 documentation:
http://docs.aws.amazon.com/aws-sdk-php-2/latest/class-Aws.Ses.SesClient.html#_sendEmail
The following code allows me to send SNS with (queue) SQS but i cant seem to choose the protocol like in amazons management console
* the keys are all random strings
<?php
require_once('sdk-1.5.6.2/sdk.class.php');
$AWS_KEY = "6VVWTU4JDAAKHYB1C3ZN";
$AWS_SECRET_KEY = "GMSCUD8C0QA1QLV9Y3RP2IAKDIZSCHRGKEJSXZ4F";
//create a new SQS queue and grab the queue URL
$sqs = new AmazonSQS(array( "key" => $AWS_KEY, "secret" => $AWS_SECRET_KEY ));
$response = $sqs->create_queue('test-topic-queue');
$queue_url = (string) $response->body->CreateQueueResult->QueueUrl;
$queue_arn = 'arn:aws:sqs:us-east-1:ENCQ8gqrAcXv:test-topic-queue';
//create a new SNS topic and grab the topic ARN.
$sns = new AmazonSNS(array( "key" => $AWS_KEY, "secret" => $AWS_SECRET_KEY ));
$response = $sns->create_topic('test-topic');
$topic_arn = (string) $response->body->CreateTopicResult->TopicArn;
//Then give the SNS topic the permission to send messages to the SQS queue. ** allow all principals. SNS doesn't send from your account ID -- it has its own account ID that it sends from.
$queue_url = 'https://sqs.us-east-1.amazonaws.com/ENCQ8gqrAcXv/test-topic-queue';
$queue_arn = 'arn:aws:sqs:us-east-1:ENCQ8gqrAcXv:test-topic-queue';
$topic_arn = 'arn:aws:sns:us-east-1:ENCQ8gqrAcXv:test-topic';
$policy = new CFPolicy($sqs, array(
'Version' => '2008-10-17',
'Id' => 'sampleId',
'Statement' => array(
array(
'Resource' => $queue_arn,
'Effect' => 'Allow',
'Sid' => 'rule1',
'Action' => 'sqs:*',
'Condition' => array(
'StringEquals' => array(
'aws:SourceArn' => $topic_arn
)
),
'Principal' => array(
'AWS' => '*'
)
)
)
));
$response = $sqs->set_queue_attributes($queue_url, array(
array('Name' => 'Policy', 'Value' => $policy->get_json())
));
//then subscribe the SQS queue to the SNS topic and grab the subscription ARN.
$queue_arn = 'arn:aws:sqs:us-east-1:ENCQ8gqrAcXv:test-topic-queue';
$topic_arn = 'arn:aws:sns:us-east-1:ENCQ8gqrAcXv:test-topic';
$response = $sns->subscribe($topic_arn, 'sqs', $queue_arn);
// normally here is where you would choose the protocol but this example sends this to SQS
// subscribe ( $topic_arn, $protocol, $endpoint, $opt )
$subscription_arn = (string) $response->body->SubscribeResult->SubscriptionArn;
//view the list of subscriptions to verify.
$topic_arn = 'arn:aws:sns:us-east-1:ENCQ8gqrAcXv:test-topic';
$q = new CFBatchRequest(200);
for ($i = 0; $i < 1000; $i++)
{
$sns->batch($q)->publish($topic_arn, 'Hello world! ' . time());
}
$response = $sns->batch($q)->send();
//receive messages from the queue.
$queue_url = 'https://sqs.us-east-1.amazonaws.com/ENCQ8gqrAcXv/test-topic-queue';
$response = $sqs->receive_message($queue_url, array(
'MaxNumberOfMessages' => 10,
));
print_r($response);
// delete SQS queue
$queue_url = 'https://sqs.us-east-1.amazonaws.com/ENCQ8gqrAcXv/test-topic-queue';
$response = $sqs->delete_queue($queue_url);
?>
question: where would i choose the protocol?
this link says that subscribe() is where protocol is defined but the above example sends that to SQS
You can use SNS to push to an SMS number, and you can also use SNS to push to an SQS queue. But SQS is not capable of pushing anything — including to an SMS number.
Perhaps you have your infrastructure components confused?
Subscribe method has the following signature
subscribe ( $topic_arn, $protocol, $endpoint, $opt )
If you what to subscribe using SMS as protocol then do the following
$response = $sns->subscribe($topic_arn, 'sms', $phone_no);
where $phone_no(String) is the phone number of the sms enabled device
The different protocols currently supported are http, https, email, email-json, sms and sqs based on the protocol you have to change the $endpoint parameter passed to the subscribe method.
Checkout the full documentation for subscribe method
I'm trying to understand amazon php sdk for AWS but I really can't use it.
I find some basic classes to create, display and push topic but I doesn't work either.
I just want to find a way (the simplest way) to push a topic from my website.
First and foremost, to get acquainted with Amazon Simple Notification Service (SNS), I recommend to perform all required step manually once via the AWS Management Console as explained in the Getting Started Guide, i.e. Create a Topic, Subscribe to this Topic and Publish a message to it.
Afterwards it should be fairly straight forward to facilitate the sample fragments provided in the documentation of the AWS SDK for PHP running, see e.g. method publish() within class AmazonSNS:
$sns = new AmazonSNS();
// Get topic attributes
$response = $sns->publish(
'arn:aws:sns:us-east-1:9876543210:example-topic',
'This is my very first message to the world!',
array(
'Subject' => 'Hello world!'
)
);
// Success?
var_dump($response->isOK());
For a more complete example you might want to check out the the example provided in Sending Messages Using SNS [...].
If none of this works out, you'll have to provide more details regarding the specific problems you are encountering, as requested by tster already.
Good luck!
As told to you by #SteffenOpel, you should once try to perform all required steps manually once via the AWS Management Console.
Then you may use the AWS SDK for PHP(v3) as below to create the SNS client(or infact any service's client, surely with some changes) and then to create a SNS Topic.
<?php
//assuming that use have downloaded the zip file for php sdk
require 'C:/wamp/www/aws sdk/aws-autoloader.php'; //Change the path according to you
use Aws\Sns\SnsClient;
try{
/*-------------METHOD 1----------------*/
// Create a new Amazon SNS client using AWS v3
//$sns = new Aws\Sns\SnsClient([
$sns = new SnsClient([
'region' => 'us-west-2', //Change according to you
'version' => '2010-03-31', //Change according to you
'credentials' => [
'key' => '<Your root AWS Key',
'secret' => '<Your root AWS Secret>',
],
'scheme' => 'http', //disables SSL certification, there was an error on enabling it
]);
$result = $sns -> createTopic([
'Name' => '<Your Topic>',
]);
/*-------------METHOD 2----------------*/
/*
// Create a new Amazon SNS client using AWS v2
$sns = SnsClient::factory(array(
'region' => 'us-west-2',
'version' => '2010-03-31',
'credentials' => [
'key' => '<Your root AWS Key',
'secret' => '<Your root AWS Secret>',
],
'scheme' => 'http',
));
$result = $sns -> createTopic([
'Name' => '<Your Topic>',
]);
*/
/*-------------METHOD 3----------------*/
/*
// Create a new Amazon SNS client using AWS SDK class
// Use the us-west-2 region and latest version of each client.
$sharedConfig = [
'region' => 'us-west-2',
'version' => '2010-03-31',
'credentials' => [
'key' => '<Your root AWS Key',
'secret' => '<Your root AWS Secret>',
],
//'ssl.certificate_authority' => '/path/to/updated/cacert.pem',
'scheme' => 'http',
];
// Create an SDK class used to share configuration across clients.
$sdk = new Aws\Sdk($sharedConfig);
$sns = $sdk -> createSns();
$result = $sns -> createTopic([
'Name' => '<Your Topic>',
]);
*/
if ($result)
echo "Yes";
else
echo "No";
}
catch(Exception $e){
echo 'Caught Exception: ', $e->getMessage(), "\n";
}
?>
NOTE: This code illustrates creating the client for SNS in three different methods.
You may uncomment and use one according to your need.
Method 1 (version 3) is the best if you're creating a single client, else use Method 3. Method 2 is soon gonna depreciate (as its version 2)
I success to do it by using this classes->
Amazon-SNS-client-for-PHP
Very good, easy to use and working just great.
According to the AWS official docs here, we will have to create a SnsClient and call it's publish method. You can get topic's ARN from AWS console.
$SnSclient = new SnsClient([
'profile' => 'default',
'region' => 'us-east-1',
'version' => '2010-03-31'
]);
$message = 'This message is sent from a Amazon SNS code sample.';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';
try {
$result = $SnSclient->publish([
'Message' => $message,
'TopicArn' => $topic,
]);
var_dump($result);
} catch (AwsException $e) {
// output error message if fails
error_log($e->getMessage());
}