Не может отправить электронное письмо с Amazon SES
-
28-10-2019 - |
Вопрос
Я использую AWS PHP SDK. У меня есть следующий код, чтобы отправить электронное письмо с помощью 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'
)
);
Достаточно просто, верно? Но я получаю следующую ошибку от самого AWS SDK:
Undefined index: body
sdk.class.php(828)
// Normalize JSON input
828 if ($query['body'] === '[]')
829 {
830 $query['body'] = '';
831 }
Мои AWS Access и Secret Keys верны, так как я могу использовать S3. Что мне здесь не хватает?
РЕДАКТИРОВАТЬ: Я проверил другой адрес электронной почты на @gmail.com и вместо этого использовал его в качестве адреса. Я все еще столкнулся с оригинальной ошибкой. У меня не было проблем с использованием сторонней библиотеки, которую я упомянул.
Решение
Обновление: эта ошибка теперь исправлена! Пожалуйста, загрузите последнюю версию.
Похоже, это подтвержденная ошибка в Amazon SDK. Смотрите ссылку ниже ...
https://forums.aws.amazon.com/thread.jspa?messageid=231411
Насколько я могу судить, для этого еще нет патча. Я полагаю, вы могли бы исправить его самостоятельно, используя isset (). Это то, что я сделал, и сейчас это работает. Опять же, это ошибка в sdk.class.php в строке 828. Мне сейчас не хочется делать патч. Вот что я сделал с кодом, хотя ...
// Normalize JSON input
if (!isset($query['body']) || $query['body'] === '[]')
{
$query['body'] = '';
}
Опять же, не официальный патч, но он позволяет вам идти своим счастливым.
Другие советы
Я предполагаю, что вам нужен не частный адрес электронной почты, который ubuntu@localhost
ясно нет.
(Редактировать) также из документации, необходимая для проверки того, что вы являетесь владельцем указанного адреса электронной почты, который вы явно не можете сделать с ubuntu@localhost
.
Проверка адреса электронной почты
Прежде чем вы сможете отправить свое первое сообщение, Amazon SES требует, чтобы вы проверили свой адрес электронной почты. Это должно подтвердить, что у вас есть адрес электронной почты и не дать другим использовать его.
Вот как я делаю это без 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);
Это может быть ошибка в Amazon SDK. Это не будет первый раз.
Вместо этого я решил использовать отличную стороннюю библиотеку:
https://github.com/kierangraham/php-ses
И его документация:http://www.ordoringdisordorder.com/aws/ses/
Работает как шарм.