CakePHP2.0+ 的 AWS SES 组件

这是一个 Amazon SES 组件,旨在帮助开发人员更快地迁移和集成 AWS 服务。未来我们将推出包含所有服务的 aws 插件。

我们在日常应用中使用 Amazon 服务,并使用他们的 SDK 编写普通代码到所需的控制器,因此我们计划为 AWS 服务创建一个组件。

Amazon Simple Email Service (Amazon SES) 是亚马逊非常受欢迎的电子邮件 SMTP 服务。它具有很多优势,例如:

Easy to use
Good documentation
Good fault tolerance
Easy to integrate with existing architecture
Detailed reporting about email deliveries
Highly scalable

一旦使用 AWS 服务,建议在整个应用程序中使用他们的服务。例如,使用 EC2 托管您的应用程序,使用 SES 通过经过身份验证和可信的 SMTP 服务器发送电子邮件。您也可以单独使用 AWS SES 服务。

要使用 Amazon Simple Email Service (Amazon SES) 服务,请执行以下步骤: 1. 您需要一个 AWS 帐户。 http://aws.amazon.com/ 2. 登录帐户并转到 SES 仪表板。 3. 添加电子邮件地址以进行验证,该地址可用于发件人邮件头中的发件人地址。 4. 添加电子邮件后,AWS 会向该电子邮件地址发送验证邮件。您需要验证此电子邮件地址。然后它将出现在已验证的电子邮件列表中。

http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/InitialSetup.EmailVerification.html

默认情况下,AWS 会在首次使用时为您提供沙盒测试帐户。在这种模式下,它只会向已验证的电子邮件地址发送和接收电子邮件。

要将 SES 与您的应用程序一起使用,您需要生产访问权限。因此,首先要求激活生产模式。激活需要一个工作日。激活后,您就可以通过应用程序发送电子邮件了。

现在,SES 仪表板中有一个已验证的电子邮件地址部分。您可以使用这些电子邮件地址在发件人邮件头中设置发件人地址。如果电子邮件地址未经验证,则不能使用该电子邮件地址。

现在,使用 CakePHP 应用程序的实现部分出现了。将 SES 集成到应用程序中非常容易。

Download the SDK (PHP) from AWS. http://aws.amazon.com/code
Extract the sdk to your ‘app/Vendor’ directory.
Rename it as ‘aws’ from ‘aws-sdk’
Create a component file in the components directory. name : AWSSESComponent.php
Copy paste the code to this file
Add the line to Appcontroller :

include_once(APP.DS.’Vendor’.DS.’aws/sdk.class.php’); 或者 App::import(‘Vendor’, ‘aws/sdk.class’);

Add ‘AWSSES’ in the public $components = array('AWSSES');
Now you can use this in any controller. If you want to use this controller specific then in every controller you can add the component array.

当前,此组件仅支持 HTML 电子邮件格式,但我们将进一步改进它。这是来自 Swiftmailer 组件和 SES 的灵感来源。

<?php App::import('Vendor', 'aws/sdk.class.php');
App::import('Vendor', 'aws/services/ses.class.php');

class AWSSESComponent extends Object {

    public $ses;
    public $emailViewPath = '/Emails';
    public $emailLayouts = 'Emails';
    public $htmlMessage;
    public $from = 'from_email_address';
    public $to;

    public function initialize($controller)
    {

    }


    function startup(&$controller)
    {
       $this->controller =& $controller;

       $this->ses = new AmazonSES(array('certificate_authority' => false,
           'key' => 'AWS_Key',
           'secret' => 'AWS_secrete'));

    }

    public function beforeRender()
    {
    }

    public function shutdown()
    {
    }

    public function beforeRedirect()
    {
    }

    public function _aws_ses($viewTemplate, $mailContent = null)
    {
           if(!empty($this->controller->request->data) && $mailContent == null){
           $mailContent = $this->controller->request->data[$this->controller->modelClass];
       }

       $mail = $this->email_templates($viewTemplate);

       $destination = array(
           'ToAddresses' => explode(',', $this->to)
       );
       $message = array(
           'Subject' => array(
               'Data' => $mail['Subject']
           ),
           'Body' => array()
       );


       $this->controller->set('data', $mailContent);

       $this->htmlMessage = $this->_getHTMLBodyFromEmailViews($mail['ctp']);

       if ($this->htmlMessage != NULL) {
           $message['Body']['Html'] = array(
               'Data' => $this->htmlMessage
           );
       }

       $response = $this->ses->send_email($this->from, $destination, $message);

       $ok = $response->isOK();

       if (!$ok) {
           $this->log('Error sending email from AWS SES: ' . $response->body->asXML(), 'debug');
       }
       return $ok;
    }

    public function email_templates($name)
    {
       $this->templates = array('email_name' => array(
           'ctp' => 'ctp_file_name', 'Subject' => 'email_subject'
       ),'email_name' => array('ctp' => 'reset_passwordctp_file_name 'Subject' => 'email_subject'));

       return $this->templates[$name];
    }

    public function _getHTMLBodyFromEmailViews($view)
    {
       $currentLayout = $this->controller->layout;
       $currentAction = $this->controller->action;
       $currentView = $this->controller->view;
       $currentOutput = $this->controller->output;

       ob_start();
       $this->controller->output = null;

       $viewPath = $this->emailViewPath . DS . 'html' . DS . $view;
       $layoutPath = $this->emailLayouts . DS . 'html' . DS . 'default';

       $bodyHtml = $this->controller->render($viewPath, $layoutPath);

       ob_end_clean();

       $this->controller->layout = $currentLayout;
       $this->controller->action = $currentAction;
       $this->controller->view = $currentView;
       $this->controller->output = $currentOutput;

       return $bodyHtml;
    }

}

因此,CakePHP 2.0+ 使用电子邮件视图来存储所有电子邮件模板。您可以更改位置,也可以使用自己的模板。

模板视图位于 ‘View/Emails/html/email.ctp’ 中,如组件中定义的: $emailViewPath 布局来自您的 ‘View/Layouts/Emails/default.ctp’,如组件中定义的: $emailLayouts

此组件会捕获发布的数据本身,您可以在电子邮件中使用这些数据。如果您不想从发布请求中捕获数据,而希望设置自己的数据,这也可以实现,只需将第二个参数添加为数组,您就可以在电子邮件视图中以 ‘$data’ 数组的形式获取它。

如何在控制器中使用:<?php //发送到 //您可以发送用逗号分隔的电子邮件地址,如果您想发送到多个人。

$this->AWSSES->to = $this->request->data[‘User’][‘username’];

if ($this->AWSSES->_aws_ses(‘电子邮件模板名称’, ‘可选参数’)) { //可选参数:可以是您想要在电子邮件视图中访问的数据的数组。

//您的代码 } ?>