3

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         }

S3 を使用できるので、AWS アクセスとシークレット キーは正しいです。ここで何が欠けていますか?

編集: @gmail.com で別のメール アドレスを確認し、代わりにそれを差出人アドレスとして使用しました。報告された元のバグにまだ遭遇しました。私が言及したサードパーティのライブラリを使用しても問題はありませんでした。

4

4 に答える 4

8

更新: このバグにはパッチが適用されました。最新版をダウンロードしてください。

これは、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'] = '';
}

繰り返しますが、公式のパッチではありませんが、あなたの幸せな道を歩ませてくれます.

于 2011-03-25T20:00:24.823 に答える
1

非公開のメールアドレスが必要だと思いますが、ubuntu@localhost明らかにそうではありません。

(編集)また、あなたが上記の電子メールアドレスの所有者であることを確認する必要があるドキュメントから、これは明らかにubuntu@localhost.

メールアドレスの確認

最初のメッセージを送信する前に、Amazon SES では E メールアドレスを確認する必要があります。これは、電子メール アドレスを所有していることを確認し、他のユーザーが使用できないようにするためです。

http://docs.amazonwebservices.com/es/latest/DeveloperGuide/index.html?InitialSetup.EmailVerification.html

于 2011-03-21T05:27:58.267 に答える
1

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);
于 2012-09-26T02:05:30.947 に答える
0

これは、Amazon SDK のバグである可能性があります。これは初めてではないでしょう。

代わりに、優れたサードパーティのライブラリを使用することにしました。

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

およびそのドキュメント: http://www.orderingdisorder.com/aws/ses/

魅力のように機能します。

于 2011-03-21T04:15:03.757 に答える