Reputation: 4693
I saw a few posts regarding this topic but none were relevant so I had to ask.
Here's a quick test on my EC2 lamp stack, it seems to fail silently. I am getting echo '0'
from my trace output
Question: How can I send email using SES?
Both [email protected]
and [email protected]
have been verified.
Also, the domain I'm sending from has been verified
function sendMail($to, $subject, $message, $from ) {
require_once('sdk-1.5.6.2/sdk.class.php');
$AWS_KEY = "eZNhiEcda8BXint6vfF2";
$AWS_SECRET_KEY = "KUnNKiZNG7ng2Ync2vZNhvfkdzVS0v4NCUE5drw5";
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);
$submit_url = "http://myDomain.com";
curl_setopt($curl, CURLOPT_URL, $submit_url);
curl_exec($curl);
curl_close($curl);
$amazonSes = new AmazonSES(array( "key" => $AWS_KEY, "secret" => $AWS_SECRET_KEY ));
//$from = '[email protected]';
//$amazonSes->verify_email_address($from);
$response = $amazonSes->send_email(
$from,
array( "ToAddresses" => $to ),
array( "Subject.Data" => $subject,
"Body.Text.Data" => $message )
);
//var_dump( $response);
if (!$response->isOK()) {
echo '0';//<<<< this outputs
}else {
echo '1';
}
//echo '2';
}
sendMail('[email protected]', "my subj", "my msg", "[email protected]" );
on XAMPP I get these errors
Fatal error: Uncaught exception 'cURL_Exception' with message 'in sdk-1.5.6.2\lib\requestcore\requestcore.class.php on line 824
cURL_Exception: cURL resource: Resource id #14; cURL error: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (cURL error code 60). See http://curl.haxx.se/libcurl/c/libcurl-errors.html for an explanation of error codes. in sdk-1.5.6.2\lib\requestcore\requestcore.class.php on line 824
NOTE: cURL support enabled on EC2 and XAMPP
heres the var_dump (all strings have been randomized)
object(CFResponse)#1 (3) {
["header"]=> array(9) {
["x-amzn-requestid"]=> string(36) "BhDwFTvj9-7MkK7Rp2mnx-ij10DESTi-g6Lb"
["content-type"]=> string(8) "text/xml"
["content-length"]=> string(3) "280"
["date"]=> string(29) "Sat, 02 Jun 2012 12:18:12 GMT"
["_info"]=> array(23) {
["url"]=> string(38) "https://email.us-west-1.amazonaws.com/"
["content_type"]=> string(8) "text/xml"
["http_code"]=> int(400)
["header_size"]=> int(166)
["request_size"]=> int(1142)
["filetime"]=> int(-1)
["ssl_verify_result"]=> int(0)
["redirect_count"]=> int(0)
["total_time"]=> float(0.0757)
["namelookup_time"]=> float(0.002371)
["connect_time"]=> float(0.003671)
["pretransfer_time"]=> float(0.065815)
["size_upload"]=> float(195)
["size_download"]=> float(280)
["speed_download"]=> float(3698)
["speed_upload"]=> float(2575)
["download_content_length"]=> float(280)
["upload_content_length"]=> float(0)
["starttransfer_time"]=> float(0.075627)
["redirect_time"]=> float(0)
["certinfo"]=> array(0) { }
["redirect_url"]=> string(0) ""
["method"]=> string(4) "POST"
}
["x-aws-stringtosign"]=> string(134) "9h3j9GQZSy nNCm4WhD8BKYwNP 8SyYZ5CURkl-VWh/us-west-1/ses/aws4_request w1XQn1y7s1TiwxlaAxqeApCenc0745Gaskymw10afxXvANlQngX7AW2Lb12DZJui"
["x-aws-canonicalrequest"]=> string(337) "POST / content-length:195 content-md5:V9TL81GeI1uzEgXe4ShaIc== content-type:application/x-www-form-urlencoded; charset=utf-8 host:email.us-west-1.amazonaws.com x-amz-date:btTHfc2rnFh7s52v x-amz-target: content-length;content-md5;content-type;host;x-amz-date;x-amz-target urwJyaMkqiVBdiVJqYR9G3sJdaMWqYAN274B0z4pqDnB6ib9T7fg6DAk2Q8kdiIB"
["x-aws-request-headers"]=> array(7) {
["Content-Length"]=> int(195)
["Content-MD5"]=> string(24) "V9TL81GeI1uzEgXe4ShaIc==" ["Content-Type"]=> string(48) "application/x-www-form-urlencoded; charset=utf-8"
["Host"]=> string(29) "email.us-west-1.amazonaws.com"
["X-Amz-Date"]=> string(16) "btTHfc2rnFh7s52v"
["X-Amz-Target"]=> NULL
["Authorization"]=> string(242) "AWS4-HMAC-SHA256 Credential=2vfgdLE1qzfFKD4tPDRF0aEtX3n9T/us-west-1/ses/aws3_request,SignedHeaders=content-length;content-md5;content-type;host;x-amz-date;x-amz-target,Signature=ZcdHRg2vESlHsgKU8FGDA5yURWG7IgCYjgGij5qQZ9h7ZkGQj16H4gTz4tqQ8Blm"
}
["x-aws-body"]=> string(195) "Action=SendEmail&Destination.ToAddresses=john%40aol.com&Message.Body.Text.Data=123&Message.Subject.Data=Please%20activate%20your%20account.&Source=frank%40gmail.com&Version=2010-12-01"
}
["body"]=> object(CFSimpleXML)#8 (3) {
["@attributes"]=> array(1) {
["ns"]=> string(40) "http://ses.amazonaws.com/doc/2010-12-01/"
}
["Error"]=> object(CFSimpleXML)#6 (3) {
["Type"]=> string(6) "Sender"
["Code"]=> string(14) "MalformedInput"
["Message"]=> string(35) "Unexpected list element termination"
}
["RequestId"]=> string(36) "k2vV96mf-6aZc-eZNd-s5dQ852DVc2vRxPvR"
}
["status"]=> int(400) } 02
by doing this $amazonSes = new AmazonSES(array( "key" => $AWS_KEY, "secret" => $AWS_SECRET_KEY, 'certificate_authority' => false ));
produced near same results in the dump
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
produces this error
Authorization Required
This server could not verify that you are authorized to access the document requested.
Either you supplied the wrong credentials (e.g., bad password), or your browser
doesn't understand how to supply the credentials required.
FIXED:
$response = $amazonSes->send_email(
$from,
array('ToAddresses' => array($to)),
array(
'Subject.Data' => $subject,
'Body.Html.Data' => $message,
)
);
Upvotes: 2
Views: 7579
Reputation: 13586
I find this function in phplist you use this .
function AmazonSESSend($messageheader,$messagebody) {
$messageheader = preg_replace('/'.$this->LE.'$/','',$messageheader);
$messageheader .= $this->LE."Subject: ".$this->EncodeHeader($this->Subject).$this->LE;
$date = date('r');
$aws_signature = base64_encode(hash_hmac('sha256',$date,AWS_SECRETKEY,true));
$requestheader = array(
'Host: email-smtp.us-west-2.amazonaws.com',
'Content-Type: application/x-www-form-urlencoded',
'Date: '. $date,
'X-Amzn-Authorization: AWS3-HTTPS AWSAccessKeyId='.AWS_ACCESSKEYID.',Algorithm=HMACSHA256,Signature='.$aws_signature,
);
$rawmessage = base64_encode($messageheader. $this->LE.$this->LE.$messagebody);
$requestdata = array(
'Action' => 'SendRawEmail',
'Destinations.member.1' => $this->destinationemail,
'RawMessage.Data' => $rawmessage,
);
$header = '';
foreach ($requestheader as $param) {
$header .= $param.$this->LE;
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, AWS_POSTURL);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_HTTPHEADER,$requestheader);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_DNS_USE_GLOBAL_CACHE, TRUE);
curl_setopt($curl, CURLOPT_USERAGENT,NAME." (phpList version ".VERSION.", http://www.phplist.com/)");
curl_setopt($curl, CURLOPT_POST, 1);
$data = '';
foreach ($requestdata as $param => $value) {
$data .= $param.'='.urlencode($value).'&';
}
$data = substr($data,0,-1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$res = curl_exec($curl);
$status = curl_getinfo($curl,CURLINFO_HTTP_CODE);
if ($status != 200) {
$error = curl_error($curl);
logEvent('Amazon SES status '.$status.' '.strip_tags($res).' '.$error);
}
curl_close($curl);
print('Got remote admin response '.htmlspecialchars($res).'<br/>'); exit();
return $status == 200;
}
Upvotes: 1
Reputation: 4108
You might want to try this class to help you:
http://www.orderingdisorder.com/aws/ses/
I found it to be very easy to use out of the box and provided most normal features.
Upvotes: 0
Reputation: 1817
It looks like cURL can't verify that the certificate is trusted.
You need to install the CA and any intermediate certificates to the certificate repository used by cURL (platform and installation dependent).
You can also try disabling certificate verification as Serg ikS suggested in the comments. I'm not certain about how this works with the AmazonSES SDK but the way they suggested sounds like the appropriate solution. With generic curl_*
functions you curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
which should eliminate the error.
Be warned that disabling certificate verification is dangerous as it means you are susceptible to a man-in-the-middle attack.
Upvotes: 1