Posted: Wed May 19, 2010 11:17 pm
Just wanted to say thanks to josesanch and edsel for they pieces of code. They worked great!
Thanks
Thanks
Code: Select all
(PRIVATE)
$delete = "Y"; // if delete is Y then processed mail will be deleted
$debug = 1; // Display Notices about in/outgoing emails 1 = on | 0 = off
$category = 1; // Hesk Category ID to trow all emails in
$priority = 1; // 3=Low 2=Medium 1=High
/////////////////////////////////////////////////////////////////////////////////////////////
define('IN_SCRIPT',1);
define('HESK_PATH','');
if (!function_exists('imap_open')) die("IMAP functions are not available.");
if ($debug==1) error_reporting(E_ALL); else error_reporting(0);
// Get all the required files and functions
require(HESK_PATH . 'hesk_settings.inc.php');
require(HESK_PATH . 'inc/common.inc.php');
// Connect to database
require(HESK_PATH . 'inc/database.inc.php');
hesk_dbConnect() or hesk_error("$hesklang[cant_connect_db] $hesklang[contact_webmsater] $hesk_settings[webmaster_mail]!");
// Functions
function getHeader($msgStream, $msgNumber) {
// strips the mail header and places everything in an array .. like from name, from email, date and subject
$mailheader = imap_headerinfo($msgStream, $msgNumber);
$headerArray = array();
$headerArray[0] = $mailheader->subject;
$from = $mailheader->from;
foreach ($from as $id => $object) {
$headerArray[1] = $object->personal; // from personal
$headerArray[2] = $object->mailbox . "@" . $object->host; // from address
}
$headerArray[3] = $mailheader->Date;
return $headerArray;
}
$host = "{".$server.":143"."}"."INBOX";
//connect to inbox and check for new msgs
$msgStream = imap_open($host, $user, $password) or die("<br><br><b>Error: Can't connect to mailbox</b>");
$check = imap_mailboxmsginfo($msgStream);
$number = $check->Nmsgs;
if ($debug==1) {
echo "<b>Notices (".date("H:i:s")."):</b><br>";
if ($number>0) {
echo "<b> - ".$number." email(s)</b><br>";
} else {
echo "<b> - No Email in Inbox</b><br>";
}
$mbox = imap_open("{".$server.":143}", $user, $password);
echo "<h1>Mailboxes</h1>\n";
$folders = imap_listmailbox($mbox, "{".$server."}", "*");
if ($folders == false) {
echo "imap_listmailbox failed<br />\n";
} else {
foreach ($folders as $val) {
echo $val . "<br />\n";
}
}
echo "<h1>Headers in INBOX</h1>\n";
$headers = imap_headers($mbox);
if ($headers == false) {
echo "imap_headers failed<br />\n";
} else {
foreach ($headers as $val) {
echo $val . "<br />\n";
}
}
imap_close($mbox);
}
$msgStream = imap_open($host, $user, $password) or die("<br><br><b>Error: Can't connect to mailbox</b>");
$msgNumber = "1";
while ($msgNumber <= $number) {
$headerArray = getHeader($msgStream, $msgNumber);
$message = htmlentities(addslashes(imap_body($msgStream, $msgNumber)));
$subject = htmlentities(addslashes($headerArray[0]));
$name = htmlentities(addslashes($headerArray[1]));
$email = htmlentities($headerArray[2]);
$date = htmlentities($headerArray[3]);
// Generate tracking ID
$useChars='AEUYBDGHJLMNPQRSTVWXZ123456789';
$trackingID = $useChars{mt_rand(0,29)};
for($i=1;$i<10;$i++) $trackingID .= $useChars{mt_rand(0,29)};
$trackingURL=$hesk_settings['hesk_url'].'/ticket.php?track='.$trackingID;
// End Generate tracking ID
$sql = "
INSERT INTO `hesk_tickets` (
`trackid`,`name`,`email`,`category`,`priority`,`subject`,`message`,`dt`,`lastchange`,`ip`,`status`,`attachments`,`custom1`,`custom2`,`custom3`,`custom4`,`custom5`
)
VALUES (
'$trackingID','$name','$email','$category','$priority','$subject','$message',NOW(),NOW(),'email','0','','','','','',''
)
";
$result = hesk_dbQuery($sql) or hesk_error("$hesklang[cant_sql]: $sql</p><p>$hesklang[mysql_said]:<br>".mysql_error()."</p><p>$hesklang[contact_webmsater] $hesk_settings[webmaster_mail]");
// Get e-mail message for customer
$fp=fopen('language/'.$hesk_settings['languages'][$hesk_settings['language']]['folder'].'/emails/new_ticket.txt','r');
$message=fread($fp,filesize('language/'.$hesk_settings['languages'][$hesk_settings['language']]['folder'].'/emails/new_ticket.txt'));
fclose($fp);
$message=str_replace('%%NAME%%',$name,$message);
$message=str_replace('%%SUBJECT%%',$subject,$message);
$message=str_replace('%%TRACK_ID%%',$trackingID,$message);
$message=str_replace('%%TRACK_URL%%',$trackingURL,$message);
$message=str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'] ,$message);
$message=str_replace('%%SITE_URL%%',$hesk_settings['site_url'] ,$message);
// Send e-mail
$headers="From: $hesk_settings[noreply_mail]\n";
$headers.="Reply-to: $hesk_settings[noreply_mail]\n";
@mail($email,$hesklang['ticket_received'],$message,$headers);
// Need to notify any admins?
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `hesk_users` WHERE `notify`='1'";
$result = hesk_dbQuery($sql) or hesk_error("$hesklang[cant_sql]: $sql</p><p>$hesklang[mysql_said]:<br>".mysql_error()."</p><p>$hesklang[contact_webmsater] $hesk_settings[webmaster_mail]");
while ($myuser=hesk_dbFetchAssoc($result)) {
// Is this an administrator?
if ($myuser['isadmin']) {$admins[]=$myuser['email']; continue;}
// Not admin, is he allowed this category?
$cat=substr($myuser['categories'], 0, -1);
$myuser['categories']=explode(',',$cat);
if (in_array($category,$myuser['categories'])) {
$admins[]=$myuser['email']; continue;
}
}
if (count($admins)>0) {
$trackingURL_admin=$hesk_settings['hesk_url'].'/admin/admin_ticket.php?track='.$trackingID;
// Get e-mail message for customer
$fp=fopen('language/'.$hesk_settings['languages'][$hesk_settings['language']]['folder'].'/emails/new_ticket_staff.txt','r');
$message=fread($fp,filesize('language/'.$hesk_settings['languages'][$hesk_settings['language']]['folder'].'/emails/new_ticket_staff.txt'));
fclose($fp);
$message=str_replace('%%NAME%%',$name,$message);
$message=str_replace('%%SUBJECT%%',$subject,$message);
$message=str_replace('%%TRACK_ID%%',$trackingID,$message);
$message=str_replace('%%TRACK_URL%%',$trackingURL_admin,$message);
$message=str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'] ,$message);
$message=str_replace('%%SITE_URL%%',$hesk_settings['site_url'] ,$message);
// Send e-mail to staff
$email=implode(',',$admins);
$headers="From: $hesk_settings[noreply_mail]\n";
$headers.="Reply-to: $hesk_settings[noreply_mail]\n";
@mail($email,$hesklang['new_ticket_submitted'],$message,$headers);
} // End if
if ($delete == "Y") imap_delete($msgStream, $msgNumber); // mark the current message for deletion
$msgNumber++;
}
if ($delete == "Y") imap_expunge($msgStream); // delete all messages marked for deletion
imap_close($msgStream);
?>
Code: Select all
<?php
////////////////////////////////////////// Settings //////////////////////////////////////////
$server = "mail.mailserver.com"; //mail server.
$user = "username"; // Mail Username
$password = "password"; // Mail Password
$delete = "Y"; // if delete is Y then processed mail will be deleted
$debug = 0; // Display Notices about in/outgoing emails 1 = on | 0 = off
$category = 1; // Hesk Category ID to trow all emails in
$priority = 3; // 3=Low 2=Medium 1=High
/////////////////////////////////////////////////////////////////////////////////////////////
define('IN_SCRIPT',1);
define('HESK_PATH','');
if (!function_exists('imap_open')) die("IMAP functions are not available.");
if ($debug==1) error_reporting(E_ALL); else error_reporting(0);
// Get all the required files and functions
require(HESK_PATH . 'hesk_settings.inc.php');
require(HESK_PATH . 'inc/common.inc.php');
// Connect to database
require(HESK_PATH . 'inc/database.inc.php');
hesk_dbConnect() or hesk_error("$hesklang[cant_connect_db] $hesklang[contact_webmsater] $hesk_settings[webmaster_mail]!");
$host = "{".$server.":143/imap/novalidate-cert}"."INBOX";
$msgStream = imap_open($host, $user, $password) or die("<br><br><b>Error: Can't connect to mailbox</b>");
$check = imap_mailboxmsginfo($msgStream);
$number = $check->Nmsgs;
$msgNumber = "1";
if (!$number) echo "<h1>No hay nuevos mensajes</h1>";
while ($msgNumber <= $number) {
list($subject, $name, $email, $date, $message, $trackingID) = getMessage($msgStream, $msgNumber);
if (!$trackingID) {
$trackingID = createNewTicket($subject, $name, $email, $date, $message);
} else {
createNewReply($subject, $name, $email, $date, $message, $trackingID);
}
if ($delete == "Y") imap_delete($msgStream, $msgNumber); // mark the current message for deletion
$msgNumber++;
}
if ($delete == "Y") imap_expunge($msgStream); // delete all messages marked for deletion
imap_close($msgStream);
// Functions
function getHeader($msgStream, $msgNumber) {
// strips the mail header and places everything in an array .. like from name, from email, date and subject
$mailheader = imap_headerinfo($msgStream, $msgNumber);
$headerArray = array();
$headerArray[0] = $mailheader->subject;
$from = $mailheader->from;
foreach ($from as $id => $object) {
$headerArray[1] = $object->personal; // from personal
$headerArray[2] = $object->mailbox . "@" . $object->host; // from address
}
$headerArray[3] = $mailheader->Date;
return $headerArray;
}
function extractPlain($msgStream, $msgNumber, $st = null, $num = "")
{
// pull the plain text for message $n
if (!$st) $st = imap_fetchstructure($msgStream, $msgNumber);
if (!empty($st->parts)) {
for ($i = 0, $j = count($st->parts); $i < $j; $i++) {
$part = $st->parts[$i];
if ($part->subtype == 'PLAIN') {
return imap_fetchbody($msgStream, $msgNumber, $num.($i+1));
}
if (!empty($part->parts)) {
$body = extractPlain($msgStream, $msgNumber, $part, ($i+1).".");
if ($body) return $body;
}
}
} else {
return imap_body($msgStream, $msgNumber);
}
}
function getMessage($msgStream, $msgNumber)
{
// pull the plain text for message $n
$message = nl2br(extractPlain($msgStream, $msgNumber));
$headerArray = getHeader($msgStream, $msgNumber);
$subject = htmlentities(addslashes($headerArray[0]));
$name = htmlentities(addslashes($headerArray[1]));
$email = htmlentities($headerArray[2]);
$date = htmlentities($headerArray[3]);
$txt = "";
if (preg_match("/- TrackingID: (.*)/", $subject, $matches)) {
$trackingID = $matches[1];
}
foreach (imap_mime_header_decode($name) as $item) $txt .= $item->text;
$name = $txt;
return array($subject, $name, $email, $date, $message, $trackingID);
}
function generateTrackingID()
{
// Generate tracking ID
$useChars='AEUYBDGHJLMNPQRSTVWXZ123456789';
$trackingID = $useChars{mt_rand(0,29)};
for($i=1;$i<10;$i++) $trackingID .= $useChars{mt_rand(0,29)};
return $trackingID;
}
function createNewTicket($subject, $name, $email, $date, $message)
{
global $category, $priority, $hesk_settings, $hesklang;
$trackingID = generateTrackingID();
$trackingURL = $hesk_settings['hesk_url'].'/ticket.php?track='.$trackingID;
$sql = "
INSERT INTO `hesk_tickets` (
`trackid`,`name`,`email`,`category`,`priority`,`subject`,`message`,`dt`,`lastchange`,`ip`,`status`,`attachments`,`custom1`,`custom2`,`custom3`,`custom4`,`custom5`
)
VALUES (
'$trackingID','$name','$email','$category','$priority','$subject','$message',NOW(),NOW(),'email','0','','','','','',''
)";
$result = hesk_dbQuery($sql);
/* Get e-mail message for customer */
$msg = hesk_getEmailMessage('new_ticket');
$msg = str_replace('%%NAME%%',hesk_msgToPlain($name,1),$msg);
$msg = str_replace('%%SUBJECT%%',hesk_msgToPlain($subject,1),$msg);
$msg = str_replace('%%TRACK_ID%%',$trackingID,$msg);
$msg = str_replace('%%TRACK_URL%%',$trackingURL,$msg);
$msg = str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'],$msg);
$msg = str_replace('%%SITE_URL%%',$hesk_settings['site_url'],$msg);
$msg = str_replace('%%MESSAGE%%',hesk_msgToPlain($message,1),$msg);
/* Send e-mail */
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['ticket_received']." - TrackingID: $trackingID",$msg,$headers);
/* Need to notify any admins? */
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `notify_new_unassigned`='1'";
$result = hesk_dbQuery($sql);
while ($myuser=hesk_dbFetchAssoc($result))
{
/* Is this an administrator? */
if ($myuser['isadmin']) {$admins[]=$myuser['email']; continue;}
/* Not admin, is he allowed this category? */
$cat=substr($myuser['categories'], 0, -1);
$myuser['categories']=explode(',',$cat);
if (in_array($category,$myuser['categories']))
{
$admins[]=$myuser['email']; continue;
}
}
if (count($admins)>0)
{
$trackingURL_admin=$hesk_settings['hesk_url'].'/admin/admin_ticket.php?track='.$trackingID;
$msg = hesk_getEmailMessage('new_ticket_staff');
$msg = str_replace('%%NAME%%',hesk_msgToPlain($name,1),$msg);
$msg = str_replace('%%SUBJECT%%',hesk_msgToPlain($subject,1),$msg);
$msg = str_replace('%%TRACK_ID%%',$trackingID,$msg);
$msg = str_replace('%%TRACK_URL%%',$trackingURL_admin,$msg);
$msg = str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'],$msg);
$msg = str_replace('%%SITE_URL%%',$hesk_settings['site_url'],$msg);
$msg = str_replace('%%MESSAGE%%',hesk_msgToPlain($message,1),$msg);
/* Send e-mail to staff */
$email=implode(',',$admins);
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['new_ticket_submitted'],$msg,$headers);
}
echo "<h3>Creando nuevo ticked: $trackingID</h3>";
}
function createNewReply($subject, $name, $email, $date, $message, $trackingID)
{
global $hesk_settings, $hesklang;
$trackingID = trim($trackingID);
$trackingURL = $hesk_settings['hesk_url'].'/ticket.php?track='.$trackingID;
$sql = "SELECT id FROM `hesk_tickets` WHERE trackid='$trackingID'";
$result = hesk_dbQuery($sql) or hesk_error("$hesklang[cant_sql]: $sql</p><p>$hesklang[mysql_said]:<br>".mysql_error()."</p><p>$hesklang[contact_webmsater] $hesk_settings[webmaster_mail]");
$data = hesk_dbFetchAssoc($result);
$replyto = $data["id"];
/* Make sure the ticket is open */
$sql = "UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `status`='1',`lastreplier`='0',`lastchange`=NOW() WHERE `id`=".hesk_dbEscape($replyto)." LIMIT 1";
$result = hesk_dbQuery($sql);
/* Add reply */
$sql = "
INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` (
`replyto`,`name`,`message`,`dt`
)
VALUES (
'".hesk_dbEscape($replyto)."',
'".hesk_dbEscape($name)."',
'".hesk_dbEscape($message)."',
NOW()
)
";
$result = hesk_dbQuery($sql);
/* Need to notify any admins? */
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `notify`='1'";
$result = hesk_dbQuery($sql);
while ($myuser=hesk_dbFetchAssoc($result))
{
/* Is this an administrator? */
if ($myuser['isadmin']) {$admins[]=$myuser['email']; continue;}
/* Not admin, is he allowed this category? */
$cat=substr($myuser['categories'], 0, -1);
$myuser['categories']=explode(",",$cat);
if (in_array($category,$myuser['categories']))
{
$admins[]=$myuser['email']; continue;
}
}
if (count($admins)>0)
{
/* Prepare ticket message for the e-mail */
$message = hesk_msgToPlain($message,1);
$trackingURL_admin = $hesk_settings['hesk_url'].'/admin/admin_ticket.php?track='.$trackingID;
$msg = hesk_getEmailMessage('new_reply_by_customer');
$msg = str_replace('%%NAME%%',$name,$msg);
$msg = str_replace('%%SUBJECT%%',$subject,$msg);
$msg = str_replace('%%TRACK_ID%%',$trackingID,$msg);
$msg = str_replace('%%TRACK_URL%%',$trackingURL_admin,$msg);
$msg = str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'],$msg);
$msg = str_replace('%%SITE_URL%%',$hesk_settings['site_url'],$msg);
$msg = str_replace('%%MESSAGE%%',$message,$msg);
/* Send e-mail to staff */
$email=implode(',',$admins);
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['new_reply_ticket'],$msg,$headers);
}
echo "<h3>Creando respuesta para: $trackingID</h3>";
}
I am experiencing the exact same issue regarding the e-mail variables. Anybody got a fix yet?lupolo wrote:The Gmail fix:
/*
$host = "{".$server.":143/imap/novalidate-cert}"."INBOX";
*/
$host = "{".$server.":993/imap/ssl/novalidate-cert}"."INBOX";
Other Question,
The email to the customer and staff doesent contain the tracking number, and extra info, what could be the problem, why it issent copyed into the mail?
attributed that doesent work:
1. %%TRACK_URL%%
2. %%TRACK_ID%%
3. %%NAME%%
4. %%MESSAGE%%
ruffmeister wrote:Hi there,
we use an internal exchange server and i keep getting cannot connect to the mailbox errors, however when i telnet the server with the details which are listed in the imap.php script it works and i can login but the imap.php wont login.
ANy ideas?
Code: Select all
<?php
////////////////////////////////////////// Settings //////////////////////////////////////////
$server = "imap.gmail.com"; // mail server.
$user = "xxxxxxxx@gmail.com"; // Mail Username
$password = "xxxxxxxx"; // Mail Password
$delete = "Y"; // if delete is Y then processed mail will be deleted
$debug = "1"; // Display Notices about in/outgoing emails 1 = on | 0 = off
$category = "19"; // Hesk Category ID to trow all emails in
$priority = "3"; // 3=Low 2=Medium 1=High
/////////////////////////////////////////////////////////////////////////////////////////////
define('IN_SCRIPT',1);
define('HESK_PATH','');
if (!function_exists('imap_open')) die("IMAP functions are not available.");
if ($debug==1) error_reporting(E_ALL); else error_reporting(0);
// Get all the required files and functions
require(HESK_PATH . 'hesk_settings.inc.php');
require(HESK_PATH . 'inc/common.inc.php');
require(HESK_PATH . 'inc/email_functions.inc.php');
// Connect to database
require(HESK_PATH . 'inc/database.inc.php');
hesk_dbConnect() or hesk_error("$hesklang[cant_connect_db] $hesklang[contact_webmsater] $hesk_settings[webmaster_mail]!");
$host = "{".$server.":993/imap/ssl/novalidate-cert}"."INBOX";
$msgStream = imap_open($host, $user, $password) or die("<br><br><b>Error: Can't connect to mailbox</b>");
$check = imap_mailboxmsginfo($msgStream);
$number = $check->Nmsgs;
$msgNumber = "1";
if (!$number) echo "<h1>No hay nuevos mensajes</h1>";
while ($msgNumber <= $number) {
list($subject, $name, $email, $date, $message, $trackingID) = getMessage($msgStream, $msgNumber);
if (!$trackingID) {
$trackingID = createNewTicket($subject, $name, $email, $date, $message);
} else {
createNewReply($subject, $name, $email, $date, $message, $trackingID);
}
if ($delete == "Y") imap_delete($msgStream, $msgNumber); // mark the current message for deletion
$msgNumber++;
}
if ($delete == "Y") imap_expunge($msgStream); // delete all messages marked for deletion
imap_close($msgStream);
// Functions
function getHeader($msgStream, $msgNumber) {
// strips the mail header and places everything in an array .. like from name, from email, date and subject
$mailheader = imap_headerinfo($msgStream, $msgNumber);
$headerArray = array();
$headerArray[0] = $mailheader->subject;
$from = $mailheader->from;
foreach ($from as $id => $object) {
$headerArray[1] = $object->personal; // from personal
$headerArray[2] = $object->mailbox . "@" . $object->host; // from address
}
$headerArray[3] = $mailheader->Date;
return $headerArray;
}
function extractPlain($msgStream, $msgNumber, $st = null, $num = "")
{
// pull the plain text for message $n
if (!$st) $st = imap_fetchstructure($msgStream, $msgNumber);
if (!empty($st->parts)) {
for ($i = 0, $j = count($st->parts); $i < $j; $i++) {
$part = $st->parts[$i];
if ($part->subtype == 'PLAIN') {
return imap_fetchbody($msgStream, $msgNumber, $num.($i+1));
}
if (!empty($part->parts)) {
$body = extractPlain($msgStream, $msgNumber, $part, ($i+1).".");
if ($body) return $body;
}
}
} else {
return imap_body($msgStream, $msgNumber);
}
}
function getMessage($msgStream, $msgNumber)
{
// pull the plain text for message $n
$message = nl2br(extractPlain($msgStream, $msgNumber));
$headerArray = getHeader($msgStream, $msgNumber);
$subject = htmlentities(addslashes($headerArray[0]));
$name = htmlentities(addslashes($headerArray[1]));
$email = htmlentities($headerArray[2]);
$date = htmlentities($headerArray[3]);
$txt = "";
if (preg_match("/- TrackingID: (.*)/", $subject, $matches)) {
$trackingID = $matches[1];
}
foreach (imap_mime_header_decode($name) as $item) $txt .= $item->text;
$name = $txt;
return array($subject, $name, $email, $date, $message, $trackingID);
}
function generateTrackingID()
{
// Generate tracking ID
$useChars='AEUYBDGHJLMNPQRSTVWXZ123456789';
$trackingID = $useChars{mt_rand(0,29)};
for($i=1;$i<10;$i++) $trackingID .= $useChars{mt_rand(0,29)};
return $trackingID;
}
function createNewTicket($subject, $name, $email, $date, $message)
{
global $category, $priority, $hesk_settings, $hesklang;
$trackingID = generateTrackingID();
$trackingURL = $hesk_settings['hesk_url'].'/ticket.php?track='.$trackingID;
if (get_magic_quotes_gpc()) {$message = stripslashes($message);};
$sql = "INSERT INTO `hesk_tickets` (`trackid`,`name`,`email`,`category`,`priority`,`subject`,`message`,`dt`,`lastchange`,`ip`,`status`,`attachments`,`custom1`,`custom2`,`custom3`,`custom4`,`custom5`) VALUES ('$trackingID','$name','$email','$category','$priority','$subject','".mysql_real_escape_string($message)."',NOW(),NOW(),'email','0','','','','','','')";
$result = hesk_dbQuery($sql);
/* Get e-mail message for customer */
$msg = hesk_getEmailMessage('new_ticket');
$msg = str_replace('%%NAME%%',hesk_msgToPlain($name,1),$msg);
$msg = str_replace('%%SUBJECT%%',hesk_msgToPlain($subject,1),$msg);
$msg = str_replace('%%TRACK_ID%%',$trackingID,$msg);
$msg = str_replace('%%TRACK_URL%%',$trackingURL,$msg);
$msg = str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'],$msg);
$msg = str_replace('%%SITE_URL%%',$hesk_settings['site_url'],$msg);
$msg = str_replace('%%MESSAGE%%',hesk_msgToPlain($message,1),$msg);
/* Send e-mail */
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['ticket_received']." - TrackingID: $trackingURL",$msg,$headers);
/* Need to notify any admins? */
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `notify_new_unassigned`='1'";
$result = hesk_dbQuery($sql);
while ($myuser=hesk_dbFetchAssoc($result))
{
/* Is this an administrator? */
if ($myuser['isadmin']) {$admins[]=$myuser['email']; continue;}
/* Not admin, is he allowed this category? */
$cat=substr($myuser['categories'], 0, -1);
$myuser['categories']=explode(',',$cat);
if (in_array($category,$myuser['categories']))
{
$admins[]=$myuser['email']; continue;
}
}
if (count($admins)>0)
{
$trackingURL_admin=$hesk_settings['hesk_url'].'/admin/admin_ticket.php?track='.$trackingID;
$msg = hesk_getEmailMessage('new_ticket_staff');
$msg = str_replace('%%NAME%%',hesk_msgToPlain($name,1),$msg);
$msg = str_replace('%%SUBJECT%%',hesk_msgToPlain($subject,1),$msg);
$msg = str_replace('%%TRACK_ID%%',$trackingID,$msg);
$msg = str_replace('%%TRACK_URL%%',$trackingURL_admin,$msg);
$msg = str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'],$msg);
$msg = str_replace('%%SITE_URL%%',$hesk_settings['site_url'],$msg);
$msg = str_replace('%%MESSAGE%%',hesk_msgToPlain($message,1),$msg);
/* Send e-mail to staff */
$email=implode(',',$admins);
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['new_ticket_submitted'],$msg,$headers);
}
echo "<h3>Nieuwe ticket aangemaakt met Tracking ID: $trackingID</h3>";
}
function createNewReply($subject, $name, $email, $date, $message, $trackingID)
{
global $hesk_settings, $hesklang;
$trackingID = trim($trackingID);
$trackingURL = $hesk_settings['hesk_url'].'/ticket.php?track='.$trackingID;
$sql = "SELECT id FROM `hesk_tickets` WHERE trackid='$trackingID'";
$result = hesk_dbQuery($sql) or hesk_error("$hesklang[cant_sql]: $sql</p><p>$hesklang[mysql_said]:<br>".mysql_error()."</p><p>$hesklang[contact_webmsater] $hesk_settings[webmaster_mail]");
$data = hesk_dbFetchAssoc($result);
$replyto = $data["id"];
/* Make sure the ticket is open */
$sql = "UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `status`='1',`lastreplier`='0',`lastchange`=NOW() WHERE `id`=".hesk_dbEscape($replyto)." LIMIT 1";
$result = hesk_dbQuery($sql);
/* Add reply */
$sql = "
INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` (
`replyto`,`name`,`message`,`dt`
)
VALUES (
'".hesk_dbEscape($replyto)."',
'".hesk_dbEscape($name)."',
'".hesk_dbEscape($message)."',
NOW()
)
";
$result = hesk_dbQuery($sql);
/* Need to notify any admins? */
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `notify`='1'";
$result = hesk_dbQuery($sql);
while ($myuser=hesk_dbFetchAssoc($result))
{
/* Is this an administrator? */
if ($myuser['isadmin']) {$admins[]=$myuser['email']; continue;}
/* Not admin, is he allowed this category? */
$cat=substr($myuser['categories'], 0, -1);
$myuser['categories']=explode(",",$cat);
if (in_array($category,$myuser['categories']))
{
$admins[]=$myuser['email']; continue;
}
}
if (count($admins)>0)
{
/* Prepare ticket message for the e-mail */
$message = hesk_msgToPlain($message,1);
$trackingURL_admin = $hesk_settings['hesk_url'].'/admin/admin_ticket.php?track='.$trackingID;
$msg = hesk_getEmailMessage('new_reply_by_customer');
$msg = str_replace('%%NAME%%',$name,$msg);
$msg = str_replace('%%SUBJECT%%',$subject,$msg);
$msg = str_replace('%%TRACK_ID%%',$trackingID,$msg);
$msg = str_replace('%%TRACK_URL%%',$trackingURL_admin,$msg);
$msg = str_replace('%%SITE_TITLE%%',$hesk_settings['site_title'],$msg);
$msg = str_replace('%%SITE_URL%%',$hesk_settings['site_url'],$msg);
$msg = str_replace('%%MESSAGE%%',$message,$msg);
/* Send e-mail to staff */
$email=implode(',',$admins);
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['new_reply_ticket'],$msg,$headers);
}
echo "<h3>Creando respuesta para: $trackingID</h3>";
}
Code: Select all
<?php
////////////////////////////////////////// Settings //////////////////////////////////////////
$server = "pop.domaine.com"; //mail server.
$user = "mail@domaine.com"; // Mail Username
$password = STRONGPASSWORD"; // Mail Password
$unreadonly = "N"; // if unreadonly is Y then process unread mail only
$delete = "Y"; // if delete is Y then processed mail will be deleted
$debug = "0"; // Display Notices about in/outgoing emails 1 = on | 0 = off
$category = "1"; // Hesk Category ID to trow all emails in
$priority = "3"; // 3=Low 2=Medium 1=High
/////////////////////////////////////////////////////////////////////////////////////////////
define('IN_SCRIPT',1);
define('HESK_PATH','');
if (!function_exists('imap_open')) die("IMAP functions are not available.");
if ($debug==1) error_reporting(E_ALL); else error_reporting(0);
// Get all the required files and functions
require(HESK_PATH . 'hesk_settings.inc.php');
require(HESK_PATH . 'inc/common.inc.php');
require(HESK_PATH . 'inc/email_functions.inc.php');
// Connect to database
require(HESK_PATH . 'inc/database.inc.php');
hesk_dbConnect() or hesk_error("$hesklang[cant_connect_db] $hesklang[contact_webmsater] $hesk_settings[webmaster_mail]!");
// $host = "{".$server.":143}"."INBOX";
$host = "{".$server.":993/imap/ssl/novalidate-cert}"."INBOX";
$conn = imap_open($host, $user, $password) or die("<br><br><b>Error: Can't connect to mailbox</b>");
$check = imap_mailboxmsginfo($conn);
if ($unreadonly == "Y") {
$msgnos = imap_search($conn, 'UNSEEN');
} else {
$msgnos = imap_search($conn, 'ALL');
}
foreach ($msgnos as $msgno) {
list($subject, $name, $email, $date, $message, $trackingID) = getMessage($conn, $msgno);
if (!$trackingID) {
$trackingID = hesk_createID(); // create new trackingID
$myattachments = create_attachment($conn, $msgno, $trackingID ); // create attachement
$trackingID = createNewTicket($subject, $name, $email, $date, $message, $trackingID ,$myattachments );
} else {
$myattachments = create_attachment($conn, $msgno, $trackingID );
createNewReply($subject, $name, $email, $date, $message, $trackingID, $myattachments);
}
if ($delete == "Y") imap_delete($conn, $msgno); // mark the current message for deletion
}
if ($delete == "Y") imap_expunge($conn); // delete all messages marked for deletion
imap_close($conn);
function extract_attachments($connection, $message_number) {
$structure = imap_fetchstructure($connection, $message_number);
$attachments = array();
if(isset($structure->parts) && count($structure->parts)) {
for($i = 0; $i < count($structure->parts); $i++) {
$attachments[$i] = array(
'is_attachment' => false,
'filename' => '',
'name' => '',
'attachment' => ''
);
if($structure->parts[$i]->ifdparameters) {
foreach($structure->parts[$i]->dparameters as $object) {
if(strtolower($object->attribute) == 'filename') {
$attachments[$i]['is_attachment'] = true;
$tmpfrom = imap_mime_header_decode($object->value);
$attachments[$i]['filename'] = quoted_printable_decode($tmpfrom[0]->text);
}
}
}
if($structure->parts[$i]->ifparameters) {
foreach($structure->parts[$i]->parameters as $object) {
if(strtolower($object->attribute) == 'name') {
$attachments[$i]['is_attachment'] = true;
$tmpfrom = imap_mime_header_decode($object->value);
$attachments[$i]['name'] = quoted_printable_decode($tmpfrom[0]->text);
}
}
}
if($attachments[$i]['is_attachment']) {
$attachments[$i]['attachment'] = imap_fetchbody($connection, $message_number, $i+1);
if($structure->parts[$i]->encoding == 3) { // 3 = BASE64
$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
}
elseif($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE
$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
}
}
}
}
return $attachments;
}
// Functions
function getHeader($msgStream, $msgNumber) {
// strips the mail header and places everything in an array .. like from name, from email, date and subject
$mailheader = imap_headerinfo($msgStream, $msgNumber);
$headerArray = array();
$headerArray[0] = $mailheader->subject;
$from = $mailheader->from;
foreach ($from as $id => $object) {
$headerArray[1] = $object->personal; // from personal
$headerArray[2] = $object->mailbox . "@" . $object->host; // from address
}
$headerArray[3] = $mailheader->Date;
return $headerArray;
}
function extractPlain($msgStream, $msgNumber, $st = null, $num = "")
{
// pull the plain text for message $n
if (!$st) $st = imap_fetchstructure($msgStream, $msgNumber);
if (!empty($st->parts)) {
for ($i = 0, $j = count($st->parts); $i < $j; $i++) {
$part = $st->parts[$i];
if ($part->subtype == 'PLAIN') {
return imap_fetchbody($msgStream, $msgNumber, $num.($i+1));
}
if (!empty($part->parts)) {
$body = extractPlain($msgStream, $msgNumber, $part, ($i+1).".");
if ($body) return $body;
}
}
} else {
return imap_body($msgStream, $msgNumber);
}
}
function getMessage($msgStream, $msgNumber)
{
// pull the plain text for message $n
$message = mimeDecode(nl2br(extractPlain($msgStream, $msgNumber)));
$headerArray = getHeader($msgStream, $msgNumber);
$subject = mimeDecode(htmlentities(addslashes($headerArray[0])));
$name = mimeDecode(htmlentities(addslashes($headerArray[1])));
$email = htmlentities($headerArray[2]);
$date = htmlentities($headerArray[3]);
$txt = "";
if (preg_match("/- TrackingID: (.*)/", $subject, $matches)) {
$trackingID = $matches[1];
}
return array($subject, $name, $email, $date, $message, $trackingID);
}
function mimeDecode($string)
{
$tmpfrom = imap_mime_header_decode($string);
return quoted_printable_decode($tmpfrom[0]->text);
}
function createNewTicket($subject, $name, $email, $date, $message, $trackingID, $attachments)
{
global $category, $priority, $hesk_settings, $hesklang;
$trackingURL = $hesk_settings['hesk_url'].'/ticket.php?track='.$trackingID;
if (get_magic_quotes_gpc()) {$message = stripslashes($message);};
$sql = "INSERT INTO `hesk_tickets` (`trackid`,`name`,`email`,`category`,`priority`,`subject`,`message`,`dt`,`lastchange`,`ip`,`status`,`attachments`,`custom1`,`custom2`,`custom3`,`custom4`,`custom5`) VALUES ('$trackingID','$name','$email','$category','$priority','$subject','".mysql_real_escape_string($message)."',NOW(),NOW(),'email','0','$attachments','','','','','')";
$result = hesk_dbQuery($sql);
/* Get e-mail message for customer */
$ticket = array(
'name' => hesk_msgToPlain($name,1),
'subject' => hesk_msgToPlain($subject,1),
'trackid' => $trackingID,
'category' => $category,
'priority' => $priority,
'message' => hesk_msgToPlain($message,1)
);
$msg = hesk_getEmailMessage('new_ticket',$ticket);
/* Send e-mail */
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['ticket_received']." - TrackingID: $trackingID",$msg,$headers);
/* Need to notify any admins? */
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `notify_new_unassigned`='1'";
$result = hesk_dbQuery($sql);
while ($myuser=hesk_dbFetchAssoc($result))
{
/* Is this an administrator? */
if ($myuser['isadmin']) {$admins[]=$myuser['email']; continue;}
/* Not admin, is he allowed this category? */
$cat=substr($myuser['categories'], 0, -1);
$myuser['categories']=explode(',',$cat);
if (in_array($category,$myuser['categories']))
{
$admins[]=$myuser['email']; continue;
}
}
if (count($admins)>0)
{
$trackingURL_admin=$hesk_settings['hesk_url'].'/admin/admin_ticket.php?track='.$trackingID;
$ticket = array(
'name' => hesk_msgToPlain($name,1),
'subject' => hesk_msgToPlain($subject,1),
'trackid' => $trackingID,
'category' => $category,
'priority' => $priority,
'message' => hesk_msgToPlain($message,1)
);
$msg = hesk_getEmailMessage('new_ticket_staff',$ticket);
/* Send e-mail to staff */
$email=implode(',',$admins);
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['new_ticket_submitted'],$msg,$headers);
}
echo "<h3>New ticket : $trackingID</h3>";
return $trackingID;
}
function createNewReply($subject, $name, $email, $date, $message, $trackingID, $attachments)
{
global $hesk_settings, $hesklang;
$trackingID = trim($trackingID);
$trackingURL = $hesk_settings['hesk_url'].'/ticket.php?track='.$trackingID;
$sql = "SELECT id FROM `hesk_tickets` WHERE trackid='$trackingID'";
$result = hesk_dbQuery($sql) or hesk_error("$hesklang[cant_sql]: $sql</p><p>$hesklang[mysql_said]:<br>".mysql_error()."</p><p>$hesklang[contact_webmsater] $hesk_settings[webmaster_mail]");
$data = hesk_dbFetchAssoc($result);
$replyto = $data["id"];
/* Make sure the ticket is open */
$sql = "UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `status`='1',`lastreplier`='0',`lastchange`=NOW() WHERE `id`=".hesk_dbEscape($replyto)." LIMIT 1";
$result = hesk_dbQuery($sql);
/* Add reply */
$sql = "
INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` (
`replyto`,`name`,`message`,`dt`,`attachments`
)
VALUES (
'".hesk_dbEscape($replyto)."',
'".hesk_dbEscape($name)."',
'".hesk_dbEscape($message)."',
NOW(),
'".hesk_dbEscape($attachments)."'
)
";
$result = hesk_dbQuery($sql);
/* Need to notify any admins? */
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `notify_reply_my`='1'";
$result = hesk_dbQuery($sql);
while ($myuser=hesk_dbFetchAssoc($result))
{
/* Is this an administrator? */
if ($myuser['isadmin']) {$admins[]=$myuser['email']; continue;}
/* Not admin, is he allowed this category? */
$cat=substr($myuser['categories'], 0, -1);
$myuser['categories']=explode(",",$cat);
if (in_array($category,$myuser['categories']))
{
$admins[]=$myuser['email']; continue;
}
}
if (count($admins)>0)
{
/* Prepare ticket message for the e-mail */
$message = hesk_msgToPlain($message,1);
$trackingURL_admin = $hesk_settings['hesk_url'].'/admin/admin_ticket.php?track='.$trackingID;
$ticket = array(
'name' => hesk_msgToPlain($name,1),
'subject' => hesk_msgToPlain($subject,1),
'trackid' => $trackingID,
'category' => $category,
'priority' => $priority,
'message' => hesk_msgToPlain($message,1)
);
$msg = hesk_getEmailMessage('new_reply_by_customer', $ticket);
/* Send e-mail to staff */
$email=implode(',',$admins);
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['new_reply_ticket'],$msg,$headers);
}
echo "<h3>new answer for ticket : $trackingID</h3>";
}
/*
* Extract Attachment from mail
* and create in Hesk Database
*/
function create_attachment($conn, $uid, $trackingID)
{
global $hesk_settings, $hesklang;
$trackingID = trim($trackingID);
$myattachments = '';
$attachments = extract_attachments($conn, $uid);
for($i = 0; $i < count($attachments); $i++) {
if ($attachments[$i]['is_attachment'] == true) {
$attachment = save_file($attachments[$i]);
if (!empty($attachment))
{
$sql = "INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."attachments` (`ticket_id`,`saved_name`,`real_name`,`size`) VALUES (
'".hesk_dbEscape($trackingID)."',
'".hesk_dbEscape($attachment['saved_name'])."',
'".hesk_dbEscape($attachment['real_name'])."',
'".hesk_dbEscape($attachment['size'])."'
)";
$result = hesk_dbQuery($sql);
$myattachments .= hesk_dbInsertID() . '#' . $attachment['real_name'] .',';
}
}
}
return $myattachments;
}
/*
* Save Attachment to disk
*/
function save_file($attachement)
{
global $hesk_settings, $hesklang, $trackingID, $hesk_error_buffer;
#$hesk_error_buffer .= '<br>BBBBBBBBBB';
/* Return if name is empty */
if (empty($attachement['name'])) {return '';}
/* Check file extension */
$ext = strtolower(strrchr($attachement['name'], "."));
if ( ! in_array($ext,$hesk_settings['attachments']['allowed_types']))
{
return hesk_fileError(sprintf($hesklang['type_not_allowed'],$attachement['name'][$i]));
}
/* Check file size */
if (strlen($attachement['attachment']) > ($hesk_settings['attachments']['max_size']*1024))
{
return hesk_fileError(sprintf($hesklang['file_too_large'],$attachement['name']));
}
else
{
$file_size = strlen($attachement['attachment']);
}
/* Generate a random file name */
$file_realname = str_replace(array('/','\\','#',',',' '), array('','','','','_'),$attachement['name']);
$useChars='AEUYBDGHJLMNPQRSTVWXZ123456789';
$tmp = $useChars{mt_rand(0,29)};
for($j=1;$j<10;$j++)
{
$tmp .= $useChars{mt_rand(0,29)};
}
if (defined('KB'))
{
$file_name = substr(md5($tmp . $file_realname), 0, 200) . $ext;
}
else
{
$file_name = substr($trackingID . '_' . md5($tmp . $file_realname), 0, 200) . $ext;
}
/* Save file */
$fh = fopen($hesk_settings['server_path'].'/attachments/'.$file_name, 'w') or die("<br><br><b>can't open file</b>");
fwrite($fh, $attachement['attachment']);
fclose($fh);
$info = array(
'saved_name'=> $file_name,
'real_name' => $file_realname,
'size' => $file_size
);
return $info;
}
?>
Code: Select all
in function createNewTicket()
/* Need to notify any admins? */
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `notify_new_unassigned`='1'";
$result = hesk_dbQuery($sql);
while ($myuser=hesk_dbFetchAssoc($result))
Code: Select all
<?php
////////////////////////////////////////// Settings //////////////////////////////////////////
$server = "pop.domaine.com"; //mail server.
$user = "mail@domaine.com"; // Mail Username
$password = "STRONGPASSWORD"; // Mail Password
$unreadonly = "N"; // if unreadonly is Y then process unread mail only
$delete = "Y"; // if delete is Y then processed mail will be deleted
$debug = "0"; // Display Notices about in/outgoing emails 1 = on | 0 = off
$category = "1"; // Hesk Category ID to trow all emails in
$priority = "3"; // 3=Low 2=Medium 1=High
/////////////////////////////////////////////////////////////////////////////////////////////
define('IN_SCRIPT',1);
define('HESK_PATH','');
if (!function_exists('imap_open')) die("IMAP functions are not available.");
if ($debug==1) error_reporting(E_ALL); else error_reporting(0);
// Get all the required files and functions
require(HESK_PATH . 'hesk_settings.inc.php');
require(HESK_PATH . 'inc/common.inc.php');
require(HESK_PATH . 'inc/email_functions.inc.php');
// Connect to database
require(HESK_PATH . 'inc/database.inc.php');
hesk_dbConnect() or hesk_error("$hesklang[cant_connect_db] $hesklang[contact_webmsater] $hesk_settings[webmaster_mail]!");
// $host = "{".$server.":143}"."INBOX";
$host = "{".$server.":993/imap/ssl/novalidate-cert}"."INBOX";
$conn = imap_open($host, $user, $password) or die("<br><br><b>Error: Can't connect to mailbox</b>");
$check = imap_mailboxmsginfo($conn);
if ($unreadonly == "Y") {
$msgnos = imap_search($conn, 'UNSEEN');
} else {
$msgnos = imap_search($conn, 'ALL');
}
foreach ($msgnos as $msgno) {
list($subject, $name, $email, $date, $message, $trackingID) = getMessage($conn, $msgno);
if (!$trackingID) {
$trackingID = hesk_createID(); // create new trackingID
$myattachments = create_attachment($conn, $msgno, $trackingID ); // create attachement
$trackingID = createNewTicket($subject, $name, $email, $date, $message, $trackingID ,$myattachments );
} else {
$myattachments = create_attachment($conn, $msgno, $trackingID );
createNewReply($subject, $name, $email, $date, $message, $trackingID, $myattachments);
}
if ($delete == "Y") imap_delete($conn, $msgno); // mark the current message for deletion
}
if ($delete == "Y") imap_expunge($conn); // delete all messages marked for deletion
imap_close($conn);
function extract_attachments($connection, $message_number) {
$structure = imap_fetchstructure($connection, $message_number);
$attachments = array();
if(isset($structure->parts) && count($structure->parts)) {
for($i = 0; $i < count($structure->parts); $i++) {
$attachments[$i] = array(
'is_attachment' => false,
'filename' => '',
'name' => '',
'attachment' => ''
);
if($structure->parts[$i]->ifdparameters) {
foreach($structure->parts[$i]->dparameters as $object) {
if(strtolower($object->attribute) == 'filename') {
$attachments[$i]['is_attachment'] = true;
$tmpfrom = imap_mime_header_decode($object->value);
$attachments[$i]['filename'] = quoted_printable_decode($tmpfrom[0]->text);
}
}
}
if($structure->parts[$i]->ifparameters) {
foreach($structure->parts[$i]->parameters as $object) {
if(strtolower($object->attribute) == 'name') {
$attachments[$i]['is_attachment'] = true;
$tmpfrom = imap_mime_header_decode($object->value);
$attachments[$i]['name'] = quoted_printable_decode($tmpfrom[0]->text);
}
}
}
if($attachments[$i]['is_attachment']) {
$attachments[$i]['attachment'] = imap_fetchbody($connection, $message_number, $i+1);
if($structure->parts[$i]->encoding == 3) { // 3 = BASE64
$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
}
elseif($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE
$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
}
}
}
}
return $attachments;
}
// Functions
function getHeader($msgStream, $msgNumber) {
// strips the mail header and places everything in an array .. like from name, from email, date and subject
$mailheader = imap_headerinfo($msgStream, $msgNumber);
$headerArray = array();
$headerArray[0] = $mailheader->subject;
$from = $mailheader->from;
foreach ($from as $id => $object) {
$headerArray[1] = $object->personal; // from personal
$headerArray[2] = $object->mailbox . "@" . $object->host; // from address
}
$headerArray[3] = $mailheader->Date;
return $headerArray;
}
function extractPlain($msgStream, $msgNumber, $st = null, $num = "")
{
// pull the plain text for message $n
if (!$st) $st = imap_fetchstructure($msgStream, $msgNumber);
if (!empty($st->parts)) {
for ($i = 0, $j = count($st->parts); $i < $j; $i++) {
$part = $st->parts[$i];
if ($part->subtype == 'PLAIN') {
return imap_fetchbody($msgStream, $msgNumber, $num.($i+1));
}
if (!empty($part->parts)) {
$body = extractPlain($msgStream, $msgNumber, $part, ($i+1).".");
if ($body) return $body;
}
}
} else {
return imap_body($msgStream, $msgNumber);
}
}
function getMessage($msgStream, $msgNumber)
{
// pull the plain text for message $n
$message = mimeDecode(nl2br(extractPlain($msgStream, $msgNumber)));
$headerArray = getHeader($msgStream, $msgNumber);
$subject = mimeDecode(htmlentities(addslashes($headerArray[0])));
$name = mimeDecode(htmlentities(addslashes($headerArray[1])));
$email = htmlentities($headerArray[2]);
$date = htmlentities($headerArray[3]);
$txt = "";
if (preg_match("/- TrackingID: (.*)/", $subject, $matches)) {
$trackingID = $matches[1];
}
return array($subject, $name, $email, $date, $message, $trackingID);
}
function mimeDecode($string)
{
$tmpfrom = imap_mime_header_decode($string);
return quoted_printable_decode($tmpfrom[0]->text);
}
function createNewTicket($subject, $name, $email, $date, $message, $trackingID, $attachments)
{
global $category, $priority, $hesk_settings, $hesklang;
$trackingURL = $hesk_settings['hesk_url'].'/ticket.php?track='.$trackingID;
if (get_magic_quotes_gpc()) {$message = stripslashes($message);};
$sql = "INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` (`trackid`,`name`,`email`,`category`,`priority`,`subject`,`message`,`dt`,`lastchange`,`ip`,`status`,`attachments`,`custom1`,`custom2`,`custom3`,`custom4`,`custom5`) VALUES ('$trackingID','$name','$email','$category','$priority','$subject','".mysql_real_escape_string($message)."',NOW(),NOW(),'email','0','$attachments','','','','','')";
$result = hesk_dbQuery($sql);
/* Get e-mail message for customer */
$ticket = array(
'name' => hesk_msgToPlain($name,1),
'subject' => hesk_msgToPlain($subject,1),
'trackid' => $trackingID,
'category' => $category,
'priority' => $priority,
'message' => hesk_msgToPlain($message,1)
);
$msg = hesk_getEmailMessage('new_ticket',$ticket);
/* Send e-mail */
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['ticket_received']." - TrackingID: $trackingID",$msg,$headers);
/* Need to notify any admins? */
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `notify_new_unassigned`='1'";
$result = hesk_dbQuery($sql);
while ($myuser=hesk_dbFetchAssoc($result))
{
/* Is this an administrator? */
if ($myuser['isadmin']) {$admins[]=$myuser['email']; continue;}
/* Not admin, is he allowed this category? */
$cat=substr($myuser['categories'], 0, -1);
$myuser['categories']=explode(',',$cat);
if (in_array($category,$myuser['categories']))
{
$admins[]=$myuser['email']; continue;
}
}
if (count($admins)>0)
{
$trackingURL_admin=$hesk_settings['hesk_url'].'/admin/admin_ticket.php?track='.$trackingID;
$ticket = array(
'name' => hesk_msgToPlain($name,1),
'subject' => hesk_msgToPlain($subject,1),
'trackid' => $trackingID,
'category' => $category,
'priority' => $priority,
'message' => hesk_msgToPlain($message,1)
);
$msg = hesk_getEmailMessage('new_ticket_staff',$ticket);
/* Send e-mail to staff */
$email=implode(',',$admins);
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['new_ticket_submitted'],$msg,$headers);
}
echo "<h3>New ticket : $trackingID</h3>";
return $trackingID;
}
function createNewReply($subject, $name, $email, $date, $message, $trackingID, $attachments)
{
global $hesk_settings, $hesklang;
$trackingID = trim($trackingID);
$trackingURL = $hesk_settings['hesk_url'].'/ticket.php?track='.$trackingID;
$sql = "SELECT id FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` WHERE trackid='$trackingID'";
$result = hesk_dbQuery($sql) or hesk_error("$hesklang[cant_sql]: $sql</p><p>$hesklang[mysql_said]:<br>".mysql_error()."</p><p>$hesklang[contact_webmsater] $hesk_settings[webmaster_mail]");
$data = hesk_dbFetchAssoc($result);
$replyto = $data["id"];
/* Make sure the ticket is open */
$sql = "UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `status`='1',`lastreplier`='0',`lastchange`=NOW() WHERE `id`=".hesk_dbEscape($replyto)." LIMIT 1";
$result = hesk_dbQuery($sql);
/* Add reply */
$sql = "
INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` (
`replyto`,`name`,`message`,`dt`,`attachments`
)
VALUES (
'".hesk_dbEscape($replyto)."',
'".hesk_dbEscape($name)."',
'".hesk_dbEscape($message)."',
NOW(),
'".hesk_dbEscape($attachments)."'
)
";
$result = hesk_dbQuery($sql);
/* Need to notify any admins? */
$admins=array();
$sql = "SELECT `email`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `notify_reply_my`='1'";
$result = hesk_dbQuery($sql);
while ($myuser=hesk_dbFetchAssoc($result))
{
/* Is this an administrator? */
if ($myuser['isadmin']) {$admins[]=$myuser['email']; continue;}
/* Not admin, is he allowed this category? */
$cat=substr($myuser['categories'], 0, -1);
$myuser['categories']=explode(",",$cat);
if (in_array($category,$myuser['categories']))
{
$admins[]=$myuser['email']; continue;
}
}
if (count($admins)>0)
{
/* Prepare ticket message for the e-mail */
$message = hesk_msgToPlain($message,1);
$trackingURL_admin = $hesk_settings['hesk_url'].'/admin/admin_ticket.php?track='.$trackingID;
$ticket = array(
'name' => hesk_msgToPlain($name,1),
'subject' => hesk_msgToPlain($subject,1),
'trackid' => $trackingID,
'category' => $category,
'priority' => $priority,
'message' => hesk_msgToPlain($message,1)
);
$msg = hesk_getEmailMessage('new_reply_by_customer', $ticket);
/* Send e-mail to staff */
$email=implode(',',$admins);
$headers = "From: $hesk_settings[noreply_mail]\n";
$headers.= "Reply-to: $hesk_settings[noreply_mail]\n";
$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";
$headers.= "Content-type: text/plain; charset=".$hesklang['ENCODING'];
@mail($email,$hesklang['new_reply_ticket'],$msg,$headers);
}
echo "<h3>new answer for ticket : $trackingID</h3>";
}
/*
* Extract Attachment from mail
* and create in Hesk Database
*/
function create_attachment($conn, $uid, $trackingID)
{
global $hesk_settings, $hesklang;
$trackingID = trim($trackingID);
$myattachments = '';
$attachments = extract_attachments($conn, $uid);
for($i = 0; $i < count($attachments); $i++) {
if ($attachments[$i]['is_attachment'] == true) {
$attachment = save_file($attachments[$i]);
if (!empty($attachment))
{
$sql = "INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."attachments` (`ticket_id`,`saved_name`,`real_name`,`size`) VALUES (
'".hesk_dbEscape($trackingID)."',
'".hesk_dbEscape($attachment['saved_name'])."',
'".hesk_dbEscape($attachment['real_name'])."',
'".hesk_dbEscape($attachment['size'])."'
)";
$result = hesk_dbQuery($sql);
$myattachments .= hesk_dbInsertID() . '#' . $attachment['real_name'] .',';
}
}
}
return $myattachments;
}
/*
* Save Attachment to disk
*/
function save_file($attachement)
{
global $hesk_settings, $hesklang, $trackingID, $hesk_error_buffer;
#$hesk_error_buffer .= '<br>BBBBBBBBBB';
/* Return if name is empty */
if (empty($attachement['name'])) {return '';}
/* Check file extension */
$ext = strtolower(strrchr($attachement['name'], "."));
if ( ! in_array($ext,$hesk_settings['attachments']['allowed_types']))
{
return hesk_fileError(sprintf($hesklang['type_not_allowed'],$attachement['name'][$i]));
}
/* Check file size */
if (strlen($attachement['attachment']) > ($hesk_settings['attachments']['max_size']*1024))
{
return hesk_fileError(sprintf($hesklang['file_too_large'],$attachement['name']));
}
else
{
$file_size = strlen($attachement['attachment']);
}
/* Generate a random file name */
$file_realname = str_replace(array('/','\\','#',',',' '), array('','','','','_'),$attachement['name']);
$useChars='AEUYBDGHJLMNPQRSTVWXZ123456789';
$tmp = $useChars{mt_rand(0,29)};
for($j=1;$j<10;$j++)
{
$tmp .= $useChars{mt_rand(0,29)};
}
if (defined('KB'))
{
$file_name = substr(md5($tmp . $file_realname), 0, 200) . $ext;
}
else
{
$file_name = substr($trackingID . '_' . md5($tmp . $file_realname), 0, 200) . $ext;
}
/* Save file */
$fh = fopen($hesk_settings['server_path'].'/attachments/'.$file_name, 'w') or die("<br><br><b>can't open file</b>");
fwrite($fh, $attachement['attachment']);
fclose($fh);
$info = array(
'saved_name'=> $file_name,
'real_name' => $file_realname,
'size' => $file_size
);
return $info;
}
?>