2

私はこのトピックに関するいくつかの投稿を見ましたが、どれも関連性がなかったので、私は尋ねなければなりませんでした。

これが私のEC2ランプスタックの簡単なテストです。静かに失敗するようです。echo '0'トレース出力から取得しています

質問:SESを使用して電子メールを送信するにはどうすればよいですか?と

の両方が検証されています。 また、送信元のドメインが確認されていますjohn@aol.comfrank@gmail.com

function sendMail($to, $subject, $message, $from ) {
    require_once('sdk-1.5.6.2/sdk.class.php');

    $AWS_KEY = "eZNhiEcda8BXint6vfF2";
    $AWS_SECRET_KEY = "KUnNKiZNG7ng2Ync2vZNhvfkdzVS0v4NCUE5drw5";


$curl = curl_init(); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_FTP_SSL, CURLFTPSSL_TRY); 
$submit_url = "http://myDomain.com"; 
curl_setopt($curl, CURLOPT_URL, $submit_url);  
curl_exec($curl);
curl_close($curl);


    $amazonSes = new AmazonSES(array( "key" => $AWS_KEY, "secret" => $AWS_SECRET_KEY ));

    //$from = 'sender@myDomain.com';
    //$amazonSes->verify_email_address($from);

    $response = $amazonSes->send_email( 
        $from,
        array( "ToAddresses" => $to ),
        array( "Subject.Data" => $subject,
                "Body.Text.Data" => $message )
    );

  //var_dump( $response);

    if (!$response->isOK()) {
        echo '0';//<<<< this outputs
    }else {
        echo '1';
    }
    //echo '2';
}
sendMail('john@aol.com', "my subj", "my msg", "frank@gmail.com" );



XAMPPでこれらのエラーが発生します

Fatal error: Uncaught exception 'cURL_Exception' with message 'in sdk-1.5.6.2\lib\requestcore\requestcore.class.php on line 824

cURL_Exception: cURL resource: Resource id #14; cURL error: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (cURL error code 60). See http://curl.haxx.se/libcurl/c/libcurl-errors.html for an explanation of error codes. in sdk-1.5.6.2\lib\requestcore\requestcore.class.php on line 824

注:EC2およびXAMPP

で有効になっているcURLサポート はvar_dumpです(すべての文字列はランダム化されています)

    object(CFResponse)#1 (3) { 
["header"]=> array(9) { 
    ["x-amzn-requestid"]=> string(36) "BhDwFTvj9-7MkK7Rp2mnx-ij10DESTi-g6Lb" 
    ["content-type"]=> string(8) "text/xml" 
    ["content-length"]=> string(3) "280" 
    ["date"]=> string(29) "Sat, 02 Jun 2012 12:18:12 GMT" 
    ["_info"]=> array(23) { 
        ["url"]=> string(38) "https://email.us-west-1.amazonaws.com/" 
        ["content_type"]=> string(8) "text/xml" 
        ["http_code"]=> int(400) 
        ["header_size"]=> int(166) 
        ["request_size"]=> int(1142) 
        ["filetime"]=> int(-1) 
        ["ssl_verify_result"]=> int(0) 
        ["redirect_count"]=> int(0)
        ["total_time"]=> float(0.0757) 
        ["namelookup_time"]=> float(0.002371) 
        ["connect_time"]=> float(0.003671) 
        ["pretransfer_time"]=> float(0.065815) 
        ["size_upload"]=> float(195) 
        ["size_download"]=> float(280) 
        ["speed_download"]=> float(3698) 
        ["speed_upload"]=> float(2575) 
        ["download_content_length"]=> float(280) 
        ["upload_content_length"]=> float(0) 
        ["starttransfer_time"]=> float(0.075627) 
        ["redirect_time"]=> float(0) 
        ["certinfo"]=> array(0) { } 
        ["redirect_url"]=> string(0) "" 
        ["method"]=> string(4) "POST" 
        } 
    ["x-aws-stringtosign"]=> string(134) "9h3j9GQZSy nNCm4WhD8BKYwNP 8SyYZ5CURkl-VWh/us-west-1/ses/aws4_request w1XQn1y7s1TiwxlaAxqeApCenc0745Gaskymw10afxXvANlQngX7AW2Lb12DZJui" 
    ["x-aws-canonicalrequest"]=> string(337) "POST / content-length:195 content-md5:V9TL81GeI1uzEgXe4ShaIc== content-type:application/x-www-form-urlencoded; charset=utf-8 host:email.us-west-1.amazonaws.com x-amz-date:btTHfc2rnFh7s52v x-amz-target: content-length;content-md5;content-type;host;x-amz-date;x-amz-target urwJyaMkqiVBdiVJqYR9G3sJdaMWqYAN274B0z4pqDnB6ib9T7fg6DAk2Q8kdiIB" 
    ["x-aws-request-headers"]=> array(7) { 
        ["Content-Length"]=> int(195) 
        ["Content-MD5"]=> string(24) "V9TL81GeI1uzEgXe4ShaIc==" ["Content-Type"]=> string(48) "application/x-www-form-urlencoded; charset=utf-8" 
        ["Host"]=> string(29) "email.us-west-1.amazonaws.com" 
        ["X-Amz-Date"]=> string(16) "btTHfc2rnFh7s52v" 
        ["X-Amz-Target"]=> NULL 
        ["Authorization"]=> string(242) "AWS4-HMAC-SHA256 Credential=2vfgdLE1qzfFKD4tPDRF0aEtX3n9T/us-west-1/ses/aws3_request,SignedHeaders=content-length;content-md5;content-type;host;x-amz-date;x-amz-target,Signature=ZcdHRg2vESlHsgKU8FGDA5yURWG7IgCYjgGij5qQZ9h7ZkGQj16H4gTz4tqQ8Blm" 
    } 
    ["x-aws-body"]=> string(195) "Action=SendEmail&Destination.ToAddresses=john%40aol.com&Message.Body.Text.Data=123&Message.Subject.Data=Please%20activate%20your%20account.&Source=frank%40gmail.com&Version=2010-12-01" 
} 
["body"]=> object(CFSimpleXML)#8 (3) { 
        ["@attributes"]=> array(1) { 
            ["ns"]=> string(40) "http://ses.amazonaws.com/doc/2010-12-01/" 
        } 
        ["Error"]=> object(CFSimpleXML)#6 (3) { 
            ["Type"]=> string(6) "Sender" 
            ["Code"]=> string(14) "MalformedInput" 
            ["Message"]=> string(35) "Unexpected list element termination" 
        } 
        ["RequestId"]=> string(36) "k2vV96mf-6aZc-eZNd-s5dQ852DVc2vRxPvR" 

    } 
    ["status"]=> int(400) } 02 

