Skip to content

Instantly share code, notes, and snippets.

@karloscarweber
Last active July 13, 2017 23:32
Show Gist options
  • Save karloscarweber/6428526 to your computer and use it in GitHub Desktop.
Save karloscarweber/6428526 to your computer and use it in GitHub Desktop.
A CakePHP 2.0 Component That integrates with the Mandrill API. Just enough to get you started, Fill in the gaps.
<?php
// App/controllers/components/mandrill.php
class MandrillComponent extends Object
{
var $components = array('Session', 'RestRequest');
var $settings = array(
'host' => 'smtp.mandrillapp.com',
'port' => '587',
'username' => 'username',
'api_key' => 'randomapikey'
);
/*
A Default $request_array for convenience purposes.
*/
var $request_array = array(
'key' => $this->settings['api_key'],
'message'=> array(
'html'=> '<p>Example HTML content</p>',
'text'=> 'Example text content',
'subject'=> 'example subject',
'from_email'=> 'message.from_email@example.com',
'from_name'=> 'Example Name',
'to' => array(
/*
'0' => array(
'email'=> 'recipient.email@example.com',
'name'=> 'Resident'
),
'1' => array(
'email'=> 'recipient.email@example.com',
'name'=> 'Resident'
)
*/
),
'headers'=> array(
'Reply-To'=> 'message.reply@example.com'
),
'important'=> false,
'track_opens'=> null,
'track_clicks'=> null,
'auto_text'=> null,
'auto_html'=> null,
'inline_css'=> null,
'url_strip_qs'=> null,
'preserve_recipients'=> null,
'view_content_link'=> null,
'bcc_address'=> 'message.bcc_address@example.com',
'tracking_domain'=> null,
'signing_domain'=> null,
'return_path_domain'=> null,
'tags'=> array(
'notification-email'
),
'metadata'=> array(
'website'=> 'www.example.com'
)
),
'async'=> false,
'ip_pool'=> 'Main Pool'
);
/*
When VARS ATTACKS!
@param (string)$recipient, the person you're sending the email to.
@param (string)$sender, the person who's sending the email.
@param (string)$subject, the subject.
@param (string)$html, The HTML email, could be just plain text if you wanted.
@param (string)$html, indexless array of tags, defaults to just notification-email
example request:
Mandrill->send_email('me@test.com', 'admin@test.com', 'Subject'. 'Please provide new Credit Card data.', array('billing', 'expired-card'));
*/
function send_email($recipient = null, $sender = null, $subject = null, $html = null, $tags = array())
{
if(!empty($tags)){
unset($request_array['message']['tags']);
$request_array['message']['tags'] = $tags;
}
// all the Mandrill sendness
$request_array = $this->request_array;
$request_array['message']['from_email'] = $sender;
$recipient = array('email' => $recipient, 'name' => 'Resident');
$request_array['message']['to'][] = $recipient;
debug($request_array['message']['to'][0]['email']);
//$request_array['message']['headers']['Reply-To'] = $html['message']['headers']['Reply-To'];
$request_array['message']['html'] = $html;
$request_array['message']['subject'] = $subject;
$request = new $this->RestRequest('https://mandrillapp.com/api/1.0/messages/send.json', 'POST', $request_array);
$request->execute();
//$responseObject = json_decode($request->getResponseBody());
//return $responseObject;
return $request->getResponseBody();
}
/*
*
* Users Methods
*
* https://mandrillapp.com/api/docs/users.JSON.html
*/
function users_info(){
$data = array(
'key' => $this->settings->api_key
);
// create a new rest requst
$request = $this->_make_request('users/info.json', 'POST', $data);
$request->execute();
return $request->getResponseBody();
}
function users_ping(){
$data = array(
'key' => $this->settings->api_key
);
// create a new rest requst
$request = $this->_make_request('users/ping.json', 'POST', $data);
$request->execute();
return $request->getResponseBody();
}
function users_ping2(){
$data = array(
'key' => $this->settings->api_key
);
// create a new rest requst
$request = $this->_make_request('users/ping2.json', 'POST', $data);
$request->execute();
return $request->getResponseBody();
}
function users_senders(){
$data = array(
'key' => $this->settings->api_key
);
// create a new rest requst
$request = $this->_make_request('users/senders.json', 'POST', $data);
$request->execute();
return $request->getResponseBody();
}
/*
*
* Messages Methods
*
* https://mandrillapp.com/api/docs/messages.JSON.html
*/
function messages_send($request_data = array()){
if(!empty($request_data)){
$default = $this->_return_default_send_email();
$data = array_merge($default, $request_data);
}
// create a new rest requst
$request = $this->_make_request('users/info.json', 'POST', $data);
$request->execute();
return $request->getResponseBody();
}
// Utility methods
// creat Rest Request
function _make_request($method = null, $action = 'POST', $data = array()){
if($method) {
$url = "https://mandrillapp.com/api/1.0/" . $method;
}
if(!empty($data)) {
return new $this->RestRequest($url, $action, $data);
} else {
return false;
}
}
function _return_default_send_email(){
$default = array(
"key"=> $this->settings->api_key,
"message"=> array(
"html"=> "<p>Example HTML content</p>",
"text"=> "Example text content",
"subject"=> "example subject",
"from_email"=> "message.from_email@example.com",
"from_name"=> "Example Name",
"to"=> array(
"email"=> "recipient.email@example.com",
"name"=> "Recipient Name",
"type"=> "to"
),
"headers"=> array(
"Reply-To"=> "message.reply@example.com"
),
"important"=> false,
"track_opens"=> null,
"track_clicks"=> null,
"auto_text"=> null,
"auto_html"=> null,
"inline_css"=> null,
"url_strip_qs"=> null,
"preserve_recipients"=> null,
"view_content_link"=> null,
"bcc_address"=> "message.bcc_address@example.com",
"tracking_domain"=> null,
"signing_domain"=> null,
"return_path_domain"=> null,
"merge"=> true,
"global_merge_vars"=> array(
"name"=> "merge1",
"content"=> "merge1 content"
),
"merge_vars"=> array(
"rcpt"=> "recipient.email@example.com",
"vars"=> array(
"name"=> "merge2",
"content"=> "merge2 content"
)
),
"tags"=> array(
"password-resets"
),
"subaccount"=> "customer-123",
"google_analytics_domains"=> array(
"example.com"
),
"google_analytics_campaign"=> "message.from_email@example.com",
"metadata"=> array(
"website"=> "www.example.com"
),
"recipient_metadata"=> array(
"rcpt"=> "recipient.email@example.com",
"values"=> array(
"user_id"=> 123456
)
),
"attachments"=> array(
"type"=> "text/plain",
"name"=> "myfile.txt",
"content"=> "ZXhhbXBsZSBmaWxl"
),
"images"=> array(
"type"=> "image/png",
"name"=> "IMAGECID",
"content"=> "ZXhhbXBsZSBmaWxl"
)
),
"async"=> false,
"ip_pool"=> "Main Pool",
"send_at"=> "example send_at"
);
return $default;
}
}
?>
<?
// App/controllers/mandrill_controller.php
class MandrillController extends AppController {
var $name = 'Mandrill';
var $components = array( 'Mandrill');
//var $helpers = array();
/*
This sends a rest(
@param $recipient = null, $string
@param $sender = null, $string
@param $subject = null, $string
@param $html = null, $string
*/
function rest()
{
// $this->Mandrill->send_email($recipient = null, $sender = null, $subject = null, $html = null)
$message = "<p>This is the response message hardcore</p>";
$subject = "Your Laundry is ready";
$result = $this->Mandrill->send_email('example_email@gmail.com', 'admin@example.com', $subject, $message);
debug($result);
die;
}
}
?>
<?php
// App/controllers/components/rest_request.php
// shamelessly lifted from: http://www.gen-x-design.com/archives/making-restful-requests-in-php/
// slightly modified
class RestRequestComponent extends Object
{
var $components = array('Session');
protected $url;
protected $verb;
protected $requestBody;
protected $requestLength;
protected $username;
protected $password;
protected $acceptType;
protected $responseBody;
protected $responseInfo;
public function __construct ($url = null, $verb = 'GET', $requestBody = null)
{
$this->url = $url;
$this->verb = $verb;
$this->requestBody = $requestBody;
$this->requestLength = 0;
$this->username = null;
$this->password = null;
$this->acceptType = 'application/json';
$this->responseBody = null;
$this->responseInfo = null;
if ($this->requestBody !== null)
{
$this->buildPostBody();
}
}
public function flush ()
{
$this->requestBody = null;
$this->requestLength = 0;
$this->verb = 'GET';
$this->responseBody = null;
$this->responseInfo = null;
}
public function execute ()
{
$ch = curl_init();
$this->setAuth($ch);
try
{
switch (strtoupper($this->verb))
{
case 'GET':
$this->executeGet($ch);
break;
case 'POST':
$this->executePost($ch);
break;
case 'PUT':
$this->executePut($ch);
break;
case 'DELETE':
$this->executeDelete($ch);
break;
default:
throw new InvalidArgumentException('Current verb (' . $this->verb . ') is an invalid REST verb.');
}
}
catch (InvalidArgumentException $e)
{
curl_close($ch);
throw $e;
}
catch (Exception $e)
{
curl_close($ch);
throw $e;
}
}
public function buildPostBody ($data = null)
{
$data = ($data !== null) ? $data : $this->requestBody;
if (!is_array($data))
{
throw new InvalidArgumentException('Invalid data input for postBody. Array expected');
}
$data = http_build_query($data, '', '&');
$this->requestBody = $data;
}
protected function executeGet ($ch)
{
$this->doExecute($ch);
}
protected function executePost ($ch)
{
if (!is_string($this->requestBody))
{
$this->buildPostBody();
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->requestBody);
curl_setopt($ch, CURLOPT_POST, 1);
$this->doExecute($ch);
}
protected function executePut ($ch)
{
if (!is_string($this->requestBody))
{
$this->buildPostBody();
}
$this->requestLength = strlen($this->requestBody);
$fh = fopen('php://memory', 'rw');
fwrite($fh, $this->requestBody);
rewind($fh);
curl_setopt($ch, CURLOPT_INFILE, $fh);
curl_setopt($ch, CURLOPT_INFILESIZE, $this->requestLength);
curl_setopt($ch, CURLOPT_PUT, true);
$this->doExecute($ch);
fclose($fh);
}
protected function executeDelete ($ch)
{
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
$this->doExecute($ch);
}
protected function doExecute (&$curlHandle)
{
$this->setCurlOpts($curlHandle);
$this->responseBody = curl_exec($curlHandle);
$this->responseInfo = curl_getinfo($curlHandle);
curl_close($curlHandle);
}
protected function setCurlOpts (&$curlHandle)
{
curl_setopt($curlHandle, CURLOPT_TIMEOUT, 10);
curl_setopt($curlHandle, CURLOPT_URL, $this->url);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);
if( isset( $_SESSION['login_token'] ) ){
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array (
'Accept: ' . $this->acceptType,
'X-Pipejump-Auth: ' . $_SESSION['login_token']));
}else {
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array ('Accept: ' . $this->acceptType));
}
}
protected function setAuth (&$curlHandle)
{
if ($this->username !== null && $this->password !== null)
{
curl_setopt($curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($curlHandle, CURLOPT_USERPWD, $this->username . ':' . $this->password);
}
}
public function getAcceptType ()
{
return $this->acceptType;
}
public function setAcceptType ($acceptType)
{
$this->acceptType = $acceptType;
}
public function getPassword ()
{
return $this->password;
}
public function setPassword ($password)
{
$this->password = $password;
}
public function getResponseBody ()
{
return $this->responseBody;
}
public function getResponseInfo ()
{
return $this->responseInfo;
}
public function getUrl ()
{
return $this->url;
}
public function setUrl ($url)
{
$this->url = $url;
}
public function getUsername ()
{
return $this->username;
}
public function setUsername ($username)
{
$this->username = $username;
}
public function getVerb ()
{
return $this->verb;
}
public function setVerb ($verb)
{
$this->verb = $verb;
}
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment