Ne peut pas envoyer l'email avec Amazon SES
-
28-10-2019 - |
Question
J'utilise AWS SDK PHP. J'ai le code ci-dessous pour envoyer un e-mail en utilisant SES:
$ses = new AmazonSES(...);
$response = $ses->send_email('ubuntu@localhost',
array('ToAddresses' => 'myemail@somedomain.com'),
array(
'Subject.Data' => 'My Test message',
'Body.Text.Data' => 'my message'
)
);
Assez simple, non? Mais je reçois l'erreur suivante de l'AWS SDK lui-même:
Undefined index: body
sdk.class.php(828)
// Normalize JSON input
828 if ($query['body'] === '[]')
829 {
830 $query['body'] = '';
831 }
Mon accès AWS et les clés secrètes sont correctes, puisque je suis en mesure d'utiliser S3. Qu'est-ce que je manque ici?
EDIT: Je vérifiais une adresse e-mail différente sur @ gmail.com, et utilisé que comme adresse à la place. Je toujours couru dans le bogue rapporté d'origine. J'ai eu aucun problème à l'aide de la bibliothèque tierce partie je l'ai mentionné cependant.
La solution
Mise à jour: Ce bogue est maintenant corrigé! S'il vous plaît télécharger la dernière version.
Cela semble être un bug confirmé dans le SDK Amazon. Voir le lien ci-dessous ...
https://forums.aws.amazon.com/thread.jspa?messageID=231411
Pour autant que je peux dire, il n'y a pas de patch pour ce encore. Je suppose que vous pouvez patcher vous en utilisant isset (). Voilà ce que je l'ai fait, et il semble fonctionner maintenant. Encore une fois, ceci est un bogue dans sdk.class.php en ligne 828. Je ne me sens pas comme faire un fichier correctif en ce moment. Voici ce que je l'ai fait au code, mais ...
// Normalize JSON input
if (!isset($query['body']) || $query['body'] === '[]')
{
$query['body'] = '';
}
Encore une fois, pas un patch officiel, mais il vous permet d'aller sur votre chemin heureux.
Autres conseils
Je suppose que vous avez besoin d'une adresse e-mail non-privée qui ubuntu@localhost
est manifestement pas.
(modifier) ??également de la documentation que vous devez vérifier que vous êtes le propriétaire de ladite adresse e-mail, que vous pouvez clairement pas faire avec ubuntu@localhost
.
Adresse e-mail de vérification
Avant de pouvoir envoyer votre première message, Amazon SES exige que vous vérifier votre adresse e-mail. Est de confirmer que vous possédez l'e-mail adresse, et d'empêcher les autres de l'utiliser.
Voici comment je le fais sans le SDK:
<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
// AMAZON PARAMETERS
$sAccess = 'YOUR-ACCESS-KEY-GOES-HERE';
$sSecret = 'YOUR-SECRET-KEY-GOES-HERE';
$sURL = 'https://email.us-east-1.amazonaws.com/'; // may be subject to change!
$nVerifyHost = 1; // may need to set either of these to 0 on some hosting plans
$nVerifyPeer = 1;
// OUR TEST MESSAGE
$sTo = 'you@example.com'; // must request production mode in AWS SES Console
$sFrom = 'sender@example.com'; // must verify the sender in the AWS SES Console
$sSubject = 'Hello, World!';
$sMessage = <<<EOD
<p>This is para 1.</p>
<p>This is para 2.</p>
<p>Regards,<br>
<b>Management</b></p>
EOD;
// SEND THE MESSAGE
$sDate = gmdate('D, d M Y H:i:s e');
$sSig = base64_encode(hash_hmac('sha256', $sDate, $sSecret, TRUE));
$asHeaders = array();
$asHeaders[] = 'Date: ' . $sDate;
$asHeaders[] = 'X-Amzn-Authorization: AWS3-HTTPS AWSAccessKeyId=' . $sAccess .
',Algorithm=HmacSHA256,Signature=' . $sSig;
$asHeaders[] = 'Content-Type: application/x-www-form-urlencoded';
$sText = $sMessage;
$sText = str_replace("\r\n",'',$sText);
$sText = str_replace("\r",'',$sText);
$sText = str_replace("\n",'',$sText);
$sText = str_replace("\t",' ',$sText);
$sText = str_replace('<BR />','<br />',$sText);
$sText = str_replace('<BR/>','<br />',$sText);
$sText = str_replace('<BR>','<br />',$sText);
$sText = str_replace('</P>','</p>',$sText);
$sText = str_replace('</p>',"</p>\n\n",$sText);
$sText = str_replace('<br />',"<br />\n",$sText);
$sText = strip_tags($sText);
$asQuery = array(
'Action' => 'SendEmail',
'Destination.ToAddresses.member.1' => $sTo,
'Source' => $sFrom,
'Message.Subject.Data' => $sSubject,
'Message.Body.Text.Data' => $sText,
'Message.Body.Html.Data' => $sMessage
);
$sQuery = http_build_query($asQuery);
$hCurl = curl_init();
curl_setopt($hCurl, CURLOPT_SSL_VERIFYHOST, $nVerifyHost);
curl_setopt($hCurl, CURLOPT_SSL_VERIFYPEER, $nVerifyPeer);
curl_setopt($hCurl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($hCurl, CURLOPT_POSTFIELDS, $sQuery);
curl_setopt($hCurl, CURLOPT_HTTPHEADER, $asHeaders);
curl_setopt($hCurl, CURLOPT_HEADER, 0);
curl_setopt($hCurl, CURLOPT_URL, $sURL);
curl_setopt($hCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($hCurl, CURLOPT_FOLLOWLOCATION, 1);
$asResult = array('code'=>'','error'=>'');
if (curl_exec($hCurl)) {
$asResult['code'] = curl_getinfo($hCurl, CURLINFO_HTTP_CODE);
} else {
$asResult['error'] = array (
'code' => curl_errno($hCurl),
'message' => curl_error($hCurl),
);
}
@curl_close($hCurl);
print_r($asResult);
Cela peut être un bug dans le SDK Amazon. Ce ne serait pas la première fois.
J'ai plutôt choisi d'utiliser une excellente bibliothèque tierce partie:
https://github.com/kierangraham/php-ses
Et sa documentation: http://www.orderingdisorder.com/aws/ses/
fonctionne comme un charme.