Frage

Ich benutze das AWS -PHP SDK. Ich habe den folgenden Code, um eine E -Mail mit SES zu senden:

$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'
            )
        );

Einfach genug, oder? Aber ich bekomme den folgenden Fehler aus dem AWS SDK selbst:

Undefined index: body

sdk.class.php(828)

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

Mein AWS -Zugriff und meine geheimen Schlüssel sind korrekt, da ich S3 verwenden kann. Was vermisse ich hier?

Bearbeiten: Ich habe eine andere E -Mail -Adresse auf @gmail.com überprüft und diese stattdessen als aus der Adresse verwendet. Ich bin immer noch auf den gemeldeten ursprünglichen Fehler gestoßen. Ich hatte jedoch kein Problem mit der von mir erwähnten Bibliothek von Drittanbietern.

War es hilfreich?

Lösung

Update: Dieser Fehler ist jetzt gepatcht! Bitte laden Sie die neueste Version herunter.

Dies scheint ein bestätigter Fehler im Amazon SDK zu sein. Siehe Link unten ...

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

Soweit ich das beurteilen kann, gibt es dafür noch keinen Patch. Ich nehme an, Sie könnten es selbst mit isset () patchen. Das habe ich getan und es scheint jetzt zu funktionieren. Auch dies ist ein Fehler in sdk.class.php in Zeile 828. Ich möchte momentan keine Patch -Datei erstellen. Hier ist, was ich dem Code gemacht habe ...

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

Nochmals kein offizieller Patch, aber es lässt Sie auf Ihren glücklichen Weg gehen.

Andere Tipps

Ich würde vermuten, dass Sie eine nicht private E-Mail-Adresse benötigen, die ubuntu@localhost eindeutig nicht.

(Bearbeiten) Auch aus der Dokumentation müssen Sie überprüfen ubuntu@localhost.

E -Mail -Adressüberprüfung

Bevor Sie Ihre erste Nachricht senden können, verlangt Amazon SES, dass Sie Ihre E -Mail -Adresse überprüfen. Dies soll bestätigen, dass Sie die E -Mail -Adresse besitzen und andere daran hindern, sie zu verwenden.

http://docs.amazonwebservices.com/es/latest/developerguide/index.html?initialSetup.emailverification.html

So mache ich es ohne 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);

Dies kann ein Fehler im Amazon SDK sein. Dies wäre nicht das erste Mal.

Ich habe stattdessen eine exzellente Bibliothek von Drittanbietern verwendet:

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

Und seine Dokumentation:http://www.orderingdisorder.com/aws/ses/

Klappt wunderbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top