$myuser['email'], 'language' => $myuser['language']);
continue;
}
/* Not admin, is he/she allowed this category? */
$myuser['categories'] = explode(',', $myuser['categories']);
if (in_array($ticket['category'], $myuser['categories'])) {
$admins[] = array('email' => $myuser['email'], 'language' => $myuser['language']);
continue;
}
}
if (count($admins) > 0) {
/* Make sure each user gets email in his/her preferred language */
$current_language = 'NONE';
$recipients = array();
/* Loop through staff */
foreach ($admins as $admin) {
/* If admin language is NULL force default HESK language */
if (!$admin['language'] || !isset($hesk_settings['languages'][$admin['language']])) {
$admin['language'] = HESK_DEFAULT_LANGUAGE;
}
/* Generate message or add email to the list of recepients */
if ($admin['language'] == $current_language) {
/* We already have the message, just add email to the recipients list */
$recipients[] = $admin['email'];
} else {
/* Send email messages in previous languages (if required) */
if ($current_language != 'NONE') {
/* Send e-mail to staff */
hesk_mail(implode(',', $recipients), $subject, $message, $html_message);
/* Reset list of email addresses */
$recipients = array();
}
/* Set new language */
hesk_setLanguage($admin['language']);
/* Format staff email subject and message for this language */
$subject = hesk_getEmailSubject($email_template, $ticket);
list($message, $html_message) = hesk_getEmailMessage($email_template, $ticket, $is_ticket);
/* Add email to the recipients list */
$recipients[] = $admin['email'];
/* Remember the last processed language */
$current_language = $admin['language'];
}
}
/* Send email messages to the remaining staff */
hesk_mail(implode(',', $recipients), $subject, $message, $html_message);
/* Reset language to original one */
hesk_resetLanguage();
}
return true;
} // END hesk_notifyStaff()
function hesk_sendOverdueTicketReminder($ticket, $users)
{
if (defined('HESK_DEMO')) {
return true;
}
hesk_setLanguage($ticket['user_language']);
// Format email subject and message
$subject = hesk_getEmailSubject('overdue_ticket', $ticket);
list($message, $html_message) = hesk_getEmailMessage('overdue_ticket', $ticket, 1);
$emails = array();
if ($ticket['user_email'] != null) {
$emails[] = $ticket['user_email'];
} else {
foreach ($users as $user) {
$categories = explode(',', $user['categories']);
if ($user['notify_overdue_unassigned'] && ($user['isadmin'] || in_array($ticket['category'], $categories))) {
$emails[] = $user['email'];
}
}
}
if (count($emails)) {
hesk_mail(implode(',', $emails), $subject, $message, $html_message);
}
return true;
}
function hesk_validEmails()
{
global $hesklang;
return array(
/*** Emails sent to CLIENT ***/
// --> Send reminder about existing tickets
'forgot_ticket_id' => $hesklang['forgot_ticket_id'],
// --> Staff replied to a ticket
'new_reply_by_staff' => $hesklang['new_reply_by_staff'],
// --> New ticket submitted
'new_ticket' => $hesklang['ticket_received'],
// --> New ticket submitted by staff
'new_ticket_by_staff' => $hesklang['new_ticket_by_staff'],
// --> Ticket closed
'ticket_closed' => $hesklang['ticket_closed'],
/*** Emails sent to STAFF ***/
// --> Ticket moved to a new category
'category_moved' => $hesklang['category_moved'],
// --> Client replied to a ticket
'new_reply_by_customer' => $hesklang['new_reply_by_customer'],
// --> New ticket submitted
'new_ticket_staff' => $hesklang['new_ticket_staff'],
// --> New ticket assigned to staff
'ticket_assigned_to_you' => $hesklang['ticket_assigned_to_you'],
// --> New private message
'new_pm' => $hesklang['new_pm'],
// --> New note by someone to a ticket assigned to you
'new_note' => $hesklang['new_note'],
// --> Staff password reset email
'reset_password' => $hesklang['reset_password'],
// --> Overdue ticket email
'overdue_ticket' => $hesklang['overdue_ticket'],
// --> MFA Verification email
'mfa_verification' => $hesklang['mfa_verification'],
);
} // END hesk_validEmails()
function hesk_mail($to, $subject, $message, $html_message, $tracking_ID = null)
{
global $hesk_settings, $hesklang;
// Demo mode
if (defined('HESK_DEMO')) {
return true;
}
// usleep(100);
// Empty recipient?
if ($to == '') {
return true;
}
// Stop if we find anything suspicious in the headers
if (preg_match("/\n|\r|\t|%0A|%0D|%08|%09/", $to . $subject)) {
return false;
}
// Encode subject to UTF-8
$subject = hesk_html_entity_decode($subject);
// Setup "name TO: $to To not only support Hesk development but also look more professional, remove "Powered by" links from your help desk.
SUBJECT: $subject
MSG: $message
' . $hesklang['error'] . ': ' . htmlspecialchars($mailer->ErrorInfo);
if ($debug_log = ob_get_contents()) {
$error .= '
';
}
$_SESSION['HESK_2ND_NOTICE'] = true;
$_SESSION['HESK_2ND_MESSAGE'] = $hesklang['esf'] . ' ' . $error;
} else {
$_SESSION['HESK_2ND_NOTICE'] = true;
$_SESSION['HESK_2ND_MESSAGE'] = $hesklang['esf'] . ' ' . $hesklang['contact_webmsater'] . ' ' . $hesk_settings['webmaster_mail'] . '';
}
ob_end_clean();
return false;
}
try {
ob_start();
$mailer->send();
ob_end_clean();
} catch (Exception $e) {
if ($hesk_settings['debug_mode']) {
$error = $hesklang['cnsm'] . ' ' . $to . '
' . $hesklang['error'] . ': ' . htmlspecialchars($mailer->ErrorInfo);
if ($debug_log = ob_get_contents()) {
$error .= '
';
}
$_SESSION['HESK_2ND_NOTICE'] = true;
$_SESSION['HESK_2ND_MESSAGE'] = $hesklang['esf'] . ' ' . $error;
} else {
$_SESSION['HESK_2ND_NOTICE'] = true;
$_SESSION['HESK_2ND_MESSAGE'] = $hesklang['esf'] . ' ' . $hesklang['contact_webmsater'] . ' ' . $hesk_settings['webmaster_mail'] . '';
}
ob_end_clean();
return false;
}
ob_end_clean();
return true;
} // END hesk_mail()
function hesk_getEmailSubject($eml_file, $ticket = '', $is_ticket = 1, $strip = 0)
{
global $hesk_settings, $hesklang;
// Demo mode
if (defined('HESK_DEMO')) {
return '';
}
/* Get list of valid emails */
$valid_emails = hesk_validEmails();
/* Verify this is a valid email include */
if (!isset($valid_emails[$eml_file])) {
hesk_error($hesklang['inve']);
} else {
$msg = $valid_emails[$eml_file];
}
/* If not a ticket-related email return subject as is */
if (!$ticket) {
return $msg;
}
/* Strip slashes from the subject only if it's a new ticket */
if ($strip) {
$ticket['subject'] = stripslashes($ticket['subject']);
}
/* Not a ticket, but has some info in the $ticket array */
if (!$is_ticket) {
return str_replace('%%SUBJECT%%', $ticket['subject'], $msg);
}
/* Set category title */
$ticket['category'] = hesk_msgToPlain(hesk_getCategoryName($ticket['category']), 1, 0);
/* Get priority */
switch ($ticket['priority']) {
case 0:
$ticket['priority'] = $hesklang['critical'];
break;
case 1:
$ticket['priority'] = $hesklang['high'];
break;
case 2:
$ticket['priority'] = $hesklang['medium'];
break;
default:
$ticket['priority'] = $hesklang['low'];
}
/* Set status */
$ticket['status'] = hesk_get_status_name($ticket['status']);
// Convert any entities in site title to plain text
$site_title = hesk_msgToPlain($hesk_settings['site_title'], 1, 0);
/* Replace all special tags */
$msg = str_replace('%%SITE_TITLE%%', $site_title, $msg);
$msg = str_replace('%%SUBJECT%%', $ticket['subject'], $msg);
$msg = str_replace('%%TRACK_ID%%', $ticket['trackid'], $msg);
$msg = str_replace('%%CATEGORY%%', $ticket['category'], $msg);
$msg = str_replace('%%PRIORITY%%', $ticket['priority'], $msg);
$msg = str_replace('%%STATUS%%', $ticket['status'], $msg);
return $msg;
} // hesk_getEmailSubject()
function hesk_getEmailMessage($eml_file, $ticket, $is_admin = 0, $is_ticket = 1, $just_message = 0)
{
global $hesk_settings, $hesklang;
// Demo mode
if (defined('HESK_DEMO')) {
return '';
}
/* Get list of valid emails */
$valid_emails = hesk_validEmails();
/* Verify this is a valid email include */
if (!isset($valid_emails[$eml_file])) {
hesk_error($hesklang['inve']);
}
/* Get email template */
$orig_eml_file = $eml_file;
$eml_file = 'language/' . $hesk_settings['languages'][$hesk_settings['language']]['folder'] . '/emails/' . $orig_eml_file . '.txt';
$html_eml_file = 'language/' . $hesk_settings['languages'][$hesk_settings['language']]['folder'] . '/html_emails/' . $orig_eml_file . '.txt';
if (file_exists(HESK_PATH . $eml_file)) {
$msg = file_get_contents(HESK_PATH . $eml_file);
} else {
hesk_error($hesklang['emfm'] . ': ' . $eml_file);
}
if (file_exists(HESK_PATH . $html_eml_file)) {
$html_msg = file_get_contents(HESK_PATH . $html_eml_file);
} else {
hesk_error($hesklang['emfm'] . ': ' . $html_eml_file);
}
/* Return just the message without any processing? */
if ($just_message) {
return array($msg, $html_msg);
}
// Convert any entities in site title to plain text
$site_title = hesk_msgToPlain($hesk_settings['site_title'], 1, 0);
// Create a HTML-version of the message if needed
if (isset($ticket['message']) && ! isset($ticket['message_html']) ) {
$ticket['message_html'] = '';
}
/* If it's not a ticket-related mail (like "a new PM") just process quickly */
if (!$is_ticket) {
$trackingURL = $hesk_settings['hesk_url'] . '/' . $hesk_settings['admin_dir'] . '/mail.php?a=read&id=' . intval($ticket['id']);
list($msg, $html_msg) = hesk_replace_email_tag('%%NAME%%', $ticket['name'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%SUBJECT%%', $ticket['subject'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%TRACK_URL%%', $trackingURL . ' ', $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%SITE_TITLE%%', $site_title, $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%SITE_URL%%', $hesk_settings['site_url'] . ' ', $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%FIRST_NAME%%', hesk_full_name_to_first_name($ticket['name']), $msg, $html_msg);
if (isset($ticket['message'])) {
$msg = str_replace('%%MESSAGE%%', $ticket['message'], $msg);
$html_msg = str_replace('%%MESSAGE%%', $ticket['message_html'], $html_msg);
}
return array($msg, $html_msg);
}
// Is email required to view ticket (for customers only)?
$hesk_settings['e_param'] = $hesk_settings['email_view_ticket'] ? '&e=' . rawurlencode($ticket['email']) : '';
/* Generate the ticket URLs */
$trackingURL = $hesk_settings['hesk_url'];
$trackingURL .= $is_admin ? '/' . $hesk_settings['admin_dir'] . '/admin_ticket.php' : '/ticket.php';
$trackingURL .= '?track=' . $ticket['trackid'] . ($is_admin ? '' : $hesk_settings['e_param']) . '&Refresh=' . rand(10000, 99999);
/* Set category title */
$ticket['category'] = hesk_msgToPlain(hesk_getCategoryName($ticket['category']), 1, 0);
/* Set priority title */
switch ($ticket['priority']) {
case 0:
$ticket['priority'] = $hesklang['critical'];
break;
case 1:
$ticket['priority'] = $hesklang['high'];
break;
case 2:
$ticket['priority'] = $hesklang['medium'];
break;
default:
$ticket['priority'] = $hesklang['low'];
}
/* Get owner name */
$ticket['owner'] = hesk_msgToPlain(hesk_getOwnerName($ticket['owner']), 1, 0);
/* Set status */
$ticket['status'] = hesk_get_status_name($ticket['status']);
// Get name of the person who posted the last message
if (!isset($ticket['last_reply_by'])) {
$ticket['last_reply_by'] = hesk_getReplierName($ticket);
}
/* Replace all special tags */
list($msg, $html_msg) = hesk_replace_email_tag('%%NAME%%', $ticket['name'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%SUBJECT%%', $ticket['subject'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%TRACK_ID%%', $ticket['trackid'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%TRACK_URL%%', $trackingURL . ' ', $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%SITE_TITLE%%', $site_title, $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%SITE_URL%%', $hesk_settings['site_url'] . ' ', $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%CATEGORY%%', $ticket['category'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%PRIORITY%%', $ticket['priority'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%OWNER%%', $ticket['owner'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%STATUS%%', $ticket['status'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%EMAIL%%', $ticket['email'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%CREATED%%', $ticket['dt'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%UPDATED%%', $ticket['lastchange'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%DUE_DATE%%', $ticket['due_date'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%ID%%', $ticket['id'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%TIME_WORKED%%', $ticket['time_worked'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%LAST_REPLY_BY%%', $ticket['last_reply_by'], $msg, $html_msg);
list($msg, $html_msg) = hesk_replace_email_tag('%%FIRST_NAME%%', hesk_full_name_to_first_name($ticket['name']), $msg, $html_msg);
/* All custom fields */
for ($i = 1; $i <= 50; $i++) {
$k = 'custom' . $i;
if (isset($hesk_settings['custom_fields'][$k])) {
$v = $hesk_settings['custom_fields'][$k];
switch ($v['type']) {
case 'checkbox':
$ticket[$k] = str_replace("
", "\n", $ticket[$k]);
break;
case 'date':
$ticket[$k] = hesk_custom_date_display_format($ticket[$k], $v['value']['date_format']);
break;
}
list($msg, $html_msg) = hesk_replace_email_tag('%%' . strtoupper($k) . '%%', $ticket[$k], $msg, $html_msg);
} else {
list($msg, $html_msg) = hesk_replace_email_tag('%%' . strtoupper($k) . '%%', '', $msg, $html_msg);
}
}
// Let's handle the attachments tag
$att_links = array();
$html_att_links = array();
if ($hesk_settings['attachments']['use'] && isset($ticket['attachments']) && strlen($ticket['attachments'])) {
$att = explode(',', substr($ticket['attachments'], 0, -1));
foreach ($att as $myatt) {
list($att_id, $att_name) = explode('#', $myatt);
$att_links[] = $att_name . "\n" . $hesk_settings['hesk_url'] . '/download_attachment.php?att_id=' . $att_id . '&track=' . $ticket['trackid'] . $hesk_settings['e_param'];
$html_att_links[] = ''.$att_name.'';
}
}
$att_links = implode(" \n\n", $att_links);
$html_att_links = implode("
", $html_att_links);
$msg = str_replace('%%ATTACHMENTS%%', $att_links, $msg, $count_plain);
$html_msg = str_replace('%%ATTACHMENTS%%', $html_att_links, $html_msg, $count_html);
// Is message tag in email template?
if (strpos($msg, '%%MESSAGE%%') !== false || strpos($html_msg, '%%MESSAGE%%') !== false) {
// If there are attachments to this email and the %%ATTACHMENTS%% tag was not present, add links to attachments below the message
if ($hesk_settings['attachments']['use'] && isset($ticket['attachments']) && strlen($ticket['attachments'])) {
if ($count_plain == 0) {
$ticket['message'] .= "\n\n" . $hesklang['fatt'] . "\n\n" . $att_links;
}
if ($count_html == 0) {
$ticket['message_html'] .= "
" . $hesklang['fatt'] . "
" . $html_att_links;
}
}
// Replace message
$msg = str_replace('%%MESSAGE%%', $ticket['message'], $msg);
$html_msg = str_replace('%%MESSAGE%%', $ticket['message_html'], $html_msg);
// For customer notifications: if we allow email piping/pop 3 fetching and
// stripping quoted replies add an "reply above this line" tag
if (!$is_admin && ($hesk_settings['email_piping'] || $hesk_settings['pop3'] || $hesk_settings['imap']) && $hesk_settings['strip_quoted']) {
$msg = $hesklang['EMAIL_HR'] . "\n\n" . $msg;
$html_msg = $hesklang['EMAIL_HR'] . '
' . $html_msg;
}
}
return array($msg, $html_msg);
} // END hesk_getEmailMessage
function hesk_replace_email_tag($tag, $value, $message, $html_message, $nl2br = false) {
return array(
str_replace($tag, $value, $message),
str_replace($tag, ($nl2br ? nl2br(hesk_htmlspecialchars(trim($value))) : hesk_htmlspecialchars(trim($value))), $html_message)
);
}
function hesk_encodeIfNotAscii($str, $escape_header = false)
{
// Match anything outside of ASCII range
if (preg_match('/[^\x00-\x7F]/', $str)) {
return "=?UTF-8?B?" . base64_encode($str) . "?=";
}
// Do we need to wrap the header in double quotes?
if ($escape_header && preg_match("/[^-A-Za-z0-9!#$%&'*+\/=?^_`{|}~\\s]+/", $str)) {
return '"' . str_replace('"', '\\"', $str) . '"';
}
return $str;
} // END hesk_encodeIfNotAscii()
function hesk_PMtoMainAdmin($landmark)
{
global $hesk_settings, $hesklang;
$offer_license = file_exists(HESK_PATH.'hesk_license.php') ? "" : "» Look professional
\r\n\r\n
Suggest what features we should add to Hesk by posting them here.
\r\n\r\nHesk regularly receives improvements and bug fixes; make sure you know about them!
\r\nExperience the best of Hesk by moving your help desk into the Hesk Cloud:
\r\n
Click here to learn more about Hesk Cloud
\r\n\r\n
Best regards,
\r\n\r\nKlemen Stirn
\r\nFounder
\r\nhttps://www.hesk.com
\r\n\r\n
"; break; case 1000: $subject = "We're excited about your 1,000th ticket!"; $message = "
Suggest what features we should add to Hesk by posting them here.
\r\n\r\nHesk regularly receives improvements and bug fixes; make sure you know about them!
\r\nExperience the best of Hesk by moving your help desk into the Hesk Cloud:
\r\n
Click here to learn more about Hesk Cloud
\r\n\r\n
Best regards,
\r\n\r\nKlemen Stirn
\r\nFounder
\r\nhttps://www.hesk.com
\r\n\r\n
"; break; case 10000: $subject = "Wow, you've reached 10,000 tickets!"; $message = "
Suggest what features we should add to Hesk by posting them here.
\r\n\r\nHesk regularly receives improvements and bug fixes; make sure you know about them!
\r\nExperience the best of Hesk by moving your help desk into the Hesk Cloud:
\r\n
Click here to learn more about Hesk Cloud
\r\n\r\n
Best regards,
\r\n\r\nKlemen Stirn
\r\nFounder
\r\nhttps://www.hesk.com
\r\n\r\n
"; break; default: return false; } // Insert private message for main admin hesk_dbQuery("INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."mail` (`id`, `from`, `to`, `subject`, `message`, `dt`, `read`, `deletedby`) VALUES (NULL, 9999, 1, '".hesk_dbEscape($subject)."', '{$message}', NOW(), '0', 9999)"); $pm_id = hesk_dbInsertID(); // Notify admin $res = hesk_dbQuery("SELECT `name`,`email` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `id`=1"); $row = hesk_dbFetchAssoc($res); $pm = array( 'name' => 'HESK.com', 'subject' => $subject, 'message' => 'Please log in to see the message', 'id' => $pm_id, ); // Format email subject and message for recipient $subject = hesk_getEmailSubject('new_pm',$pm,0); list($message, $html_message) = hesk_getEmailMessage('new_pm',$pm,1,0); // Send e-mail hesk_mail($row['email'], $subject, $message, $html_message); return true; } // END hesk_PMtoMainAdmin()