使用 AWS 开发工具包为 PHP 发送电子邮件

Send an Email Using the AWS SDK for PHP

我正在尝试使用 AWS SDK 为 PHP 设置电子邮件,但目前未成功。我做了以下事情:

  1. 验证了我的域和收件人电子邮件地址。
  2. 生成了我的 AWS 访问密钥

3.installed pHP 版本 7.0.25

4.installed 安装适用于 PHP 版本 3 的 AWS SDK。

  1. 已创建共享凭据文件。

文档指示我需要将此文件保存到以下位置:“~/.aws/credentials”(我正在使用 MAC)

我的问题是我没有“.aws”文件夹,所以我在我的主目录中创建了一个(隐藏的 aws 目录),然后将我的 "credentials" 文件保存在那里(包含访问密钥凭据) .我收到以下错误:

 PHP Fatal error:  Uncaught Aws\Exception\CredentialsException: Error 
 retrieving credentials from the instance profile metadata server. (Client 
 error: `GET http://169.254.169.254/latest/meta-data/iam/security-
 credentials/` resulted in a `404 Not Found` response:
 <?xml version="1.0" encoding="iso-8859-1"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "htt (truncated...)
 ) in /home/ec2-user/vendor/aws/aws-sdk-
 php/src/Credentials/InstanceProfileProvider.php:79
 Stack trace:
 #0 /home/ec2-user/vendor/guzzlehttp/promises/src/Promise.php(203): 
 Aws\Credentials\InstanceProfileProvider->Aws\Credentials\{closure}
 (Object(GuzzleHttp\Exception\ClientException))
 #1 /home/ec2-user/vendor/guzzlehttp/promises/src/Promise.php(156): 
 GuzzleHttp\Promise\Promise::callHandler(2, Array, Array)
 #2 /home/ec2-user/vendor/guzzlehttp/promises/src/TaskQueue.php(47): 
 GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}()
 #3 /home/ec2-
 user/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(96): 
 GuzzleHttp\Promise\TaskQueue- in /home/ec2-user/vendor/aws/aws-sdk-
 php/src/Credentials/InstanceProfileProvider.php on line 79

PHP 在终端中执行的脚本(如 aws 所述:http://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-using-sdk-php.html):

 <?php

 // Replace path_to_sdk_inclusion with the path to the SDK as described in 
 // http://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/basic-
 usage.html
 define('REQUIRED_FILE','path_to_sdk_inclusion'); 

 // Replace sender@example.com with your "From" address. 
 // This address must be verified with Amazon SES.
 define('SENDER', 'sender@example.com');           

 // Replace recipient@example.com with a "To" address. If your account 
 // is still in the sandbox, this address must be verified.
 define('RECIPIENT', 'recipient@example.com');    

 // Specify a configuration set. If you do not want to use a configuration
 // set, comment the following variable, and the 
 // 'ConfigurationSetName' => CONFIGSET argument below.
 define('CONFIGSET','ConfigSet');

 // Replace us-west-2 with the AWS Region you're using for Amazon SES.
 define('REGION','us-west-2'); 

 define('SUBJECT','Amazon SES test (AWS SDK for PHP)');

 define('HTMLBODY','<h1>AWS Amazon Simple Email Service Test Email</h1>'.
              '<p>This email was sent with <a 
 href="https://aws.amazon.com/ses/">'.
              'Amazon SES</a> using the <a href="https://aws.amazon.com/sdk-
 for-php/">'.
              'AWS SDK for PHP</a>.</p>');
 define('TEXTBODY','This email was send with Amazon SES using the AWS SDK for 
 PHP.');

 define('CHARSET','UTF-8');

 require REQUIRED_FILE;

 use Aws\Ses\SesClient;
 use Aws\Ses\Exception\SesException;

 $client = SesClient::factory(array(
     'version'=> 'latest',     
     'region' => REGION
 ));

 try {
      $result = $client->sendEmail([
     'Destination' => [
         'ToAddresses' => [
             RECIPIENT,
        ],
 ],
'Message' => [
    'Body' => [
        'Html' => [
            'Charset' => CHARSET,
            'Data' => HTMLBODY,
        ],
        'Text' => [
            'Charset' => CHARSET,
            'Data' => TEXTBODY,
        ],
    ],
    'Subject' => [
        'Charset' => CHARSET,
        'Data' => SUBJECT,
    ],
],
'Source' => SENDER,
// If you are not using a configuration set, comment or delete the
// following line
     'ConfigurationSetName' => CONFIGSET,
 ]);
 $messageId = $result->get('MessageId');
 echo("Email sent! Message ID: $messageId"."\n");

 } catch (SesException $error) {
 echo("The email was not sent. Error message: ".$error-
 >getAwsErrorMessage()."\n");
 }

 ?>

首先,你没有手动创建~/.aws/credentials。让 AWS CLI 为您做这件事。

安装 CLI:pip install awscli --upgrade

删除您创建的凭据文件。

配置 CLI 和凭据:aws configure

您的凭据现已正确设置。

您收到的错误消息是由 PHP SDK 尝试从 EC2 实例元数据中获取凭据引起的。这是失败的,因为您尚未为此系统配置 IAM 角色。这也意味着凭据未正确存储在您的个人资料中 (~/.aws/credentials).

注意:更好的方法是不在您的 EC2 实例上存储凭据。而是创建一个 IAM 角色并将该角色分配给 EC2 实例。所有 AWS SDK 都知道如何从实例元数据中提取凭证。

IAM Roles for Amazon EC2