使用AWS SDK PHP(SMTP / IAM)进行SES的凭据

时间:2015-12-25 07:46:09

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

我是AWS的新手,我不是来自安全背景的人,所以围绕AWS IAM和SMTP设置的概念让我头晕目眩。

我已按照所有步骤安装了AWS PHP SDK,验证了域名(以及从AWS控制台成功发送了一些测试电子邮件)以及我要发送的几个单独的电子邮件地址测试电子邮件,但我没有得到的部分是SMTP / IAM。

我已经获得了他们提供的亚马逊基本脚本,但我真的不明白在创建SMTP凭据和/或IAM时我需要做些什么,而且我已经搜索过了无法真正找到答案或了解亚马逊文档所说的内容。

我正在使用的代码如下,但我完全不知道的部分是我应该为这个特定项目生成访问密钥的方式(我只需要发送电子邮件,不需要处理退回等)以及从脚本中访问这些内容的最佳方法是(即我假设它们应该存储在锁定目录中的实际脚本之外?)。

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

use Aws\Ses\SesClient;

require 'vendor/autoload.php';

$client = SesClient::factory(array(
    'key' => 'SECRET_KEY',
    'secret' => 'SECRET_SECRET',
    'region' => 'eu-west-1',
    'version' => '2010-12-01'
));

$emailSentId = $client->sendEmail(array(
    // Source is required
    'Source' => 'donotreply@mydomain.com',
    // Destination is required
    'Destination' => array(
        'ToAddresses' => array('sendto@mydomain.com')
    ),
    // Message is required
    'Message' => array(
        // Subject is required
        'Subject' => array(
            // Data is required
            'Data' => 'SES Testing',
            'Charset' => 'UTF-8',
        ),
        // Body is required
        'Body' => array(
            'Text' => array(
                // Data is required
                'Data' => 'My plain text email',
                'Charset' => 'UTF-8',
            ),
            'Html' => array(
                // Data is required
                'Data' => '<b>My HTML Email</b>',
                'Charset' => 'UTF-8',
            ),
        ),
    ),
    'ReplyToAddresses' => array( 'donotreply@mydomain.com' ),
    'ReturnPath' => 'donotreply@mydomain.com'
));




?>

我尝试进入SES控制台并在那里生成SMTP密钥并将其直接插入脚本(只是为了测试它是否可行,我已将它们从脚本中删除并删除了这些密钥以用于安全目的),但我真的不明白我是否应该使用它们,或者我是否需要创建一个额外的IAM用户,或者我是否应该生成这些已被引用的动态组合(很高兴为此提供专家建议)赌注方法)...在任何给我提出以下错误:

  

致命错误:未捕获的异常&#39; Aws \ Exception \ CredentialsException&#39;使用消息&#39;从实例配置文件元数据服务器检索凭据时出错。 (客户端错误:GET http://169.254.169.254/latest/meta-data/iam/security-credentials/导致404 Not Found响应:Aws \ Credentials {closure}(数组)#1 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(152 ):GuzzleHttp \ Promise \ Promise :: callHandler(2,Array,Array)#2 /var/www/html/vendor/guzzlehttp/promises/src/TaskQueue.php(60):GuzzleHttp \ Promise \ Promise :: GuzzleHttp \ Promise {closure}()#3 /var/www/html/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(96):GuzzleHttp \ Promise \ TaskQueue-&gt; run()#4 / var / www in第79行/var/www/html/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php

无论如何,希望有人理解我所说的内容 - 很高兴提供任何其他细节,但我不认为我从这里增加了很多价值,因为我确定从这个问题来看,我并不真正了解它的安全方面。

如果我能够开始工作,了解基本概念并且在最后一块肉馅饼落到我的喉咙之前仍留有一些头发,这将是一个真正的圣诞奇迹。

提前致谢!!

G-曼

2 个答案:

答案 0 :(得分:11)

如果有人遇到同样的问题,在找到线索后让我的工作(http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html),我做了以下事情:

  1. 验证电子邮件/域名
  2. 使用AmazonSESFullAccess创建IAM用户(根据需要进行修改)
  3. 将密钥插入以上部分的脚本中:

    'key' => 'SECRET_KEY',
    'secret' => 'SECRET_SECRET',
    
  4. 但是,当我运行它时失败并出现相同的错误。

  5. 将上述内容更改为以下内容,成功运行并发送了电子邮件...

    'credentials' => [
    'key'    => 'SECRET_KEY',
    'secret' => 'SECRET_SECRET'],
    
  6. 希望有人觉得这很有用。

    干杯!!

答案 1 :(得分:1)

使用AWS SES有两种方法。一种是使用SMTP接口,另一种是直接使用SES API。

使用SES SMTP时,以他们的方式生成SMTP密钥是正确的方法,而imo是最简单的方法,如果您只想发送一些电子邮件。如果您曾使用任何其他SMTP服务器从您的应用程序发送电子邮件,那么SES-SMTP接口是替代品 - 无需更改代码,您只需生成凭据并使用它们。

另一方面,如果您直接使用SES API,那么您将使用常规IAM凭证。

  

在Amazon SES上使用凭据

     

要与Amazon Simple Email Service(Amazon SES)进行交互,您可以使用安全凭据来验证谁   您是否以及是否有权与Amazon SES进行互动。   有不同类型的凭据和您使用的凭据   取决于你想做什么。例如,您使用AWS访问密钥   使用Amazon SES API和SMTP凭据发送电子邮件时   使用Amazon SES SMTP界面发送电子邮件时。

http://docs.aws.amazon.com/ses/latest/DeveloperGuide/using-credentials.html