Senchu Thomas
Senchu Thomas

Reputation: 568

Setting mail template in ses client

I am developing a web application using cakephp 3.0 and I have an email sending function earlier I was use php mail function. Now I am using AWS ses client. So in that ses client how I can render a template. In cake php email function it was possible. But I don't know how to do it in aws ses client. My code is

 public function testMail() {

if ($this->request->is('post')) {

  $client = SesClient::factory(Configure::read('AWScredentials'));


  $formData = $this->request->data;
  $body = $formData['body'];
  $ToAddresses = $formData['ToAddresses'];
  $request = array();
  $request['Source'] = '[email protected]';
  $request['Destination']['ToAddresses'] = array($ToAddresses);
  $request['Destination']['CcAddresses'] = '[email protected]';
  $request['Message']['Subject']['Data'] = 'Test mail from vcollect ses';
  $request['Message']['Subject']['Charset'] = 'ISO-2022-JP';
  $request['Message']['Body']['Text']['Data'] = $body;
  $request['Message']['Body']['Text']['Charset'] = 'ISO-2022-JP';

  try {
    $result = $client->sendEmail($request);
    $messageId = $result->get('MessageId');
    $this->log("Email sent! Message ID: $messageId", "info");
  } catch (Exception $e) {
    $this->log("The email was not sent. Error message:" . $e->getMessage(), "error");
  }
}   }

Upvotes: 0

Views: 875

Answers (1)

Gransfall
Gransfall

Reputation: 147

You must create a debug sender in app.php, just add it to your EmailTransport array like this, it's allow you to do a fake email without send it

 'EmailTransport' => [
        'default' => [
            'className' => 'Mail',
            // The following keys are used in SMTP transports
            'host' => 'localhost',
            'port' => 25,
            'timeout' => 30,
            'username' => 'user',
            'password' => 'secret',
            'client' => null,
            'tls' => null,
            'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
        ],
        'debug' => [
            'className' => 'Debug',
        ],
    ],

after to generate the email with your your template you can use this function for exemple

public function setTemplate($template,$layout = null,$viewVars = array(),$debug = 0)
    {
        if(empty($layout)) $layout = 'default';

        $Email = new Email();
        $Email->template($template, $layout)
        ->transport('debug') //<---- Allows you to simulate the message without sending it
        ->to(array('[email protected]'=>'toto'))
        ->emailFormat('html');
        ->viewVars($viewVars);


        $Email->send();


        /* Once email is generate, personally i duplicate the object for access to the protected proprety ( it's not very clean but i don't have a greatest solution)
        The idea is to get _htmlMessage in the object */


        $refObj  = new ReflectionObject($Email);
        $refProp1 = $refObj->getProperty('_htmlMessage');
        $refProp1->setAccessible(TRUE);

        if($debug == 1)
        {
            die(debug($refProp1->getValue($Email)));
        }

        return $refProp1->getValue($Email);   // <---- your html code 
    }

Upvotes: 1

Related Questions