Skip to main content

Amazon Simple Email Service (Amazon SES) and PHP

This morning Amazon announced availability of a bulk email delivery service called "Simple Email Service". Anyone who knows how much pain is it to set-up scalable email solution (and it is not just spammers who need it!) should celebrate the occasion. I know of a company that spent several years cleaning ip addresses it sends email and found itself locked into the contract with internet provider since it would take forever to reach required level of email deliver ability anywhere else.

Anyway, this evening I decided to check the Amazon claim that the service is "simple". Found out that it is indeed simple!
Since there is not much in terms of the documentation yet, here is my code where I used AWS PHP library:

// Enable full-blown error reporting.

// Set plain text headers
header("Content-type: text/plain; charset=utf-8");

// Include the SDK
require_once '../sdk.class.php';

// Instantiate the Amazon class
$ses = new AmazonSES();

//what's our quota?
$rQuota = $ses->get_send_quota();
$quota24 = (int) $rQuota->body->GetSendQuotaResult->Max24HourSend;
$sentCnt = (int) $rQuota->body->GetSendQuotaResult->SentLast24Hours;
"we can send max of $quota24 per 24 hrs and we sent $sentCnt so far\n");

//verify sender email (do it once per sender!)

//send email
$source = '';
$destination = CFComplexType::map(array('ToAddresses'=>'', 'CcAddresses'=>''));

$message = CFComplexType::map(array('Subject.Data'->'test email', 'Body.Text.Data'->'test message ' . rand(100, 1000)));
$rSendEmail = $ses->send_email($source, $destination, $message);

if (
$rSendEmail->status==200) {
$emailId = $rSendEmail->body->SendEmailResult->MessageId;
"sent test email with id: $emailId\n");
else {


Mark Pemburn said…
Great! This code did the trick for me! Two things need to be changed, however: 1) You need to pass the AWS Access Key and Secret Key into the AmazonSES object (can simply passed be in as arguments in the constructor or as the constants AWS_KEY and AWS_SECRET_KEY) and 2) There's a syntax error in the array passed to the CFComplexType::map -- those '->' need to be '=>'. Other than that, fantastic!
Degan Kettles said…
Thank you so much. This is my first use of any of the amazon services and this saved my bacon. I tried using the perl scripts and my godaddy server didn't have the right libraries installed and so I thought I was stuck. Anyway, it worked, woo hoo!
false said…
Very helpful!
If you want to send html emails, just change :

CFComplexType::map(array('Subject.Data'->'test email', 'Body.Text.Data'->'test message ' . rand(100, 1000)));

with this:


Thanks Again!

Killian said…
Is it possible to send HTML emails with this code?
Brendan said…
Is it possible to reference in a text file for the email content?
I want to add a lot of HTML code to my emails and various apostrophes, inverted commas, etc, may throw the embedded text emails off.
Gene Leybzon said…
My suggestion is two use two template files, one for HTML body of the email, and the other for plain text. In the code you can change addressee name and whatever other information you may have before sending it. And you do need to worry about inverted commas, UNICODE characters, or any escaping as library will take care of correct email encoding

Popular posts from this blog

Posting to FaceBook feed using Graph API

Graph API was announced at F8 with a promise to dramatically simplify the FB API. I checked the read access over the new interface during the presentations and to my big surprise it worked flawlessly and from the first time. When I tried, JSON-formatted info about the FaceBook page was returned (as expected).
Then I tried OAuth 2.0 way of accessing the API to post a message to the feed. And to my even bigger surprise it worked too!
Here is what you need to do to access Graph API over OAuth: 1. Create a FB app, store app properties to a file:
$appkey='7925873fbfb5347e571744515a9d2804'; $appsecret='THE SECRET'; $canvas=''; 2. Create a page that will prompt user the access permission (I am prompting for the publish_stream and offline_access permissions at the same time)
// require'settings.php';
$url=""; $url.=…

Developing Google Glass application showing the Heart Beat Rate

Wearable Sensors + Google GlassWearable sensors  are a lot of fun! I played with them for some time by now, both professionally (at work), and for the coding pleasure. This post is about my latest weekend project - native google glasses app showing heart rate. The idea is to continuously measure hear rate using the sensor and to show pulse rate in real time, for example, while running or exercising. Honestly, I did not find running with Google Glasses to be much fun (as they tend to fell off when I am running), but to see what makes my heart beat faster is an interesting and educational experience.

Google Glass (GG) Turns out to be a nice piece of hardware that is a fun to work with: reasonably fast processor, Android 4.0.1, wide range of sensors, WiFi, and Bluetooth interface!

IngredientsGG ( glass SDK ( SDK ( Sensor (…

Respect Coin

Respect I think it's time to talk about currency. Let's create a Respect Coin.
Step 1. Install OpenZeppelin library npm install zeppelin-solidity
When it comes to coins, I like to use some functions that smart people already implemented and other smart people verified. I think that Zeppelin is a nice collection of Solidity contracts that can be trusted. Let's use the StandardToken contract and use it as a parent class for our own RespectCoin contract.
Step 2. Create RespectCoin contract and store it in "contracts/RespectCoin.sol" file pragma solidity ^0.4.4; import "../node_modules/zeppelin-solidity/contracts/token/StandardToken.sol"; /** * @title RespectCoin * @dev ERC20 Token example, where all tokens are pre-assigned to th e creator. * Note they can later distribute these tokens as they wish using `transfer` and other * `StandardToken` functions. */ contract RespectCoin is StandardToken { string public constant name = "RespectCoin&quo…