2011-03-21 102 views
3

我正在使用AWS PHP SDK。我有以下代碼使用SES發送電子郵件:無法通過Amazon SES發送電子郵件

$ses = new AmazonSES(...); 
$response = $ses->send_email('[email protected]', 
      array('ToAddresses' => '[email protected]'), 
      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訪問和密鑰是正確的,因爲我能夠使用S3。我在這裏錯過了什麼?

編輯: 我在@ gmail.com上驗證了另一個電子郵件地址,並將其用作發件人地址。我仍然遇到了報告的原始錯誤。我沒有問題使用我提到的第三方庫。

+0

雖然你應該得到一個真正的錯誤,你有沒有驗證* *兩者的收件人和發件人地址發送?在開發人員沙箱中時,您需要這樣做。此外,SES是超新的,我認爲他們上週推出了SDK的新副本,因此值得檢查...... – Charles 2011-03-21 03:38:45

+0

如何驗證電子郵件地址?我添加了$ ses-> verify_email_address的調用,但沒有任何更改。 ubuntu @ localhost是我在本地ubuntu實例上運行的用戶。 – Simian 2011-03-21 03:42:12

+0

它必須是SES可以發送到的可公開訪問的電子郵件地址。 – 2011-03-27 04:38:32

回答

8

UPDATE:此錯誤是現在打補丁!請下載最新版本。

這似乎是在亞馬遜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'] = ''; 
} 

再次,不是一個官方補丁,但它可以讓你走你的快樂方式。

+1

在1.3.1版本中進行了修補。 – 2011-03-27 04:39:19

0

這可能是Amazon SDK中的一個錯誤。這不會是第一次。

我,而不是選擇使用一個優秀的第三方庫:

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

及其文檔: http://www.orderingdisorder.com/aws/ses/

就像一個魅力。

+0

發現這個SDK非常慢並且創建FastCGI超時。我試圖每次發送大約500封電子郵件,但超時時間在30到40之間。請求幫助...... – andrebruton 2012-02-22 08:35:09

+0

@andrebruton您的超時可能是因爲發送限制和/或PHP頁面時間限制。您可能無法每秒發送超過5封電子郵件。您應該考慮像每第五封電子郵件一樣添加usleep()命令。同樣,在PHP中使用set_time_limit(),但是一些託管計劃會阻止您延長這個時間 - 您可能需要更靈活的託管計劃。最後,考慮一個隊列表和一個cron來發送郵件。 – Volomike 2012-09-26 02:09:35

1

我猜你需要一個非私人的電子郵件地址,[email protected]顯然不是。

(編輯)同樣來自的文檔,你需要確認你說的電子郵件地址,你顯然不能與[email protected]做的所有者。

郵箱驗證

之前,您可以發送您的第一個 消息,亞馬遜SES需要你 驗證您的電子郵件地址。這是爲了確認您擁有 地址,並阻止其他人使用 。

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

+0

是的,我確實使用外部電子郵件地址添加了驗證電子郵件電話。問題依然存在,我從未收到驗證郵件。 – Simian 2011-03-21 05:54:32

+0

@Simian因爲如果你試圖驗證'ubuntu @ localhost'這個'localhost'是亞馬遜的SES服務器地址,並且你的賬戶不存在。 – 2011-03-21 05:56:53

+0

不,我的意思是我在@ gmail.com上驗證了另一個電子郵件地址,並將其用作發件人地址。我仍然遇到了報告的原始錯誤。我沒有問題使用我提到的第三方庫。 – Simian 2011-03-21 06:10:24

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 = '[email protected]'; // must request production mode in AWS SES Console 
$sFrom = '[email protected]'; // 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); 
+1

像魔術一樣工作:) – 2012-12-22 06:54:57

+0

如何使用您的邏輯發送羣發郵件? – cawecoy 2013-06-06 20:30:04

+0

@cawecoy使用Mailgun做羣發郵件可能會更容易。 – Volomike 2013-07-27 02:51:20

相關問題