これを行う
$amazonSes = new AmazonSES(array( "key" => $AWS_KEY, "secret" => $AWS_SECRET_KEY, 'certificate_authority' => false ));
と、ダンプでほぼ同じ結果が

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
生成され、このエラーが生成されます

Authorization Required

This server could not verify that you are authorized to access the document requested.
Either you supplied the wrong credentials (e.g., bad password), or your browser
doesn't understand how to supply the credentials required.

修繕:

$response = $amazonSes->send_email(
    $from,
    array('ToAddresses' => array($to)),
    array(
        'Subject.Data' => $subject,
        'Body.Html.Data' => $message,
    )
);
4

3 に答える 3

1

cURL は、証明書が信頼されていることを確認できないようです。

CA と中間証明書を、cURL で使用される証明書リポジトリにインストールする必要があります (プラットフォームとインストールによって異なります)。

Serg ikSがコメントで提案したように、証明書の検証を無効にすることもできます。これが AmazonSES SDK でどのように機能するかはわかりませんが、提案された方法は適切な解決策のように思えます。一般的なcurl_*関数をcurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);使用すると、エラーを解消する必要があります。

中間者攻撃を受けやすくなるため、証明書の検証を無効にすることは危険であることに注意してください。

于 2012-06-02T03:19:07.400 に答える
1

this を使用する phplist でこの関数を見つけます。

 function AmazonSESSend($messageheader,$messagebody) {

      $messageheader = preg_replace('/'.$this->LE.'$/','',$messageheader);
      $messageheader .= $this->LE."Subject: ".$this->EncodeHeader($this->Subject).$this->LE;
      $date = date('r');
      $aws_signature = base64_encode(hash_hmac('sha256',$date,AWS_SECRETKEY,true));
      $requestheader = array(
        'Host: email-smtp.us-west-2.amazonaws.com', 
        'Content-Type: application/x-www-form-urlencoded',
        'Date: '. $date,
        'X-Amzn-Authorization: AWS3-HTTPS AWSAccessKeyId='.AWS_ACCESSKEYID.',Algorithm=HMACSHA256,Signature='.$aws_signature,
      );
      $rawmessage = base64_encode($messageheader. $this->LE.$this->LE.$messagebody);
      $requestdata = array(
        'Action' => 'SendRawEmail',
        'Destinations.member.1' => $this->destinationemail,
        'RawMessage.Data' => $rawmessage,
      );
     $header = '';
     foreach ($requestheader as $param) {
        $header .= $param.$this->LE;
      }
      $curl = curl_init();
      curl_setopt($curl, CURLOPT_URL, AWS_POSTURL);
      curl_setopt($curl, CURLOPT_TIMEOUT, 30);
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
      curl_setopt($curl, CURLOPT_HTTPHEADER,$requestheader);
      curl_setopt($curl, CURLOPT_HEADER, 1);
      curl_setopt($curl, CURLOPT_DNS_USE_GLOBAL_CACHE, TRUE); 
      curl_setopt($curl, CURLOPT_USERAGENT,NAME." (phpList version ".VERSION.", http://www.phplist.com/)");
      curl_setopt($curl, CURLOPT_POST, 1);        
      $data = '';
      foreach ($requestdata as $param => $value) {
        $data .= $param.'='.urlencode($value).'&';
      }
      $data = substr($data,0,-1); 
      curl_setopt($curl, CURLOPT_POSTFIELDS, $data);            
      $res = curl_exec($curl);
      $status = curl_getinfo($curl,CURLINFO_HTTP_CODE); 
      if ($status != 200) {
        $error = curl_error($curl);
        logEvent('Amazon SES status '.$status.' '.strip_tags($res).' '.$error);
      }
      curl_close($curl);
     print('Got remote admin response '.htmlspecialchars($res).'<br/>'); exit();
      return $status == 200;
    }
于 2014-12-25T17:36:10.043 に答える
0

このクラスを試してみてください。

http://www.orderingdisorder.com/aws/ses/

箱から出してすぐに使用でき、ほとんどの通常の機能を提供するのは非常に簡単であることがわかりました。

于 2013-11-26T00:51:52.953 に答える