对于Amazon SES,循环HTTP post开始失败


Looping HTTP post starts to fail for Amazon SES

我最初在亚马逊SES论坛上发表了这篇文章:https://forums.aws.amazon.com/thread.jspa?threadID=74561&tstart=0

但是由于stackoverflow社区更活跃,我将在这里发布:)

基本上,我有一个预检循环周围的cURL帖子(见底部的帖子脚本片段)。它对几百个帖子有效,但对其他所有帖子都开始失效。这是最后一个成功的帖子,后面跟着100个不成功的帖子的第一个…

* About to connect() to email.us-east-1.amazonaws.com port 443 (#0)
*   Trying 207.171.162.2... * connected
* Connected to email.us-east-1.amazonaws.com (207.171.162.2) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSL connection using RC4-MD5
* Server certificate:
*    subject: /C=US/ST=Washington/L=Seattle/O=Amazon.com Inc./CN=email.us-east-1.amazonaws.com
*    start date: 2010-10-08 00:00:00 GMT
*    expire date: 2013-10-07 23:59:59 GMT
*    subjectAltName: email.us-east-1.amazonaws.com matched
*    issuer: /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)09/CN=VeriSign Class 3 Secure Server CA - G2
* SSL certificate verify ok.
POST / HTTP/1.1
Accept: */*
Host: email.us-east-1.amazonaws.com
Content-Type: application/x-www-form-urlencoded
Date: Sat, 20 Aug 2011 18:59:56 UTC
X-Amzn-Authorization: AWS3-HTTPS AWSAccessKeyId=LKIABMH7PT8SO4YBRDQA,Algorithm=HmacSHA1,Signature=/0HFVEsTBGqUUSQGy9jvmsft2k4=
Content-Length: 5810
Expect: 100-continue
< HTTP/1.1 200 OK
< x-amzn-RequestId: 4a0f8f18-cb5f-11e0-8364-b14fdafc0888
< Content-Type: text/xml
< Content-Length: 326
< Date: Sat, 20 Aug 2011 19:04:55 GMT
< 
* Connection #0 to host email.us-east-1.amazonaws.com left intact
* Closing connection #0

故障开始....

* About to connect() to email.us-east-1.amazonaws.com port 443 (#0)
*   Trying 207.171.162.2... * connected
* Connected to email.us-east-1.amazonaws.com (207.171.162.2) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSL connection using RC4-MD5
* Server certificate:
*    subject: /C=US/ST=Washington/L=Seattle/O=Amazon.com Inc./CN=email.us-east-1.amazonaws.com
*    start date: 2010-10-08 00:00:00 GMT
*    expire date: 2013-10-07 23:59:59 GMT
*    subjectAltName: email.us-east-1.amazonaws.com matched
*    issuer: /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)09/CN=VeriSign Class 3 Secure Server CA - G2
* SSL certificate verify ok.
POST / HTTP/1.1
Accept: */*
Host: email.us-east-1.amazonaws.com
Content-Type: application/x-www-form-urlencoded
Date: Sat, 20 Aug 2011 18:59:56 UTC
X-Amzn-Authorization: AWS3-HTTPS AWSAccessKeyId=LKIABMH7PT8SO4YBRDQA,Algorithm=HmacSHA1,Signature=/0HFVEsTBGqUUSQGy9jvmsft2k4=
Content-Length: 5806
Expect: 100-continue
< HTTP/1.1 400 Bad Request
< x-amzn-RequestId: 4b8f29db-cb5f-11e0-b9af-33e5c8fc863b
< Content-Type: text/xml
< Content-Length: 347
< Date: Sat, 20 Aug 2011 19:04:58 GMT
< 
* Connection #0 to host email.us-east-1.amazonaws.com left intact
* Closing connection #0

下面是脚本片段

foreach($JSONarray['DATABASE'] as $E) 
{
         if ((array_diff($E['LISTS'], $FILTER) != $E['LISTS']) && $E['STATUS'] == "CONF")
         {
         $MAIL = "Action=SendEmail&Source=".$FROME."&ReturnPath=".$BOUNCE."&Destination.ToAddresses.member.1=".$TOE."&Message.Subject.Data=".$SUBE."&Message.Body.Html.Data=".$BODYE;           
         //curl
         $aws = curl_init();
         curl_setopt($aws, CURLOPT_POSTFIELDS, $MAIL);
         curl_setopt($aws, CURLOPT_HTTPHEADER, $headers);
         curl_setopt($aws, CURLOPT_HEADER, false);
         curl_setopt($aws, CURLOPT_URL, $url);
         curl_setopt($aws, CURLOPT_RETURNTRANSFER, true);
         curl_setopt($aws, CURLOPT_VERBOSE, true);
         curl_setopt($aws, CURLOPT_STDERR, $SESLOG);
         curl_exec($aws);
         curl_close($aws);
         }
}

任何想法?

这可能是DOS预防机制在起作用吗?在代码中添加一些睡眠如何?如果我是亚马逊,我肯定会对潜在的DOS攻击采取一些防范措施。

我找到问题了:

<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
<Error>
<Type>Sender</Type>
<Code>RequestExpired</Code>
<Message>Request timestamp: Mon, 22 Aug 2011 15:49:11 UTC expired.  It must be within 300   secs/ of server time.</Message>
</Error>
<RequestId>0e3899cb-ccd7-11e0-9f09-c5d12d442026</RequestId>
</ErrorResponse>

我的头被设置在foreah循环外的curl。哎!因此,我只是将这段代码移到循环中来解决超时问题。