diff --git a/cron_ticket_email_parser.php b/cron_ticket_email_parser.php index a01281cb..1dc1f6b0 100644 --- a/cron_ticket_email_parser.php +++ b/cron_ticket_email_parser.php @@ -106,7 +106,7 @@ require_once "plugins/php-mime-mail-parser/src/Parser.php"; $allowed_extensions = array('jpg', 'jpeg', 'gif', 'png', 'webp', 'pdf', 'txt', 'md', 'doc', 'docx', 'csv', 'xls', 'xlsx', 'xlsm', 'zip', 'tar', 'gz'); // Function to raise a new ticket for a given contact and email them confirmation (if configured) -function addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message, $attachments) { +function addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message, $attachments, $original_message_file) { // Access global variables global $mysqli,$config_app_name, $company_name, $company_phone, $config_ticket_prefix, $config_ticket_client_general_notifications, $config_ticket_new_ticket_notification_email, $config_base_url, $config_ticket_from_name, $config_ticket_from_email, $config_smtp_host, $config_smtp_port, $config_smtp_encryption, $config_smtp_username, $config_smtp_password, $allowed_extensions; @@ -128,8 +128,19 @@ function addTicket($contact_id, $contact_name, $contact_email, $client_id, $date echo "Created new ticket.
"; mysqli_query($mysqli, "INSERT INTO logs SET log_type = 'Ticket', log_action = 'Create', log_description = 'Email parser: Client contact $contact_email created ticket $config_ticket_prefix$ticket_number ($subject) ($id)', log_client_id = $client_id"); - // Process attachments (after ticket is logged as created) - mkdirMissing('uploads/tickets/'); + // -- Process attachments (after ticket is logged as created because we save to the folder named after the ticket ID) -- + + mkdirMissing('uploads/tickets/'); // Create tickets dir + + // Setup directory for this ticket ID + $att_dir = "uploads/tickets/" . $id . "/"; + mkdirMissing($att_dir); + + // Save original email message as ticket attachment + rename("uploads/tmp/{$original_message_file}", "{$att_dir}/{$original_message_file}"); + mysqli_query($mysqli, "INSERT INTO ticket_attachments SET ticket_attachment_name = 'Original-parsed-email.eml', ticket_attachment_reference_name = '$original_message_file', ticket_attachment_ticket_id = $id"); + + // Process each attachment foreach ($attachments as $attachment) { // Get name and extension @@ -140,10 +151,6 @@ function addTicket($contact_id, $contact_name, $contact_email, $client_id, $date // Check the extension is allowed if (in_array($att_extension, $allowed_extensions)) { - // Setup directory for this ticket ID - $att_dir = "uploads/tickets/" . $id . "/"; - mkdirMissing($att_dir); - // Save attachment with a random name $att_saved_path = $attachment->save($att_dir, Parser::ATTACHMENT_RANDOM_FILENAME); @@ -411,6 +418,11 @@ if ($emails) { // Default false $email_processed = false; + // Save the original email (to be moved later) + mkdirMissing('uploads/tmp/'); // Create tmp dir + $original_message_file = "processed-eml-" . randomString(200) . ".eml"; + imap_savebody($imap, "uploads/tmp/{$original_message_file}", $email); + // Get details from message and invoke PHP Mime Mail Parser $msg_to_parse = imap_fetchheader($imap, $email, FT_PREFETCHTEXT) . imap_body($imap, $email, FT_PEEK); $parser = new PhpMimeMailParser\Parser(); @@ -474,7 +486,7 @@ if ($emails) { $contact_email = sanitizeInput($row['contact_email']); $client_id = intval($row['contact_client_id']); - if (addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message, $attachments)) { + if (addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message, $attachments, $original_message_file)) { $email_processed = true; } @@ -503,7 +515,7 @@ if ($emails) { echo "Created new contact.
"; mysqli_query($mysqli, "INSERT INTO logs SET log_type = 'Contact', log_action = 'Create', log_description = 'Email parser: created contact $contact_name', log_client_id = $client_id"); - if (addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message, $attachments)) { + if (addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message, $attachments, $original_message_file)) { $email_processed = true; } @@ -523,11 +535,16 @@ if ($emails) { imap_setflag_full($imap, $email, "\\Seen"); imap_mail_move($imap, $email, $imap_folder); } else { - // Basically just flags all emails keep them unread and it doesnt move closed tickets + // Basically just flags all emails to be manually checked echo "Failed to process email - flagging for manual review."; imap_setflag_full($imap, $email, "\\Flagged"); } + // Remove temp original message if still there + if (file_exists("uploads/tmp/{$original_message_file}")) { + unlink("uploads/tmp/{$original_message_file}"); + } + } }