/application/libraries/Postmark.php
PHP | 452 lines | 254 code | 76 blank | 122 comment | 48 complexity | 071034388b6d3313f29d85271f34e687 MD5 | raw file
- <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
- /**
- * Postmark Email Library
- *
- * Permits email to be sent using Postmarkapp.com's Servers
- *
- * @category Libraries
- * @author Based on work by János Rusiczki & Markus Hedlund’s.
- * @modified Heavily Modified by Zack Kitzmiller
- * @link http://www.github.com/zackkitzmiller/postmark-codeigniter
- */
- class Postmark {
- //private
- var $CI;
- var $api_key = '';
- var $validation = FALSE;
- var $strip_html = FALSE;
- var $develop = FALSE;
-
- var $from_name;
- var $from_address;
-
- var $_reply_to_name;
- var $_reply_to_address;
-
- var $_to_name;
- var $_to_address;
-
- var $_cc_name;
- var $_cc_address;
-
- var $_subject;
- var $_message_plain;
- var $_message_html;
- var $_tag;
-
- /**
- * Constructor
- *
- * @access public
- * @param array initialization parameters
- */
- function Postmark($params = array())
- {
- $this->CI =& get_instance();
-
- if (count($params) > 0)
- {
- $this->initialize($params);
- }
-
- if ($this->develop == TRUE)
- {
- $this->api_key = 'POSTMARK_API_TEST';
- }
-
- log_message('debug', 'Postmark Class Initialized');
-
- }
- // --------------------------------------------------------------------
- /**
- * Initialize Preferences
- *
- * @access public
- * @param array initialization parameters
- * @return void
- */
- function initialize($params)
- {
- $this->clear();
- if (count($params) > 0)
- {
- foreach ($params as $key => $value)
- {
- if (isset($this->$key))
- {
- $this->$key = $value;
- }
- }
- }
- }
- // --------------------------------------------------------------------
- /**
- * Clear the Email Data
- *
- * @access public
- * @return void
- */
- function clear() {
-
- $this->from_name = '';
- $this->from_address = '';
-
- $this->_to_name = '';
- $this->_to_address = '';
-
- $this->_cc_name = '';
- $this->_cc_address = '';
-
- $this->_subject = '';
- $this->_message_plain = '';
- $this->_message_html = '';
-
- $this->_tag = '';
-
- }
-
- // --------------------------------------------------------------------
- /**
- * Set Email FROM address
- *
- * This could also be set in the config file
- *
- * TODO:
- * Validate Email Addresses ala CodeIgniter's Email Class
- *
- * @access public
- * @return void
- */
- function from($address, $name = null)
- {
-
- if ( ! $this->validation == TRUE)
- {
- $this->from_address = $address;
- $this->from_name = $name;
- }
- else
- {
- if ($this->_validate_email($address))
- {
- $this->from_address = $address;
- $this->from_name = $name;
- }
- else
- {
- show_error('You have entered an invalid sender address.');
- }
- }
- }
-
- // --------------------------------------------------------------------
- /**
- * Set Email TO address
- *
- * TODO:
- * Validate Email Addresses ala CodeIgniter's Email Class
- *
- * @access public
- * @return void
- */
- function to($address, $name = null)
- {
-
- if ( ! $this->validation == TRUE)
- {
- $this->_to_address = $address;
- $this->_to_name = $name;
- }
- else
- {
- if ($this->_validate_email($address))
- {
- $this->_to_address = $address;
- $this->_to_name = $name;
- }
- else
- {
- show_error('You have entered an invalid recipient address.');
- }
- }
- }
-
- // --------------------------------------------------------------------
- /**
- * Set Email ReplyTo address
- *
- * TODO:
- * Validate Email Addresses ala CodeIgniter's Email Class
- *
- * @access public
- * @return void
- */
- function reply_to($address, $name = null)
- {
-
- if ( ! $this->validation == TRUE)
- {
- $this->_reply_to_address = $address;
- $this->_reply_to_name = $name;
- }
- else
- {
- if ($this->_validate_email($address))
- {
- $this->_reply_to_address = $address;
- $this->_reply_to_name = $name;
- }
- else
- {
- show_error('You have entered an invalid reply to address.');
- }
- }
- }
- // --------------------------------------------------------------------
- /**
- * Set Email CC address
- *
- * TODO:
- * Validate Email Addresses ala CodeIgniter's Email Class
- *
- * @access public
- * @return void
- */
- function cc($address, $name = null)
- {
-
- if ( ! $this->validation == TRUE)
- {
- $this->_cc_address = $address;
- $this->_cc_name = $name;
- }
- else
- {
- if ($this->_validate_email($address))
- {
- $this->_cc_address = $address;
- $this->_cc_name = $name;
- }
- else
- {
- show_error('You have entered an invalid recipient address.');
- }
- }
- }
-
- // --------------------------------------------------------------------
- /**
- * Set Email Subject
- *
- * @access public
- * @return void
- */
- function subject($subject)
- {
- $this->_subject = $subject;
- }
-
- // --------------------------------------------------------------------
- /**
- * Set Tag
- *
- * @access public
- * @return void
- */
- function tag($tag)
- {
- $this->_tag = $tag;
- }
-
- // --------------------------------------------------------------------
- /**
- * Set Email Message in Plain Text
- *
- * @access public
- * @return void
- */
- function message_plain($message)
- {
- if ( ! $this->strip_html )
- {
- $this->_message_plain = $message;
- }
- else
- {
- $this->_message_plain = $this->_strip_html($message);
- }
- }
- // --------------------------------------------------------------------
- /**
- * Set Email Message in HTML
- *
- * @access public
- * @return void
- */
- function message_html($message)
- {
- $this->_message_html = $message;
- }
- // --------------------------------------------------------------------
- /**
- * Private Function to prepare and send email
- */
- function _prepare_data()
- {
- $data = array();
- $data['Subject'] = $this->_subject;
-
- $data['From'] = is_null($this->from_name) ? $this->from_address : "{$this->from_name} <{$this->from_address}>";
- $data['To'] = is_null($this->_to_name) ? $this->_to_address : "{$this->_to_name} <{$this->_to_address}>";
-
- if (!is_null($this->_cc_address) && ($this->_cc_address != '')) {
- $data['Cc'] = is_null($this->_cc_name) ? $this->_cc_address : "{$this->_cc_name} <{$this->_cc_address}>";
- }
- if (!is_null($this->_reply_to_address) && ($this->_reply_to_address != '')) {
- $data['ReplyTo'] = is_null($this->_reply_to_name) ? $this->_reply_to_address : "{$this->_reply_to_name} <{$this->_reply_to_address}>";
- }
-
- if (!is_null($this->_tag) && ($this->_tag != '')) {
- $data['tag'] = $this->_tag;
- }
-
- if (!is_null($this->_message_html)) {
- $data['HtmlBody'] = $this->_message_html;
- }
-
- if (!is_null($this->_message_plain)) {
- $data['TextBody'] = $this->_message_plain;
- }
-
- return $data;
- }
-
- function send($from_address = null, $from_name = null, $to_address = null, $to_name = null, $subject = null, $message_plain = null, $message_html = null)
- {
-
- if (!function_exists('curl_init'))
- {
-
- if(function_exists('log_message'))
- {
- log_message('error', 'Postmark - PHP was not built with cURL enabled. Rebuild PHP with --with-curl to use cURL.');
- }
-
- return false;
-
- }
-
- if (!is_null($from_address)) $this->from($from_address, $from_name);
- if (!is_null($to_address)) $this->to($to_address, $to_name);
- if (!is_null($subject)) $this->subject($subject);
- if (!is_null($message_plain)) $this->message_plain($message_plain);
- if (!is_null($message_html)) $this->message_html($message_html);
-
- if (is_null($this->api_key)) {
- show_error("Postmark API key is not set!");
- }
-
- if (is_null($this->from_address)) {
- show_error("From address is not set!");
- }
-
- if (is_null($this->_to_address)) {
- show_error("To address is not set!");
- }
-
- if (is_null($this->_subject)) {
- show_error("Subject is not set!");
- }
-
- if (is_null($this->_message_plain) && is_null($this->_message_html)) {
- show_error("Please either set plain message, HTML message or both!");
- }
-
- $encoded_data = json_encode($this->_prepare_data());
-
- $headers = array(
- 'Accept: application/json',
- 'Content-Type: application/json',
- 'X-Postmark-Server-Token: ' . $this->api_key
- );
-
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, 'http://api.postmarkapp.com/email');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
- curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded_data);
- curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
- $return = curl_exec($ch);
- log_message('debug', 'POSTMARK JSON: ' . $encoded_data . "\nHeaders: \n\t" . implode("\n\t", $headers) . "\nReturn:\n$return");
-
- if (curl_error($ch) != '') {
- show_error(curl_error($ch));
- }
-
- $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- log_message('debug', 'POSTMARK http code:' . $httpCode);
-
- if (intval($httpCode / 100) != 2) {
- $message = json_decode($return)->Message;
- show_error('Error while mailing. Postmark returned HTTP code ' . $httpCode . ' with message "'.$message.'"');
- }
- }
-
- // --------------------------------------------------------------------
- /**
- * Email Validation
- *
- * @access public
- * @param string
- * @return bool
- */
- function _validate_email($address)
- {
- $addresses = explode(',', $address);
-
- foreach($addresses as $k => $v) {
- if ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", trim($v))) {
- return FALSE;
- }
- }
-
- return TRUE;
- }
- // --------------------------------------------------------------------
- /**
- * Strip Html
- *
- * @access public
- * @param string
- * @return string
- */
- function _strip_html($message)
- {
- $message = preg_replace('/\<br(\s*)?\/?\>/i', "\n", $message);
- return strip_tags($message);
- }
- }