Pregunta

Estoy usando el AWS PHP SDK. Tengo el siguiente código para enviar un correo electrónico usando 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'
            )
        );

Simple, ¿verdad? Pero recibo el siguiente error del AWS SDK:

Undefined index: body

sdk.class.php(828)

// Normalize JSON input
828         if ($query['body'] === '[]')
829         {
830             $query['body'] = '';
831         }

Mi acceso de AWS y las teclas secretas son correctas, ya que puedo usar S3. ¿Que me estoy perdiendo aqui?

EDITAR: Verifiqué una dirección de correo electrónico diferente en @gmail.com, y la usé como la dirección desde. Todavía me encontré con el error original reportado. Sin embargo, no tuve problemas para usar la biblioteca de terceros que mencioné.

¿Fue útil?

Solución

ACTUALIZACIÓN: ¡Este error ahora está parcheado! Por favor descargue la última versión.

Este parece ser un error confirmado en el SDK de Amazon. Ver enlace a continuación ...

https://forums.aws.amazon.com/thread.jspa?MessageID=231411

Por lo que puedo decir, todavía no hay parche para esto. Supongo que podría parcharlo usted mismo usando isset (). Eso es lo que hice, y parece funcionar ahora. Nuevamente, este es un error en sdk.class.php en la línea 828. No tengo ganas de hacer un archivo de parche en este momento. Sin embargo, esto es lo que le hice al código ...

// Normalize JSON input
if (!isset($query['body']) || $query['body'] === '[]')
{
    $query['body'] = '';
}

Nuevamente, no es un parche oficial, pero te permite seguir tu camino feliz.

Otros consejos

Supongo que necesitas una dirección de correo electrónico no privada que ubuntu@localhost Claramente no lo es.

(editar) También a partir de la documentación que debe verificar que usted es el propietario de dicha dirección de correo electrónico, lo que claramente no puede hacer con ubuntu@localhost.

Verificación de dirección de correo electrónico

Antes de que pueda enviar su primer mensaje, Amazon SES requiere que verifique su dirección de correo electrónico. Esto es para confirmar que usted posee la dirección de correo electrónico y para evitar que otros la usen.

http://docs.amazonwebservices.com/es/latest/developeguide/index.html?initialsetup.emailverification.html

Así es como lo hago sin el 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);

Este puede ser un error en el SDK de Amazon. Esta no sería la primera vez.

En su lugar, he optado por usar una excelente biblioteca de terceros:

https://github.com/kierangraham/php-ses

Y su documentación:http://www.orderingdisorder.com/aws/ses/

Funciona de maravilla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top