diff --git a/app/email_queue/app_config.php b/app/email_queue/app_config.php
new file mode 100644
index 0000000000..05ea72513e
--- /dev/null
+++ b/app/email_queue/app_config.php
@@ -0,0 +1,216 @@
+
diff --git a/app/email_queue/app_languages.php b/app/email_queue/app_languages.php
new file mode 100644
index 0000000000..fa0e6ba9db
--- /dev/null
+++ b/app/email_queue/app_languages.php
@@ -0,0 +1,504 @@
+
\ No newline at end of file
diff --git a/app/email_queue/app_menu.php b/app/email_queue/app_menu.php
new file mode 100644
index 0000000000..281e63b3ab
--- /dev/null
+++ b/app/email_queue/app_menu.php
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/app/email_queue/email_queue.php b/app/email_queue/email_queue.php
new file mode 100644
index 0000000000..477f37c1a1
--- /dev/null
+++ b/app/email_queue/email_queue.php
@@ -0,0 +1,289 @@
+get();
+
+//get the http post data
+ if (is_array($_POST['email_queue'])) {
+ $action = $_POST['action'];
+ $search = $_POST['search'];
+ $email_queue = $_POST['email_queue'];
+ }
+
+//process the http post data by action
+ if ($action != '' && is_array($email_queue) && @sizeof($email_queue) != 0) {
+
+ //validate the token
+ $token = new token;
+ if (!$token->validate($_SERVER['PHP_SELF'])) {
+ message::add($text['message-invalid_token'],'negative');
+ header('Location: email_queue.php');
+ exit;
+ }
+
+ //prepare the array
+ foreach($email_queue as $row) {
+ //email class queue uuid
+ $array[$x]['checked'] = $row['checked'];
+ $array[$x]['uuid'] = $row['email_queue_uuid'];
+
+ // database class uuid
+ //$array['email_queue'][$x]['checked'] = $row['checked'];
+ //$array['email_queue'][$x]['email_queue_uuid'] = $row['email_queue_uuid'];
+ $x++;
+ }
+
+ //prepare the database object
+ $database = new database;
+ $database->app_name = 'email_queue';
+ $database->app_uuid = '5befdf60-a242-445f-91b3-2e9ee3e0ddf7';
+
+ //send the array to the database class
+ switch ($action) {
+ case 'copy':
+ //if (permission_exists('email_queue_add')) {
+ // $database->copy($array);
+ //}
+ break;
+ case 'toggle':
+ //if (permission_exists('email_queue_edit')) {
+ // $database->toggle($array);
+ //}
+ break;
+ case 'delete':
+ if (permission_exists('email_queue_delete')) {
+ $obj = new email_queue;
+ $obj->delete($array);
+ //$database->delete($array);
+ }
+ break;
+ }
+
+ //redirect the user
+ header('Location: email_queue.php'.($search != '' ? '?search='.urlencode($search) : null));
+ exit;
+ }
+
+//get order and order by
+ $order_by = $_GET["order_by"];
+ $order = $_GET["order"];
+
+//add the search
+ if (isset($_GET["search"])) {
+ $search = strtolower($_GET["search"]);
+ }
+
+//get the count
+ $sql = "select count(email_queue_uuid) ";
+ $sql .= "from v_email_queue ";
+ if (isset($search)) {
+ $sql .= "where (";
+ $sql .= " lower(email_from) like :search ";
+ $sql .= " or lower(email_to) like :search ";
+ $sql .= " or lower(email_subject) like :search ";
+ $sql .= " or lower(email_body) like :search ";
+ $sql .= " or lower(email_status) like :search ";
+ $sql .= ") ";
+ $parameters['search'] = '%'.$search.'%';
+ }
+ //else {
+ // $sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
+ // $parameters['domain_uuid'] = $domain_uuid;
+ //}
+ $database = new database;
+ $num_rows = $database->select($sql, $parameters, 'column');
+ unset($sql, $parameters);
+
+//prepare to page the results
+ $rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
+ $param = $search ? "&search=".$search : null;
+ $param = ($_GET['show'] == 'all' && permission_exists('email_queue_all')) ? "&show=all" : null;
+ $page = is_numeric($_GET['page']) ? $_GET['page'] : 0;
+ list($paging_controls, $rows_per_page) = paging($num_rows, $param, $rows_per_page);
+ list($paging_controls_mini, $rows_per_page) = paging($num_rows, $param, $rows_per_page, true);
+ $offset = $rows_per_page * $page;
+
+//get the list
+ $sql = "select ";
+ $sql .= "email_date, ";
+ $sql .= "email_queue_uuid, ";
+ $sql .= "hostname, ";
+ $sql .= "email_from, ";
+ $sql .= "email_to, ";
+ $sql .= "email_subject, ";
+ $sql .= "email_body, ";
+ //$sql .= "email_action_before, ";
+ $sql .= "email_action_after, ";
+ $sql .= "email_status, ";
+ $sql .= "email_retry_count ";
+ $sql .= "from v_email_queue ";
+ if (isset($_GET["search"])) {
+ $sql .= "where (";
+ $sql .= " lower(email_from) like :search ";
+ $sql .= " or lower(email_to) like :search ";
+ $sql .= " or lower(email_subject) like :search ";
+ $sql .= " or lower(email_body) like :search ";
+ $sql .= " or lower(email_status) like :search ";
+ $sql .= ") ";
+ $parameters['search'] = '%'.$search.'%';
+ }
+ $sql .= order_by($order_by, $order, 'email_date', 'desc');
+ $sql .= limit_offset($rows_per_page, $offset);
+ $database = new database;
+ $email_queue = $database->select($sql, $parameters, 'all');
+ unset($sql, $parameters);
+
+//create token
+ $object = new token;
+ $token = $object->create($_SERVER['PHP_SELF']);
+
+//additional includes
+ $document['title'] = $text['title-email_queue'];
+ require_once "resources/header.php";
+
+//show the content
+ echo "
\n";
+ echo "
".$text['title-email_queue']." (".$num_rows.")
\n";
+ echo "
\n";
+ //if (permission_exists('email_queue_add')) {
+ // echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$_SESSION['theme']['button_icon_add'],'id'=>'btn_add','name'=>'btn_add','link'=>'email_queue_edit.php']);
+ //}
+ //if (permission_exists('email_queue_add') && $email_queue) {
+ // echo button::create(['type'=>'button','label'=>$text['button-copy'],'icon'=>$_SESSION['theme']['button_icon_copy'],'id'=>'btn_copy','name'=>'btn_copy','style'=>'display:none;','onclick'=>"modal_open('modal-copy','btn_copy');"]);
+ //}
+ //if (permission_exists('email_queue_edit') && $email_queue) {
+ // echo button::create(['type'=>'button','label'=>$text['button-toggle'],'icon'=>$_SESSION['theme']['button_icon_toggle'],'id'=>'btn_toggle','name'=>'btn_toggle','style'=>'display:none;','onclick'=>"modal_open('modal-toggle','btn_toggle');"]);
+ //}
+ if (permission_exists('email_queue_delete') && $email_queue) {
+ echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'id'=>'btn_delete','name'=>'btn_delete','style'=>'display:none;','onclick'=>"modal_open('modal-delete','btn_delete');"]);
+ }
+ echo "\n";
+ echo "
\n";
+ echo "
\n";
+ echo "
\n";
+
+ if (permission_exists('email_queue_add') && $email_queue) {
+ echo modal::create(['id'=>'modal-copy','type'=>'copy','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_copy','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('copy'); list_form_submit('form_list');"])]);
+ }
+ if (permission_exists('email_queue_edit') && $email_queue) {
+ echo modal::create(['id'=>'modal-toggle','type'=>'toggle','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_toggle','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('toggle'); list_form_submit('form_list');"])]);
+ }
+ if (permission_exists('email_queue_delete') && $email_queue) {
+ echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_delete','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('delete'); list_form_submit('form_list');"])]);
+ }
+
+ echo "\n";
+
+//include the footer
+ require_once "resources/footer.php";
+
+?>
diff --git a/app/email_queue/email_queue_delete.php b/app/email_queue/email_queue_delete.php
new file mode 100644
index 0000000000..251321f6ca
--- /dev/null
+++ b/app/email_queue/email_queue_delete.php
@@ -0,0 +1,41 @@
+get();
+
+//delete the message
+ message::add($text['message-delete']);
+
+//delete the data
+ if (isset($_GET["id"]) && is_uuid($_GET["id"])) {
+
+ //get the id
+ $id = $_GET["id"];
+
+ //delete the data
+ $array['email_queue'][]['email_queue_uuid'] = $id;
+ $database = new database;
+ $database->delete($array);
+ unset($array);
+
+ //redirect the user
+ header('Location: email_queues.php');
+ }
+
+
+?>
\ No newline at end of file
diff --git a/app/email_queue/email_queue_edit.php b/app/email_queue/email_queue_edit.php
new file mode 100644
index 0000000000..a0d386eb33
--- /dev/null
+++ b/app/email_queue/email_queue_edit.php
@@ -0,0 +1,322 @@
+get();
+
+//action add or update
+ if (is_uuid($_REQUEST["id"])) {
+ $action = "update";
+ $email_queue_uuid = $_REQUEST["id"];
+ $id = $_REQUEST["id"];
+ }
+ else {
+ $action = "add";
+ }
+
+//get http post variables and set them to php variables
+ if (is_array($_POST)) {
+ $email_date = $_POST["email_date"];
+ $email_from = $_POST["email_from"];
+ $email_to = $_POST["email_to"];
+ $email_subject = $_POST["email_subject"];
+ $email_body = $_POST["email_body"];
+ $email_status = $_POST["email_status"];
+ $email_retry_count = $_POST["email_retry_count"];
+ //$email_action_before = $_POST["email_action_before"];
+ $email_action_after = $_POST["email_action_after"];
+ }
+
+//process the user data and save it to the database
+ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) {
+
+ //validate the token
+ $token = new token;
+ if (!$token->validate($_SERVER['PHP_SELF'])) {
+ message::add($text['message-invalid_token'],'negative');
+ header('Location: email_queue.php');
+ exit;
+ }
+
+ //process the http post data by submitted action
+ if ($_POST['action'] != '' && strlen($_POST['action']) > 0) {
+
+ //prepare the array(s)
+ //send the array to the database class
+ switch ($_POST['action']) {
+ case 'copy':
+ if (permission_exists('email_queue_add')) {
+ $obj = new database;
+ $obj->copy($array);
+ }
+ break;
+ case 'delete':
+ if (permission_exists('email_queue_delete')) {
+ $obj = new database;
+ $obj->delete($array);
+ }
+ break;
+ case 'toggle':
+ if (permission_exists('email_queue_update')) {
+ $obj = new database;
+ $obj->toggle($array);
+ }
+ break;
+ }
+
+ //redirect the user
+ if (in_array($_POST['action'], array('copy', 'delete', 'toggle'))) {
+ header('Location: email_queue_edit.php?id='.$id);
+ exit;
+ }
+ }
+
+ //check for all required data
+ $msg = '';
+ //if (strlen($email_date) == 0) { $msg .= $text['message-required']." ".$text['label-email_date']."
\n"; }
+ //if (strlen($email_from) == 0) { $msg .= $text['message-required']." ".$text['label-email_from']."
\n"; }
+ //if (strlen($email_to) == 0) { $msg .= $text['message-required']." ".$text['label-email_to']."
\n"; }
+ //if (strlen($email_subject) == 0) { $msg .= $text['message-required']." ".$text['label-email_subject']."
\n"; }
+ //if (strlen($email_body) == 0) { $msg .= $text['message-required']." ".$text['label-email_body']."
\n"; }
+ //if (strlen($email_status) == 0) { $msg .= $text['message-required']." ".$text['label-email_status']."
\n"; }
+ if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) {
+ require_once "resources/header.php";
+ require_once "resources/persist_form_var.php";
+ echo "\n";
+ echo "
\n";
+ echo $msg." ";
+ echo " |
\n";
+ persistformvar($_POST);
+ echo "
\n";
+ require_once "resources/footer.php";
+ return;
+ }
+
+ //add the email_queue_uuid
+ if (!is_uuid($_POST["email_queue_uuid"])) {
+ $email_queue_uuid = uuid();
+ }
+
+ //prepare the array
+ $array['email_queue'][0]['email_queue_uuid'] = $email_queue_uuid;
+ $array['email_queue'][0]['domain_uuid'] = $_SESSION['domain_uuid'];
+ $array['email_queue'][0]['email_date'] = $email_date;
+ $array['email_queue'][0]['email_from'] = $email_from;
+ $array['email_queue'][0]['email_to'] = $email_to;
+ $array['email_queue'][0]['email_subject'] = $email_subject;
+ $array['email_queue'][0]['email_body'] = $email_body;
+ $array['email_queue'][0]['email_status'] = $email_status;
+ $array['email_queue'][0]['email_retry_count'] = $email_retry_count;
+ //$array['email_queue'][0]['email_action_before'] = $email_action_before;
+ $array['email_queue'][0]['email_action_after'] = $email_action_after;
+
+ //save the data
+ $database = new database;
+ $database->app_name = 'email queue';
+ $database->app_uuid = '5befdf60-a242-445f-91b3-2e9ee3e0ddf7';
+ $database->save($array);
+
+ //redirect the user
+ if (isset($action)) {
+ if ($action == "add") {
+ $_SESSION["message"] = $text['message-add'];
+ }
+ if ($action == "update") {
+ $_SESSION["message"] = $text['message-update'];
+ }
+ //header('Location: email_queue.php');
+ header('Location: email_queue_edit.php?id='.urlencode($email_queue_uuid));
+ return;
+ }
+ }
+
+//pre-populate the form
+ if (is_array($_GET) && $_POST["persistformvar"] != "true") {
+ $sql = "select * from v_email_queue ";
+ $sql .= "where email_queue_uuid = :email_queue_uuid ";
+ //$sql .= "and domain_uuid = :domain_uuid ";
+ //$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
+ $parameters['email_queue_uuid'] = $email_queue_uuid;
+ $database = new database;
+ $row = $database->select($sql, $parameters, 'row');
+ if (is_array($row) && @sizeof($row) != 0) {
+ $email_date = $row["email_date"];
+ $email_from = $row["email_from"];
+ $email_to = $row["email_to"];
+ $email_subject = $row["email_subject"];
+ $email_body = $row["email_body"];
+ $email_status = $row["email_status"];
+ $email_retry_count = $row["email_retry_count"];
+ //$email_action_before = $row["email_action_before"];
+ $email_action_after = $row["email_action_after"];
+ }
+ unset($sql, $parameters, $row);
+ }
+
+//create token
+ $object = new token;
+ $token = $object->create($_SERVER['PHP_SELF']);
+
+//show the header
+ $document['title'] = $text['title-email_queue'];
+ require_once "resources/header.php";
+
+//show the content
+ echo "";
+
+//include the footer
+ require_once "resources/footer.php";
+
+?>
\ No newline at end of file
diff --git a/app/email_queue/resources/classes/email_queue.php b/app/email_queue/resources/classes/email_queue.php
new file mode 100644
index 0000000000..281bfd9ee0
--- /dev/null
+++ b/app/email_queue/resources/classes/email_queue.php
@@ -0,0 +1,240 @@
+app_name = 'email_queue';
+ $this->app_uuid = '5befdf60-a242-445f-91b3-2e9ee3e0ddf7';
+ $this->name = 'email_queue';
+ $this->table = 'email_queue';
+ $this->toggle_field = '';
+ $this->toggle_values = ['true','false'];
+ $this->location = 'email_queue.php';
+ }
+
+ /**
+ * called when there are no references to a particular object
+ * unset the variables used in the class
+ */
+ public function __destruct() {
+ foreach ($this as $key => $value) {
+ unset($this->$key);
+ }
+ }
+
+ /**
+ * delete rows from the database
+ */
+ public function delete($records) {
+ if (permission_exists($this->name.'_delete')) {
+
+ //add multi-lingual support
+ $language = new text;
+ $text = $language->get();
+
+ //validate the token
+ $token = new token;
+ if (!$token->validate($_SERVER['PHP_SELF'])) {
+ message::add($text['message-invalid_token'],'negative');
+ header('Location: '.$this->location);
+ exit;
+ }
+
+ //delete multiple records
+ if (is_array($records) && @sizeof($records) != 0) {
+ //build the delete array
+ $x = 0;
+ foreach ($records as $record) {
+ //add to the array
+ if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
+ $array[$this->table][$x][$this->name.'_uuid'] = $record['uuid'];
+ $array['email_queue_attachments'][$x][$this->name.'_uuid'] = $record['uuid'];
+ //$array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
+ }
+
+ //increment the id
+ $x++;
+ }
+
+ //delete the checked rows
+ if (is_array($array) && @sizeof($array) != 0) {
+ //execute delete
+ $database = new database;
+ $database->app_name = $this->app_name;
+ $database->app_uuid = $this->app_uuid;
+ $database->delete($array);
+ unset($array);
+
+ //set message
+ message::add($text['message-delete']);
+ }
+ unset($records);
+ }
+ }
+ }
+
+ /**
+ * toggle a field between two values
+ */
+ public function toggle($records) {
+ if (permission_exists($this->name.'_edit')) {
+
+ //add multi-lingual support
+ $language = new text;
+ $text = $language->get();
+
+ //validate the token
+ $token = new token;
+ if (!$token->validate($_SERVER['PHP_SELF'])) {
+ message::add($text['message-invalid_token'],'negative');
+ header('Location: '.$this->location);
+ exit;
+ }
+
+ //toggle the checked records
+ if (is_array($records) && @sizeof($records) != 0) {
+ //get current toggle state
+ foreach($records as $record) {
+ if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
+ $uuids[] = "'".$record['uuid']."'";
+ }
+ }
+ if (is_array($uuids) && @sizeof($uuids) != 0) {
+ $sql = "select ".$this->name."_uuid as uuid, ".$this->toggle_field." as toggle from v_".$this->table." ";
+ $sql .= "where ".$this->name."_uuid in (".implode(', ', $uuids).") ";
+ $sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
+ $parameters['domain_uuid'] = $_SESSION['domain_uuid'];
+ $database = new database;
+ $rows = $database->select($sql, $parameters, 'all');
+ if (is_array($rows) && @sizeof($rows) != 0) {
+ foreach ($rows as $row) {
+ $states[$row['uuid']] = $row['toggle'];
+ }
+ }
+ unset($sql, $parameters, $rows, $row);
+ }
+
+ //build update array
+ $x = 0;
+ foreach($states as $uuid => $state) {
+ //create the array
+ $array[$this->table][$x][$this->name.'_uuid'] = $uuid;
+ $array[$this->table][$x][$this->toggle_field] = $state == $this->toggle_values[0] ? $this->toggle_values[1] : $this->toggle_values[0];
+
+ //increment the id
+ $x++;
+ }
+
+ //save the changes
+ if (is_array($array) && @sizeof($array) != 0) {
+ //save the array
+ $database = new database;
+ $database->app_name = $this->app_name;
+ $database->app_uuid = $this->app_uuid;
+ $database->save($array);
+ unset($array);
+
+ //set message
+ message::add($text['message-toggle']);
+ }
+ unset($records, $states);
+ }
+ }
+ }
+
+ /**
+ * copy rows from the database
+ */
+ public function copy($records) {
+ if (permission_exists($this->name.'_add')) {
+
+ //add multi-lingual support
+ $language = new text;
+ $text = $language->get();
+
+ //validate the token
+ $token = new token;
+ if (!$token->validate($_SERVER['PHP_SELF'])) {
+ message::add($text['message-invalid_token'],'negative');
+ header('Location: '.$this->location);
+ exit;
+ }
+
+ //copy the checked records
+ if (is_array($records) && @sizeof($records) != 0) {
+
+ //get checked records
+ foreach($records as $record) {
+ if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
+ $uuids[] = "'".$record['uuid']."'";
+ }
+ }
+
+ //create the array from existing data
+ if (is_array($uuids) && @sizeof($uuids) != 0) {
+ $sql = "select * from v_".$this->table." ";
+ $sql .= "where ".$this->name."_uuid in (".implode(', ', $uuids).") ";
+ $sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
+ $parameters['domain_uuid'] = $_SESSION['domain_uuid'];
+ $database = new database;
+ $rows = $database->select($sql, $parameters, 'all');
+ if (is_array($rows) && @sizeof($rows) != 0) {
+ $x = 0;
+ foreach ($rows as $row) {
+ //copy data
+ $array[$this->table][$x] = $row;
+
+ //add copy to the description
+ $array[$this->table][$x][$this->name.'_uuid'] = uuid();
+
+ //increment the id
+ $x++;
+ }
+ }
+ unset($sql, $parameters, $rows, $row);
+ }
+
+ //save the changes and set the message
+ if (is_array($array) && @sizeof($array) != 0) {
+ //save the array
+ $database = new database;
+ $database->app_name = $this->app_name;
+ $database->app_uuid = $this->app_uuid;
+ $database->save($array);
+ unset($array);
+
+ //set message
+ message::add($text['message-copy']);
+ }
+ unset($records);
+ }
+ }
+ }
+
+ }
+}
+
+?>
diff --git a/app/email_queue/resources/functions/transcribe.php b/app/email_queue/resources/functions/transcribe.php
new file mode 100644
index 0000000000..019e401ff9
--- /dev/null
+++ b/app/email_queue/resources/functions/transcribe.php
@@ -0,0 +1,229 @@
+
diff --git a/app/email_queue/resources/jobs/email_queue.php b/app/email_queue/resources/jobs/email_queue.php
new file mode 100644
index 0000000000..2dace7f8ca
--- /dev/null
+++ b/app/email_queue/resources/jobs/email_queue.php
@@ -0,0 +1,198 @@
+select($sql, $parameters, 'all');
+ unset($parameters);
+
+ //process the messages
+ if (is_array($email_queue) && @sizeof($email_queue) != 0) {
+ foreach($email_queue as $row) {
+ $command = "/usr/bin/php /var/www/fusionpbx/app/email_queue/resources/job/email_send.php ";
+ $command .= "'action=send&email_queue_uuid=".$row["email_queue_uuid"]."&hostname=".$hostname."'";
+ if (isset($debug)) {
+ //run process inline to see debug info
+ echo $command."\n";
+ $result = system($command);
+ echo $result."\n";
+ }
+ else {
+ //starts process rapidly doesn't wait for previous process to finish (used for production)
+ $handle = popen($command." > /dev/null &", 'r');
+ echo "'$handle'; " . gettype($handle) . "\n";
+ $read = fread($handle, 2096);
+ echo $read;
+ pclose($handle);
+ }
+ }
+ }
+
+//remove the old pid file
+ if (file_exists($file)) {
+ unlink($pid_file);
+ }
+
+//save output to
+ //$fp = fopen(sys_get_temp_dir()."/mailer-app.log", "a");
+
+//prepare the output buffers
+ //ob_end_clean();
+ //ob_start();
+
+//message divider for log file
+ //echo "\n\n=============================================================================================================================================\n\n";
+
+//get and save the output from the buffer
+ //$content = ob_get_contents(); //get the output from the buffer
+ //$content = str_replace("
", "", $content);
+
+ //ob_end_clean(); //clean the buffer
+
+ //fwrite($fp, $content);
+ //fclose($fp);
+
+//notes
+ //echo __line__."\n";
+ // if not keeping the email then need to delete it after the voicemail is emailed
+
+//how to use this feature
+ // cd /var/www/fusionpbx; /usr/bin/php /var/www/fusionpbx/app/email_queue/resources/send.php
+
+?>
diff --git a/app/email_queue/resources/jobs/email_send.php b/app/email_queue/resources/jobs/email_send.php
new file mode 100644
index 0000000000..4759f6cb3d
--- /dev/null
+++ b/app/email_queue/resources/jobs/email_send.php
@@ -0,0 +1,637 @@
+]*>/', ' ', $string);
+
+ //remove control characters
+ $string = str_replace("\r", '', $string); // --- replace with empty space
+ $string = str_replace("\n", ' ', $string); // --- replace with space
+ $string = str_replace("\t", ' ', $string); // --- replace with space
+
+ //remove multiple spaces
+ $string = trim(preg_replace('/ {2,}/', ' ', $string));
+ return $string;
+ }
+ }
+
+//includes
+ include_once "resources/phpmailer/class.phpmailer.php";
+ include_once "resources/phpmailer/class.smtp.php";
+
+//set the GET array
+ if (!empty($argv[1])) {
+ parse_str($argv[1], $_GET);
+ }
+
+//get the primary key
+ $email_queue_uuid = $_GET['email_queue_uuid'];
+ $hostname = $_GET['hostname'];
+
+//get the email details to send
+ $sql = "select * from v_email_queue ";
+ $sql .= "where email_queue_uuid = :email_queue_uuid ";
+ $parameters['email_queue_uuid'] = $email_queue_uuid;
+ $database = new database;
+ $row = $database->select($sql, $parameters, 'row');
+ if (is_array($row)) {
+ $domain_uuid = $row["domain_uuid"];
+ $email_date = $row["email_date"];
+ $email_from = $row["email_from"];
+ $email_to = $row["email_to"];
+ $email_subject = $row["email_subject"];
+ $email_body = $row["email_body"];
+ $email_status = $row["email_status"];
+ $email_retry_count = $row["email_retry_count"];
+ $email_uuid = $row["email_uuid"];
+ //$email_action_before = $row["email_action_before"];
+ $email_action_after = $row["email_action_after"];
+ }
+ unset($parameters);
+
+//get the call center settings
+ $retry_limit = $_SESSION['email_queue']['retry_limit']['numeric'];
+ //$retry_interval = $_SESSION['email_queue']['retry_interval']['numeric'];
+
+//set defaults
+ if (strlen($email_retry_count) == 0) {
+ $email_retry_count = 0;
+ }
+
+//create the email object
+/*
+ $mail = new PHPMailer();
+ if (isset($_SESSION['email']['method'])) {
+ switch ($_SESSION['email']['method']['text']) {
+ case 'sendmail': $mail->IsSendmail(); break;
+ case 'qmail': $mail->IsQmail(); break;
+ case 'mail': $mail->IsMail(); break;
+ default: $mail->IsSMTP(); break;
+ }
+ }
+ else {
+ $mail->IsSMTP();
+ }
+*/
+
+//load default smtp settings
+/*
+ if ($_SESSION['email']['smtp_hostname']['text'] != '') {
+ $smtp['hostname'] = $_SESSION['email']['smtp_hostname']['text'];
+ }
+ $smtp['host'] = (strlen($_SESSION['email']['smtp_host']['text']) ? $_SESSION['email']['smtp_host']['text']: '127.0.0.1');
+ if (isset($_SESSION['email']['smtp_port'])) {
+ $smtp['port'] = (int) $_SESSION['email']['smtp_port']['numeric'];
+ }
+ else {
+ $smtp['port'] = 0;
+ }
+ $smtp['secure'] = $_SESSION['email']['smtp_secure']['text'];
+ $smtp['auth'] = $_SESSION['email']['smtp_auth']['text'];
+ $smtp['username'] = $_SESSION['email']['smtp_username']['text'];
+ $smtp['password'] = $_SESSION['email']['smtp_password']['text'];
+ $smtp['from'] = $_SESSION['email']['smtp_from']['text'];
+ $smtp['from_name'] = $_SESSION['email']['smtp_from_name']['text'];
+
+ if (isset($_SESSION['voicemail']['smtp_from']) && strlen($_SESSION['voicemail']['smtp_from']['text']) > 0) {
+ $smtp['from'] = $_SESSION['voicemail']['smtp_from']['text'];
+ }
+ if (isset($_SESSION['voicemail']['smtp_from_name']) && strlen($_SESSION['voicemail']['smtp_from_name']['text']) > 0) {
+ $smtp['from_name'] = $_SESSION['voicemail']['smtp_from_name']['text'];
+ }
+*/
+
+//overwrite with domain-specific smtp server settings, if any
+ $sql = "select domain_setting_subcategory, domain_setting_value ";
+ $sql .= "from v_domain_settings ";
+ $sql .= "where domain_uuid = :domain_uuid ";
+ $sql .= "and (domain_setting_category = 'email' or domain_setting_category = 'voicemail') ";
+ $sql .= "and domain_setting_enabled = 'true' ";
+ $parameters['domain_uuid'] = $domain_uuid;
+ $database = new database;
+ $result = $database->select($sql, $parameters, 'all');
+ if (is_array($result) && @sizeof($result) != 0) {
+ foreach ($result as $row) {
+ if ($row['domain_setting_value'] != '') {
+ $smtp[str_replace('smtp_','',$row["domain_setting_subcategory"])] = $row['domain_setting_value'];
+ }
+ }
+ }
+ unset($sql, $parameters, $result, $row);
+
+//value adjustments
+ $smtp['auth'] = ($smtp['auth'] == "true") ? true : false;
+ $smtp['password'] = ($smtp['password'] != '') ? $smtp['password'] : null;
+ $smtp['secure'] = ($smtp['secure'] != "none") ? $smtp['secure'] : null;
+ $smtp['username'] = ($smtp['username'] != '') ? $smtp['username'] : null;
+
+//option to disable smtp ssl or tls validation
+/*
+ if (isset($_SESSION['email']['smtp_validate_certificate'])) {
+ if ($_SESSION['email']['smtp_validate_certificate']['boolean'] == "false") {
+ $mail->SMTPOptions = array(
+ 'ssl' => array(
+ 'verify_peer' => false,
+ 'verify_peer_name' => false,
+ 'allow_self_signed' => true
+ )
+ );
+ }
+ }
+*/
+
+//add smtp authentication
+/*
+ $mail->SMTPAuth = $smtp['auth'];
+ if (isset($smtp['hostname'])) {
+ $mail->Hostname = $smtp['hostname'];
+ }
+ $mail->Host = $smtp['host'];
+ if ($smtp['port'] != 0) {
+ $mail->Port = $smtp['port'];
+ }
+ if ($smtp['secure'] != '') {
+ $mail->SMTPSecure = $smtp['secure'];
+ }
+ if ($smtp['auth']) {
+ $mail->Username = $smtp['username'];
+ $mail->Password = $smtp['password'];
+ }
+ $mail->SMTPDebug = 4;
+*/
+
+//get the voicemail details
+ $sql = "select * from v_voicemails ";
+ $sql .= "where voicemail_uuid in ( ";
+ $sql .= " select voicemail_uuid from v_voicemail_messages ";
+ $sql .= " where voicemail_message_uuid = :voicemail_message_uuid ";
+ $sql .= ") ";
+ $parameters['voicemail_message_uuid'] = $email_uuid;
+ $database = new database;
+ $row = $database->select($sql, $parameters, 'row');
+ if (is_array($row)) {
+ //$domain_uuid = $row["domain_uuid"];
+ //$voicemail_uuid = $row["voicemail_uuid"];
+ $voicemail_id = $row["voicemail_id"];
+ //$voicemail_password = $row["voicemail_password"];
+ //$greeting_id = $row["greeting_id"];
+ //$voicemail_alternate_greet_id = $row["voicemail_alternate_greet_id"];
+ //$voicemail_mail_to = $row["voicemail_mail_to"];
+ //$voicemail_sms_to = $row["voicemail_sms_to "];
+ $voicemail_transcription_enabled = $row["voicemail_transcription_enabled"];
+ //$voicemail_attach_file = $row["voicemail_attach_file"];
+ //$voicemail_file = $row["voicemail_file"];
+ //$voicemail_local_after_email = $row["voicemail_local_after_email"];
+ //$voicemail_enabled = $row["voicemail_enabled"];
+ //$voicemail_description = $row["voicemail_description"];
+ //$voicemail_name_base64 = $row["voicemail_name_base64"];
+ //$voicemail_tutorial = $row["voicemail_tutorial"];
+ echo "transcribe enabled: ".$voicemail_transcription_enabled."\n";
+ }
+ unset($parameters);
+
+//get the attachments and add to the email
+ $sql = "select * from v_email_queue_attachments ";
+ $sql .= "where email_queue_uuid = :email_queue_uuid ";
+ $parameters['email_queue_uuid'] = $email_queue_uuid;
+ $database = new database;
+ $email_queue_attachments = $database->select($sql, $parameters, 'all');
+ if (is_array($email_queue_attachments) && @sizeof($email_queue_attachments) != 0) {
+ foreach($email_queue_attachments as $field) {
+
+ $email_queue_attachment_uuid = $field['email_queue_attachment_uuid'];
+ $domain_uuid = $field['domain_uuid'];
+ $email_attachment_type = $field['email_attachment_type'];
+ $email_attachment_path = $field['email_attachment_path'];
+ $email_attachment_name = $field['email_attachment_name'];
+ //$email_attachment_base64= $field['email_attachment_base64'];
+
+ switch ($email_attachment_type) {
+ case "wav":
+ $mime_type = "audio/x-wav";
+ break;
+ case "mp3":
+ $mime_type = "audio/x-mp3";
+ break;
+ case "pdf":
+ $mime_type = "application/pdf";
+ break;
+ case "tif":
+ $mime_type = "image/tiff";
+ break;
+ case "tiff":
+ $mime_type = "image/tiff";
+ break;
+ default:
+ $mime_type = "binary/octet-stream";
+ break;
+ }
+
+ if (isset($voicemail_transcription_enabled) && $voicemail_transcription_enabled == 'true') {
+ //transcribe the attachment
+ if ($email_attachment_type == 'wav' || $email_attachment_type == 'mp3') {
+ $field = transcribe($email_attachment_path, $email_attachment_name, $email_attachment_type);
+ echo "transcribe path: ".$email_attachment_path."\n";
+ echo "transcribe name: ".$email_attachment_name."\n";
+ echo "transcribe type: ".$email_attachment_type."\n";
+ echo "transcribe command: ".$field['command']."\n";
+ echo "transcribe message: ".$field['message']."\n";
+ $transcribe_message = $field['message'];
+ }
+
+ //echo "email_body before: ".$email_body."\n";
+ $email_body = str_replace('${message_text}', $transcribe_message, $email_body);
+ //$email_debug = $field['message'];
+ //echo "email_body after: ".$email_body."\n";
+ //unset($field);
+ }
+ else {
+ $email_body = str_replace('${message_text}', '', $email_body);
+ }
+
+ //base64 encode the file
+ //$file_contents = base64_encode(file_get_contents($email_attachment_path.'/'.$email_attachment_name));
+
+ //add an attachment
+ //public addAttachment ( string $path, string $name = '', string $encoding = 'base64', string $type = '', string $disposition = 'attachment' ) : boolean
+ //$mail->AddAttachment($email_attachment_path.'/'.$email_attachment_name, $email_attachment_name, 'base64', 'attachment');
+
+ //add email attachments as a string for the send_email function
+ //$email_attachments[0]['type'] = 'string';
+ //$email_attachments[0]['name'] = $email_attachment_path.'/'.$email_attachment_name;
+ //$email_attachments[0]['value'] = base64_encode(file_get_contents($email_attachment_path.'/'.$email_attachment_name));
+
+ //add email attachment as a file for the send_email function
+ $email_attachments[0]['type'] = 'file';
+ $email_attachments[0]['name'] = $email_attachment_name;
+ $email_attachments[0]['value'] = $email_attachment_path.'/'.$email_attachment_name;
+ }
+ }
+ unset($parameters);
+
+//send context to the temp log
+ echo "Subject: ".$email_subject."\n";
+ echo "From: ".$email_from."\n";
+ echo "Reply-to: ".$email_from."\n";
+ echo "To: ".$email_to."\n";
+ echo "Date: ".$email_date."\n";
+ //echo "Transcript: ".$array['message']."\n";
+ //echo "Body: ".$email_body."\n";
+
+//update the message transcription
+ if (isset($voicemail_transcription_enabled) && $voicemail_transcription_enabled == 'true' && isset($transcribe_message)) {
+ $sql = "update v_voicemail_messages ";
+ $sql .= "set message_transcription = :message_transcription ";
+ $sql .= "where voicemail_message_uuid = :voicemail_message_uuid; ";
+ $parameters['voicemail_message_uuid'] = $email_uuid;
+ $parameters['message_transcription'] = $transcribe_message;
+ //echo $sql."\n";
+ //print_r($parameters);
+ $database = new database;
+ $database->execute($sql, $parameters);
+ unset($parameters);
+ }
+
+//send email
+ //ob_start();
+ //$sent = !send_email($email_to, $email_subject, $email_body, $email_error, null, null, null, null, $email_attachments) ? false : true;
+ //$response = ob_get_clean();
+ //echo $response;
+
+//send the email
+ $email = new email;
+ $email->from_address = $email_from_address;
+ $email->from_name = $email_from_name;
+ $email->recipients = $email_to;
+ $email->subject = $email_subject;
+ $email->body = $email_body;
+ $email->attachments = $email_attachments;
+ $email->method = 'direct';
+ $sent = $email->send();
+ //$response = $email->email_error;
+
+//add to, from, fromname, custom headers and subject to the email
+/*
+ $mail->From = $smtp['from'] ;
+ $mail->FromName = $smtp['from_name'];
+ $mail->Subject = $email_subject;
+
+ $email_to = trim($email_to, "<> ");
+ $email_to = str_replace(";", ",", $email_to);
+ $email_to_array = explode(",", $email_to);
+ if (count($email_to_array) == 0) {
+ $mail->AddAddress($email_to);
+ }
+ else {
+ foreach ($email_to_array as $email_address) {
+ if (strlen($email_address) > 0) {
+ echo "Add Address: $email_address\n";
+ $mail->AddAddress(trim($email_address));
+ }
+ }
+ }
+*/
+
+//add the body to the email
+/*
+ $body_plain = remove_tags($email_body);
+ //echo "body_plain = $body_plain\n";
+ if ((substr($email_body, 0, 5) == "ContentType = "text/html; charset=utf-8";
+ $mail->Body = $email_body."
";
+ $mail->AltBody = $body_plain."\n";
+ $mail->isHTML(true);
+ }
+ else {
+ //$mail->Body = ($body != '') ? $body : $body_plain;
+ $mail->Body = $body_plain."\n";
+ $mail->AltBody = $body_plain."\n";
+ $mail->isHTML(false);
+ }
+ $mail->CharSet = "utf-8";
+*/
+
+//send the email
+ if ($sent) {
+ //if ($mail->Send()) {
+
+ /*
+ $sql = "delete from v_email_queue_attachments ";
+ $sql .= "where email_queue_uuid = :email_queue_uuid; ";
+ $parameters['email_queue_uuid'] = $email_queue_uuid;
+ $database = new database;
+ $database->select($sql, $parameters);
+
+ $sql = "delete from v_email_queue ";
+ $sql .= "where email_queue_uuid = :email_queue_uuid; ";
+ $parameters['email_queue_uuid'] = $email_queue_uuid;
+ $database = new database;
+ $database->select($sql, $parameters);
+ */
+
+ /*
+ //build insert array
+ $email_log_uuid = uuid();
+ $array['email_queue'][0]['email_queue_uuid'] = $email_queue_uuid;
+ $array['email_queue'][0]['email_status'] = 'sent';
+ if (isset($field['message'])) {
+ $array['email_queue'][0]['email_transcription'] = $field['message'];
+ }
+
+ //grant temporary permissions
+ $p = new permissions;
+ $p->add('email_queue_add', 'temp');
+
+ //execute insert
+ $database = new database;
+ $database->app_name = 'email_queue';
+ $database->app_uuid = 'ba41954e-9d21-4b10-bbc2-fa5ceabeb184';
+ $database->save($array);
+ unset($array);
+
+ //revoke temporary permissions
+ $p->delete('email_queue_add', 'temp');
+ */
+
+ //set the email status to sent
+ $sql = "update v_email_queue ";
+ $sql .= "set email_status = 'sent' ";
+ //$sql .= "set email_status = 'waiting' "; //debug
+ if (isset($transcribe_message)) {
+ $sql .= ", email_transcription = :email_transcription ";
+ }
+ $sql .= "where email_queue_uuid = :email_queue_uuid; ";
+ $parameters['email_queue_uuid'] = $email_queue_uuid;
+ if (isset($transcribe_message)) {
+ $parameters['email_transcription'] = $transcribe_message;
+ }
+ //echo $sql."\n";
+ //print_r($parameters);
+ $database = new database;
+ $database->execute($sql, $parameters);
+ unset($parameters);
+
+ //delete the email after it is sent
+ if ($email_action_after == 'delete') {
+ //remove the email file after it has been sent
+ if (is_array($email_queue_attachments) && @sizeof($email_queue_attachments) != 0) {
+ foreach($email_queue_attachments as $field) {
+ $email_attachment_path = $field['email_attachment_path'];
+ $email_attachment_name = $field['email_attachment_name'];
+ if (file_exists($email_attachment_path.'/'.$email_attachment_name)) {
+ unlink($email_attachment_path.'/'.$email_attachment_name);
+ }
+ }
+ }
+
+ //delete the voicemail message from the database
+ $sql = "delete from v_voicemail_messages ";
+ $sql .= "where voicemail_message_uuid = :voicemail_message_uuid; ";
+ $parameters['voicemail_message_uuid'] = $email_uuid;
+ //echo $sql."\n";
+ //print_r($parameters);
+ $database = new database;
+ $database->execute($sql, $parameters);
+ unset($parameters);
+
+ //get the domain_name
+ $sql = "select domain_name from v_domains ";
+ $sql .= "where domain_uuid = :domain_uuid ";
+ $parameters['domain_uuid'] = $domain_uuid;
+ $database = new database;
+ $domain_name = $database->select($sql, $parameters, 'column');
+
+ //send the message waiting status
+ $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
+ if ($fp) {
+ //$switch_cmd .= "luarun app.lua voicemail mwi ".$voicemail_id."@".$domain_name;
+ $switch_cmd .= "luarun app/voicemail/resources/scripts/mwi_notify.lua ".$voicemail_id." ".$domain_name." 0 0";
+ $switch_result = event_socket_request($fp, 'api '.$switch_cmd);
+ echo $switch_cmd."\n";
+ }
+ else {
+ echo "event socket connection failed\n";
+ }
+ }
+
+ /*
+ //build insert array
+ $array['email_queue'][0]['email_queue_uuid'] = $email_queue_uuid;
+ //$array['email_queue'][0]['sent_date'] = 'now()';
+ $array['email_queue'][0]['email_status'] = 'sent';
+
+ //grant temporary permissions
+ $p = new permissions;
+ $p->add('email_queue_add', 'temp');
+ $p->add('email_queue_update', 'temp');
+ //execute insert
+ $database = new database;
+ $database->app_name = 'email_queue';
+ $database->app_uuid = '5befdf60-a242-445f-91b3-2e9ee3e0ddf7';
+ print_r($array);
+ $message = $database->save($array);
+ print_r($message);
+ unset($array);
+ //revoke temporary permissions
+ $p->delete('email_queue_add', 'temp');
+ $p->delete('email_queue_update', 'temp');
+ */
+
+ //send a message to the console
+ echo "Message sent!\n";
+
+ }
+ else {
+
+ $mailer_error = $mail->ErrorInfo;
+ echo "Mailer Error: ".$mailer_error."\n\n";
+
+ /*
+ //build insert array
+ $email_log_uuid = uuid();
+ $array['email_queue'][0]['email_queue_uuid'] = $email_queue_uuid;
+ $array['email_queue'][0]['email_status'] = 'failed';
+
+ //grant temporary permissions
+ $p = new permissions;
+ $p->add('email_queue_add', 'temp');
+
+ //execute insert
+ $database = new database;
+ $database->app_name = 'email_queue';
+ $database->app_uuid = 'ba41954e-9d21-4b10-bbc2-fa5ceabeb184';
+ $database->save($array);
+ unset($array);
+
+ //revoke temporary permissions
+ $p->delete('email_queue_add', 'temp');
+ */
+
+ //set the email retry count
+ $email_retry_count++;
+
+ //set the email status to failed
+ $sql = "update v_email_queue ";
+ if ($email_retry_count >= $retry_limit) {
+ $sql .= "set email_status = 'failed', ";
+ }
+ else {
+ $sql .= "set email_status = 'trying', ";
+ }
+ $sql .= "email_retry_count = :email_retry_count ";
+ //$sql .= ", email_debug = :email_debug ";
+ $sql .= "where email_queue_uuid = :email_queue_uuid; ";
+ $parameters['email_queue_uuid'] = $email_queue_uuid;
+ //$parameters['email_debug'] = $mailer_error;
+ $parameters['email_retry_count'] = $email_retry_count;
+ //echo $sql."\n";
+ //print_r($parameters);
+ $database = new database;
+ $database->execute($sql, $parameters);
+ unset($parameters);
+
+ /*
+ $call_uuid = $headers["X-FusionPBX-Call-UUID"];
+ if ($resend == true) {
+ echo "Retained in v_email_logs \n";
+ }
+ else {
+ // log/store message in database for review
+ if (!isset($email_log_uuid)) {
+ //build insert array
+ $email_log_uuid = uuid();
+ $array['email_logs'][0]['email_log_uuid'] = $email_log_uuid;
+ if (is_uuid($call_uuid)) {
+ $array['email_logs'][0]['call_uuid'] = $call_uuid;
+ }
+ $array['email_logs'][0]['domain_uuid'] = $headers["X-FusionPBX-Domain-UUID"];
+ $array['email_logs'][0]['sent_date'] = 'now()';
+ $array['email_logs'][0]['type'] = $headers["X-FusionPBX-Email-Type"];
+ $array['email_logs'][0]['status'] = 'failed';
+ $array['email_logs'][0]['email'] = str_replace("'", "''", $msg);
+ //grant temporary permissions
+ $p = new permissions;
+ $p->add('email_log_add', 'temp');
+ //execute insert
+ $database = new database;
+ $database->app_name = 'v_mailto';
+ $database->app_uuid = 'ba41954e-9d21-4b10-bbc2-fa5ceabeb184';
+ $database->save($array);
+ unset($array);
+ //revoke temporary permissions
+ $p->delete('email_log_add', 'temp');
+ }
+
+ echo "Retained in v_email_logs as email_log_uuid = ".$email_log_uuid."\n";
+ }
+ */
+
+ }
+
+//unset the php mail object
+ unset($mail);
+
+//save output to
+ //$fp = fopen(sys_get_temp_dir()."/mailer-app.log", "a");
+
+//prepare the output buffers
+ //ob_end_clean();
+ //ob_start();
+
+//message divider for log file
+ //echo "\n\n====================================================\n\n";
+
+//get and save the output from the buffer
+ //$content = ob_get_contents(); //get the output from the buffer
+ //$content = str_replace("
", "", $content);
+
+ //ob_end_clean(); //clean the buffer
+
+ //fwrite($fp, $content);
+ //fclose($fp);
+
+?>
diff --git a/app/email_queue/resources/service/debian.service b/app/email_queue/resources/service/debian.service
new file mode 100644
index 0000000000..a3baec5f76
--- /dev/null
+++ b/app/email_queue/resources/service/debian.service
@@ -0,0 +1,30 @@
+; Author: Mark J Crane
+; cp /var/www/fusionpbx/app/email_queue/resources/service/debian.service /etc/systemd/system/email_queue.service
+; systemctl enable email_queue
+; systemctl start email_queue
+; systemctl daemon-reload
+
+[Unit]
+Description=FusionPBX Email Queue
+Wants=network-online.target
+Requires=network.target local-fs.target postgresql.service
+After=network.target network-online.target local-fs.target postgresql.service
+StartLimitIntervalSec=0
+
+[Service]
+Type=simple
+;Type=forking
+PIDFile=/var/run/fusionpbx/email_queue.pid
+WorkingDirectory=/var/www/fusionpbx
+;Environment="USER=www-data"
+;Environment="GROUP=www-data"
+;EnvironmentFile=-/etc/default/fusionpbx
+ExecStartPre=/bin/mkdir -p /var/run/fusionpbx
+;ExecStartPre=/bin/chown -R ${USER}:${GROUP} /var/www/fusionpbx
+ExecStart=/usr/bin/php /var/www/fusionpbx/app/email_queue/resources/service/email_queue.php
+TimeoutSec=55s
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
+Also=
diff --git a/app/email_queue/resources/service/email_queue.php b/app/email_queue/resources/service/email_queue.php
new file mode 100644
index 0000000000..c960e7321c
--- /dev/null
+++ b/app/email_queue/resources/service/email_queue.php
@@ -0,0 +1,204 @@
+select($sql, $parameters, 'all');
+ unset($parameters);
+
+ //process the messages
+ if (is_array($email_queue) && @sizeof($email_queue) != 0) {
+ foreach($email_queue as $row) {
+ $command = "/usr/bin/php /var/www/fusionpbx/app/email_queue/resources/jobs/email_send.php ";
+ $command .= "'action=send&email_queue_uuid=".$row["email_queue_uuid"]."&hostname=".$hostname."'";
+ if (isset($debug)) {
+ //run process inline to see debug info
+ echo $command."\n";
+ $result = system($command);
+ echo $result."\n";
+ }
+ else {
+ //starts process rapidly doesn't wait for previous process to finish (used for production)
+ $handle = popen($command." > /dev/null &", 'r');
+ echo "'$handle'; " . gettype($handle) . "\n";
+ $read = fread($handle, 2096);
+ echo $read;
+ pclose($handle);
+ }
+ }
+ }
+
+ //pause to prevent excessive database queries
+ sleep($interval);
+ }
+
+//remove the old pid file
+ if (file_exists($file)) {
+ unlink($pid_file);
+ }
+
+//save output to
+ //$fp = fopen(sys_get_temp_dir()."/mailer-app.log", "a");
+
+//prepare the output buffers
+ //ob_end_clean();
+ //ob_start();
+
+//message divider for log file
+ //echo "\n\n=============================================================================================================================================\n\n";
+
+//get and save the output from the buffer
+ //$content = ob_get_contents(); //get the output from the buffer
+ //$content = str_replace("
", "", $content);
+
+ //ob_end_clean(); //clean the buffer
+
+ //fwrite($fp, $content);
+ //fclose($fp);
+
+//notes
+ //echo __line__."\n";
+ // if not keeping the email then need to delete it after the voicemail is emailed
+
+//how to use this feature
+ // cd /var/www/fusionpbx; /usr/bin/php /var/www/fusionpbx/app/email_queue/resources/send.php
+
+?>
diff --git a/app/email_queue/root.php b/app/email_queue/root.php
new file mode 100644
index 0000000000..b35ebdf68d
--- /dev/null
+++ b/app/email_queue/root.php
@@ -0,0 +1,66 @@
+