Domanda

Sto usando AWS PHP SDK. Ho il seguente codice per inviare un'e -mail utilizzando 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'
            )
        );

Abbastanza semplice, giusto? Ma ricevo il seguente errore dall'SDK AWS stesso:

Undefined index: body

sdk.class.php(828)

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

Le mie chiavi AWS e le chiavi segrete sono corrette, poiché sono in grado di utilizzare S3. Cosa mi manca qui?

Modifica: ho verificato un indirizzo email diverso su @gmail.com e ho usato invece come indirizzo. Mi sono ancora imbattuto nel bug originale riportato. Tuttavia, non ho avuto problemi a usare la biblioteca di terze parti che ho menzionato.

È stato utile?

Soluzione

Aggiornamento: questo bug è ora patchato! Scarica l'ultima versione.

Questo sembra essere un bug confermato nell'SDK Amazon. Vedi il link qui sotto ...

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

Per quanto ne so, non c'è ancora patch per questo. Suppongo che potresti rattigliarlo da solo usando ISSET (). Questo è quello che ho fatto e sembra funzionare ora. Ancora una volta, questo è un bug in sdk.class.php sulla riga 828. Non ho voglia di fare un file di patch in questo momento. Ecco cosa ho fatto al codice, però ...

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

Ancora una volta, non una patch ufficiale, ma ti consente di andare sul tuo modo felice.

Altri suggerimenti

Immagino che tu abbia bisogno di un indirizzo email non privato che ubuntu@localhost Chiaramente non lo è.

(modifica) Anche dalla documentazione devi verificare di essere il proprietario di detto indirizzo email, con cui chiaramente non puoi fare ubuntu@localhost.

Verifica dell'indirizzo e -mail

Prima di poter inviare il tuo primo messaggio, Amazon SES richiede di verificare il tuo indirizzo email. Questo per confermare di possedere l'indirizzo e -mail e per impedire ad altri di usarlo.

http://docs.amazonwebservices.com/es/latest/develingerguide/index.html?inilialsetup.emailverification.html

Ecco come lo faccio senza 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);

Questo potrebbe essere un bug nell'SDK Amazon. Questa non sarebbe la prima volta.

Ho invece optato per usare un'eccellente biblioteca di terze parti:

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

E la sua documentazione:http://www.orderingdisorder.com/aws/ses/

Funziona come un fascino.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top