AWS SES send_email()对我不起作用,总是“意外的列表元素终止”

时间:2011-12-16 03:42:10

标签: php amazon-web-services amazon-ses

听起来它应该是固定的,但我无法让它发挥作用。

我已阅读send_email的API参考 我已经阅读了与其相关的其他线程,此处和其他网站。我已经使用代码示例来确保我的参数数组是正确嵌套的(我可以弄清楚)但是所有内容都给出了“意外的列表元素终止”

function amazonSesEmail($to, $subject, $message)
{
    $amazonSes = new AmazonSES(); //

    $response = $amazonSes->send_email('my_ses_confirmed_email@gmail.com',
        array('ToAddresses' => $to),
        array(
            'Subject.Data' => $subject,
            'Body.Text.Data' => $message,
        )
    );

    return $response;
}

我也在尝试遵循参考结构时尝试过这样的混乱:

$aws_reply = $aws_ses->send_email(  $fromEmailAddress, 
            array('ToAddresses' => 'same@gmail.com'),
                array(
                 array(  'Subject' => array('Data' => 'New Request '),
                         'Body' =>    array( 'Text' => array('Data' => 'New Request '))
                       )  
               )
);

在所有情况下,当我print_r($ response)时,这是详细信息:

CFResponse Object
(
    [header] => Array
        (
            [x-amzn-requestid] => xxxx-xxxxx
            [content-type] => text/xml
            [content-length] => 280
            [date] => Fri, 16 Dec 2011 03:24:07 GMT
            [_info] => Array
                (
                    [url] => https://xxxxx/
                    [content_type] => text/xml
                    [http_code] => 400
                    [header_size] => 166
                    [request_size] => 1088
                    [filetime] => -1
                    [ssl_verify_result] => 0
                    [redirect_count] => 0
                    [total_time] => 0.349242
                    [namelookup_time] => 0.156135
                    [connect_time] => 0.189468
                    [pretransfer_time] => 0.28083
                    [size_upload] => 185
                    [size_download] => 280
                    [speed_download] => 801
                    [speed_upload] => 529
                    [download_content_length] => 280
                    [upload_content_length] => 185
                    [starttransfer_time] => 0.349204
                    [redirect_time] => 0
                    [certinfo] => Array
                        (
                        )

                    [method] => POST
                )

            [x-aws-stringtosign] => Fri, 16 Dec 2011 03:24:06 GMT68492574-F715-4AE3-B153-9446AE80866D
            [x-aws-request-headers] => Array
                (
                    [Content-Length] => 185
                    [Content-MD5] => 9+iobwTmkId+4ZmGt+6CDw==
                    [Content-Type] => application/x-www-form-urlencoded; charset=utf-8
                    [Date] => Fri, 16 Dec 2011 03:24:06 GMT
                    [Host] => xxxxxxxxxx.com
                    [X-Amz-Nonce] => xxx
                    [X-Amzn-Authorization] => AWS3-HTTPS AWSAccessKeyId=xxx,Algorithm=HmacSHA256,SignedHeaders=Content-Length;Content-MD5;Content-Type;Date;Host;X-Amz-Nonce,Signature=xxxx
                )

            [x-aws-body] => Action=SendEmail&Destination.ToAddresses=xxxx%40gmail.com&Message.Body.Text.Data=test%20body&Message.Subject.Data=test%20subject&Source=xxxxx%40gmail.com&Version=2010-12-01
        )

    [body] => CFSimpleXML Object
        (
            [@attributes] => Array
                (
                    [ns] => http://xxxx
                )

            [Error] => CFSimpleXML Object
                (
                    [Type] => Sender
                    [Code] => MalformedInput
                    [Message] => Unexpected list element termination
                )

            [RequestId] => xxxxx
        )

    [status] => 400
)

我正在将头发撕成两半再次,它应该是如此向前推进,但我似乎无法满足它的格式要求,并且对于那些在博客上发表意见的其他人看起来不适用于我。来自之前完成此任务的人的任何意见将不胜感激!

3 个答案:

答案 0 :(得分:9)

我今天也有这个问题你正在报道。经过一番搞砸之后,我发现以下配置适用于aws php sdk:sdk-1.5.3:

 $response = $ses->send_email($fromEmail,
      array('ToAddresses' => array($toEmail)),
           array(
                'Subject.Data' => $subject,
                'Body.Html.Data' => $content,
           )
 );

看看你和我之间的差异......

 $response = $amazonSes->send_email('my_ses_confirmed_email@gmail.com',
 array('ToAddresses' => $to), // problem is here
      array(
           'Subject.Data' => $subject,
           'Body.Text.Data' => $message,
      )
 );

在两个示例中,您都将“to address,$to”放在数组中。

迟到总比没有好!

答案 1 :(得分:0)

我没有使用该方法,但我确实通过php PEAR软件包的MAIL扩展从php发送电子邮件。在AWS dashoard中,您可以设置您的SES帐户以使用SMTP身份验证,因此我这样做了,现在SES允许我按预期通过smtp发送邮件。

希望这可以节省其他人一些时间和头痛

答案 2 :(得分:0)

我认为这与地址列表必须格式化的方式有关;我在与多个收件人合作时遇到了很多麻烦,但只有一个ToAddress让事情变得非常棘手......

这可能对您有所帮助:Sending emails to multiple recipients with Amazon SES

使用CFComplexType::map()有助于确保事物处于SES的正确结构中。