MailGun.php Class
/** * MailGun * @author VINAY KUMAR SHARMA <vinaykrsharma@live.in> */ class MailGun extends CApplicationComponent { /*************************************************************************** PUBLIC Properties ***************************************************************************/ /** * PHP Curl Options, use PHP Curl constant variable to pass. * e.g: * CURLOPT_HEADER => TRUE * CURLOPT_USERAGENT => 'Bond/0.0.7' * @var array PHP Curl extension options */ public $options = array(); /** * Default Sender Address * if don't found in send() method parameters * * @var string Sender email */ public $defaultFromEmail = 'postmaster@localhost'; /*************************************************************************** PRIVATE and PROTECTED Properties ***************************************************************************/ /** * The path to the directory where the view for getView is stored. Must not * have ending dot. * * @var string */ protected $pathViews = 'application.views.email'; /** * The path to the directory where the layout for getView is stored. Must * not have ending dot. * * @var string */ protected $pathLayouts = 'application.views.email.layouts'; protected $httpHeaders = array( CURLOPT_HTTPHEADER => array( 'Accept: application/json', 'Accept-Language: en-us;q=0.5,en;q=0.3', 'Accept-Charset: utf-8;q=0.7,*;q=0.7', 'Keep-Alive: 300' ), ); /** * @var object curl_init() return value */ private $_ch; private $_curlOptions = array( CURLOPT_URL => "https://api.mailgun.net/v2/YOURDOMAIN.COM/messages", CURLOPT_USERPWD => 'api:key-f82c1b4ebc17cd0afca13a4-21ca935a7', // Set Yours CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POST => true, CURLOPT_USERAGENT => 'Mozilla/5.0 (Linux; Ubuntu) MailGun-Curl-Client.in/1.0b' ); public function __construct() { } public function init() { parent::init(); foreach ($this->options as $key => $value) { $this->_curlOptions[$key] = $value; } if (!isset($this->_curlOptions[CURLOPT_USERPWD]) || empty($this->_curlOptions[CURLOPT_USERPWD])) { throw new CException('MailGun: Option `CURLOPT_USERPWD` is not found in option'); } } /*************************************************************************** GETTERS and SETTERS ***************************************************************************/ /** * Setter * * @param string $value pathLayouts */ public function setPathLayouts($value) { if (!is_string($value) && !preg_match("/[a-z0-9\.]/i", $value)) { throw new CException(Yii::t('MailGun', 'pathLayouts must be a Yii alias path')); } $this->pathLayouts = $value; } /** * Getter * * @return string pathLayouts */ public function getPathLayouts() { return $this->pathLayouts; } /** * Setter * * @param string $value pathViews */ public function setPathViews($value) { if (!is_string($value) && !preg_match("/[a-z0-9\.]/i", $value)) { throw new CException(Yii::t('MailGun', 'pathViews must be a Yii alias path')); } $this->pathViews = $value; } /** * Getter * * @return string pathViews */ public function getPathViews() { return $this->pathViews; } /** * Displays an e-mail in preview mode. * * @param string $view the class * @param array $vars Controller->renderPartial() options * @param string $layout */ public function getView($view, $vars = array(), $layout = null) { $controller = Yii::app()->controller; $body = $controller->renderPartial($this->pathViews . '.' . $view, $vars, true); if ($layout === null) { return $body; } return $controller->renderPartial($this->pathLayouts . '.' . $layout, array('content' => $body), true); } /** * Send Email * * @param string $to Send emails to. comma seperate email address for multiple * receipients * @param string $subject Subject of the Email * @param string $html_body HTML Body of the email * @param array $extras options * <ul> * <li><strong>from:</strong> Sender Email ID</li> * <li><strong>text:</strong> Alternate email in simple text format</li> * <li><strong>tags:</strong> Tag the email with comma seperated value</li> * </ul> */ public function send($to, $subject, $html_body, $extras = array()) { try { $this->_ch = curl_init($this->_curlOptions[CURLOPT_URL]); $fields = array( "from" => $this->defaultFromEmail, ); if (isset($extras['from']) && !empty($extras['from'])) { $fields['from'] = & $extras['from']; } if(empty($fields['from'])) { throw new CHttpException('Send Email address can not be null'); } if (empty($to) || strlen($to) < 5) { throw new CException('Receipients can not be empty'); } $fields['to'] = & $to; $fields['subject'] = & $subject; if (!empty($html_body) && strlen($html_body) >= 5) { $fields['html'] = & $html_body; } if (isset($extras['text']) && !empty($extras['text'])) { $fields['text'] = & $extras['text']; } elseif (isset($fields['html'])) { $fields['text'] = strip_tags($fields['html']); } if (isset($extras['tags']) && !empty($extras['tags'])) { $fields['o:tag'] = & $extras['tags']; } $this->_curlOptions[CURLOPT_POSTFIELDS] = & $fields; curl_setopt_array($this->_ch, $this->_curlOptions); $response_with_headers = curl_exec($this->_ch); curl_close($this->_ch); return $response_with_headers; } catch (Exception $e) { } return NULL; } }
Add to Yii Config
Add as a component in Yii config files either it could be main.php
or console.php
(not tested yet)
// ... 'components' => array( 'mailgun' => array( 'class' => 'application.components.MailGun', 'defaultFromEmail' => 'PM Online <no-reply@example.com>', 'options' => array( CURLOPT_URL => "https://api.mailgun.net/v2/<YOURDOMAIN.COM>/messages", CURLOPT_USERPWD => 'api:key-f82c1b4ebc17cd0afca13a4-21ca935a7', ), 'pathLayouts' => 'application.views.layouts.emailer', 'pathViews' => 'application.views.partials', ), // ... ) // ...
Now Start sending emails
Here is an test email send
$r = Yii::app()->mailgun->send($model->email, 'Hello', "<p>Testing from Main App, for some <small style=\"color: green;\">awesomness</span>!</p>"); if($r) { $r = json_decode($r); }
In this example I've changed defaultFromEmail and CURLOPT_USERPWD. So find your own and replace. ;)