MailGun.php Class
<?php
/**
* 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)
<?php
// ...
'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
<?php
$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. ;)
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.