bcc instead of to in notify

Helpdesk for my helpdesk software

Moderator: mkoch227

Post Reply
IR123
Posts: 5
Joined: Wed Apr 10, 2013 10:51 pm

bcc instead of to in notify

Post by IR123 »

Script URL: www.cheminement.com/plateforme/
Version of script: 2.4.2
Hosting company: HostPapa
URL of phpinfo.php:
URL of session_test.php:
What terms did you try when SEARCHING for a solution: send mail with bcc

Write your message below:

Hello !

I want to send notifies putting the staff emails in bcc instead of to.
I looked through the different .php but can't seem to find where the to is generated (to replace it with bcc).

Any help ?

Thanks !
Ian
Klemen
Site Admin
Posts: 10147
Joined: Fri Feb 11, 2005 4:04 pm

Re: bcc instead of to in notify

Post by Klemen »

Email are generated in the hesk_mail function inside "inc/email_functions.inc.php".

However, make sure you backup any files before making changes!
Klemen, creator of HESK and PHPJunkyardWas this helpful? You can buy me a drink here Image

Image You should follow me on Twitter here

Help desk software | Cloud help desk | Guestbook | Link manager | Click counter | more PHP Scripts ...

Also browse for php hosting companies, read php books, find php resources and use webmaster tools
IR123
Posts: 5
Joined: Wed Apr 10, 2013 10:51 pm

Re: bcc instead of to in notify

Post by IR123 »

Thanks Klemen for making it easier for me, I appreciate !

Now, I went through the email_functions.inc.php file, tested a few options to send emails using the 'bcc' field instead of the 'to' field (to have email addresses hidden from all recipients) and nothing works... :(

Any help ?

Here are the few changes I did ('to' to 'bcc') :

Code: Select all

<?php

/*******************************************************************************

*  Title: Help Desk Software HESK

*  Version: 2.4.2 from 30th December 2012

*  Author: Klemen Stirn

*  Website: http://www.hesk.com

********************************************************************************

*  COPYRIGHT AND TRADEMARK NOTICE

*  Copyright 2005-2012 Klemen Stirn. All Rights Reserved.

*  HESK is a registered trademark of Klemen Stirn.



*  The HESK may be used and modified free of charge by anyone

*  AS LONG AS COPYRIGHT NOTICES AND ALL THE COMMENTS REMAIN INTACT.

*  By using this code you agree to indemnify Klemen Stirn from any

*  liability that might arise from it's use.



*  Selling the code for this program, in part or full, without prior

*  written consent is expressly forbidden.



*  Using this code, in part or full, to create derivate work,

*  new scripts or products is expressly forbidden. Obtain permission

*  before redistributing this software over the Internet or in

*  any other medium. In all cases copyright and header must remain intact.

*  This Copyright is in full effect in any country that has International

*  Trade Agreements with the United States of America or

*  with the European Union.



*  Removing any of the copyright notices without purchasing a license

*  is expressly forbidden. To remove HESK copyright notice you must purchase

*  a license for this script. For more information on how to obtain

*  a license please visit the page below:

*  https://www.hesk.com/buy.php

*******************************************************************************/



/* Check if this is a valid include */

if (!defined('IN_SCRIPT')) {die('Invalid attempt');}





/* Get includes for SMTP */

if ($hesk_settings['smtp'])

{

	require(HESK_PATH . 'inc/mail/smtp.php');

    if (strlen($hesk_settings['smtp_user']) || strlen($hesk_settings['smtp_password']))

	{

		require_once(HESK_PATH . 'inc/mail/sasl/sasl.php');

	}

}





function hesk_notifyCustomer($email_template = 'new_ticket')

{

	global $hesk_settings, $hesklang, $ticket;



	// Demo mode

	if ( defined('HESK_DEMO') )

	{

		return true;

	}



	// Format email subject and message

	$subject = hesk_getEmailSubject($email_template,$ticket);

	$message = hesk_getEmailMessage($email_template,$ticket);



    // If we allow email piping/pop 3 fetching and stripping quoted replies add an "reply above this line" tag

    if ( ($hesk_settings['email_piping'] || $hesk_settings['pop3']) && $hesk_settings['strip_quoted'])

    {

    	$message = $hesklang['EMAIL_HR'] . "\n\n" . $message;

    }



	// Send e-mail

	hesk_mail($ticket['email'], $subject, $message);



    return true;



} // END hesk_notifyCustomer()





function hesk_notifyAssignedStaff($autoassign_owner, $email_template, $type = 'notify_assigned')

{

	global $hesk_settings, $hesklang, $ticket;



	// Demo mode

	if ( defined('HESK_DEMO') )

	{

		return true;

	}



    /* Need to lookup owner info from the database? */

    if ($autoassign_owner === false)

    {

		$sql = "SELECT `email`,`language`,`notify_assigned`,`notify_reply_my` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `id`=" . intval($ticket['owner']) . " LIMIT 1";

		$res = hesk_dbQuery($sql);



        $autoassign_owner = hesk_dbFetchAssoc($res);



		/* If owner selected not to be notified or invalid stop here */

		if ( empty($autoassign_owner[$type]) )

        {

        	return false;

        }

    }



	/* Set new language if required */

    hesk_setLanguage($autoassign_owner['language']);



	/* Format email subject and message for staff */

    $subject = hesk_getEmailSubject($email_template,$ticket);

	$message = hesk_getEmailMessage($email_template,$ticket,1);



	/* Send email to staff */

	hesk_mail($autoassign_owner['email'], $subject, $message);




    /* Reset language to original one */

    hesk_resetLanguage();



    return true;



} // END hesk_notifyAssignedStaff()





function hesk_notifyStaff($email_template,$sql_where,$is_ticket=1)

{

	global $hesk_settings, $hesklang, $ticket;



	// Demo mode

	if ( defined('HESK_DEMO') )

	{

		return true;

	}



	$admins = array();



	$sql = "SELECT `email`,`language`,`isadmin`,`categories` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE $sql_where ORDER BY `language`";

	$res = hesk_dbQuery($sql);

	while ($myuser = hesk_dbFetchAssoc($res))

	{

		/* Is this an administrator? */

		if ($myuser['isadmin'])

		{

			$admins[] = array('email' => $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 );



                    /* 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);

				$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 );



		/* Reset language to original one */

		hesk_resetLanguage();

	}



    return true;



} // END hesk_notifyStaff()





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'],





		/*** 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'],



    );

} // END hesk_validEmails()





function hesk_mail($bcc,$subject,$message)

{

	global $hesk_settings, $hesklang;



	// Demo mode

	if ( defined('HESK_DEMO') )

	{

		return true;

	}



    // We need to use RFC2822 date format for emails

	$save_format = $hesk_settings['timeformat'];

	$hesk_settings['timeformat'] = DATE_RFC2822;



    // Encode subject to UTF-8

    $subject = "=?UTF-8?B?" . base64_encode( hesk_html_entity_decode($subject) ) . "?=";



    // Setup "name <email>" for headers

    if ($hesk_settings['noreply_name'])

    {

    	$hesk_settings['from_header'] = "=?UTF-8?B?" . base64_encode( hesk_html_entity_decode($hesk_settings['noreply_name']) ) . "?= <" . $hesk_settings['noreply_mail'] . ">";

    }

    else

    {

    	$hesk_settings['from_header'] = $hesk_settings['noreply_mail'];

    }



	// Uncomment for debugging

	# echo "<p>TO: $to<br >SUBJECT: $subject<br >MSG: $message</p><p>DATE: ".date($hesk_settings['timeformat'])."</p><p>HESK DATE: ".hesk_date()."</p><p>&nbsp;</p>";

	# return true;



    // Use PHP's mail function

	if ( ! $hesk_settings['smtp'])

    {

    	// Set additional headers

		$headers = "From: $hesk_settings[from_header]\n";

		$headers.= "Reply-To: $hesk_settings[from_header]\n";

		$headers.= "Return-Path: $hesk_settings[webmaster_mail]\n";

		$headers.= "Date: " . hesk_date() . "\n";

		$headers.= "Content-Type: text/plain; charset=" . $hesklang['ENCODING'];



		// Send using PHP mail() function

        ob_start();

		mail($bcc,$subject,$message,$headers);

        $tmp = trim(ob_get_contents());

        ob_end_clean();



        return (strlen($tmp)) ? $tmp : true;

    }



    // Use a SMTP server directly instead

	$smtp = new smtp_class;

	$smtp->host_name	= $hesk_settings['smtp_host_name'];

	$smtp->host_port	= $hesk_settings['smtp_host_port'];

	$smtp->timeout		= $hesk_settings['smtp_timeout'];

    $smtp->ssl			= $hesk_settings['smtp_ssl'];

    $smtp->start_tls	= $hesk_settings['smtp_tls'];

	$smtp->user			= $hesk_settings['smtp_user'];

	$smtp->password		= $hesk_settings['smtp_password'];

    $smtp->debug		= 1;



    // Start output buffering so that any errors don't break headers

    ob_start();



    // Send the e-mail using SMTP

    $bcc_arr = explode(',',$bcc);

	if ( ! $smtp->SendMessage($hesk_settings['noreply_mail'], $to_arr, array(

				"From: $hesk_settings[from_header]",

				"Bcc: $bcc",

                "Reply-To: $hesk_settings[from_header]",

                "Return-Path: $hesk_settings[webmaster_mail]",

				"Subject: " . $subject,

				"Date: " . hesk_date(),

                "Content-Type: text/plain; charset=" . $hesklang['ENCODING']

			), $message))

    {

		// Suppress errors unless we are in debug mode

		if ($hesk_settings['debug_mode'])

		{

			$error = $hesklang['cnsm'] . ' ' . $bcc . '<br /><br />' .

					 $hesklang['error'] . ': ' . htmlspecialchars($smtp->error). '<br /><br />' .

					 '<textarea name="smtp_log" rows="10" cols="60">' . ob_get_contents() . '</textarea>';

			ob_end_clean();

			hesk_error($error);

		}

        else

        {

			$_SESSION['HESK_2ND_NOTICE']  = true;

            $_SESSION['HESK_2ND_MESSAGE'] = $hesklang['esf'] . ' ' . $hesklang['contact_webmsater'] . ' <a href="mailto:' . $hesk_settings['webmaster_mail'] . '">' . $hesk_settings['webmaster_mail'] . '</a>';

        }

    }



    ob_end_clean();



	$hesk_settings['timeformat'] = $save_format;

	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_getCategoryName($ticket['category']);



	/* 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 */

	switch ($ticket['status'])

	{

		case 1:

			$ticket['status'] = $hesklang['wait_reply'];

			break;

		case 2:

			$ticket['status'] = $hesklang['replied'];

			break;

		case 3:

			$ticket['status'] = $hesklang['closed'];

			break;

		case 4:

			$ticket['status'] = $hesklang['in_progress'];

			break;

		case 5:

			$ticket['status'] = $hesklang['on_hold'];

			break;

		default:

			$ticket['status'] = $hesklang['open'];

	}



	/* Replace all special tags */

	$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 */

	$eml_file = 'language/' . $hesk_settings['languages'][$hesk_settings['language']]['folder'] . '/emails/' . $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);

    }



    /* Return just the message without any processing? */

    if ($just_message)

    {

    	return $msg;

    }



    /* If it's not a ticket-related mail (like "a new PM") just process quickly */

    if ( ! $is_ticket)

    {

		$trackingURL = $hesk_settings['hesk_url'] . '/admin/mail.php?a=read&id=' . intval($ticket['id']);



		$msg = str_replace('%%NAME%%',		$ticket['name']					,$msg);

		$msg = str_replace('%%SUBJECT%%',	$ticket['subject']				,$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);



		return $msg;

    }



    /* Generate the ticket URLs */

    $trackingURL = $hesk_settings['hesk_url'];

	$trackingURL.= $is_admin ? '/admin/admin_ticket.php' : '/ticket.php';

    $trackingURL.= '?track='.$ticket['trackid'].'&Refresh='.rand(10000,99999);



 	/* Set category title */

	$ticket['category'] = hesk_getCategoryName($ticket['category']);



	/* 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_getOwnerName($ticket['owner']);



    /* Set status */

	switch ($ticket['status'])

	{

		case 1:

			$ticket['status'] = $hesklang['wait_reply'];

			break;

		case 2:

			$ticket['status'] = $hesklang['replied'];

			break;

		case 3:

			$ticket['status'] = $hesklang['closed'];

			break;

		case 4:

			$ticket['status'] = $hesklang['in_progress'];

			break;

		case 5:

			$ticket['status'] = $hesklang['on_hold'];

			break;

		default:

			$ticket['status'] = $hesklang['open'];

	}



	/* Replace all special tags */

	$msg = str_replace('%%NAME%%',		stripslashes($ticket['name'])	,$msg);

	$msg = str_replace('%%SUBJECT%%',	$ticket['subject']				,$msg);

	$msg = str_replace('%%TRACK_ID%%',	$ticket['trackid']				,$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('%%CATEGORY%%',	$ticket['category']				,$msg);

	$msg = str_replace('%%PRIORITY%%',	$ticket['priority']				,$msg);

    $msg = str_replace('%%OWNER%%',		$ticket['owner']				,$msg);

    $msg = str_replace('%%STATUS%%',	$ticket['status']				,$msg);



	/* All custom fields */

	foreach ($hesk_settings['custom_fields'] as $k=>$v)

	{

		if ($v['use'])

		{

        	if ($v['type'] == 'checkbox')

            {

            	$ticket[$k] = str_replace("<br />","\n",$ticket[$k]);

            }



			$msg = str_replace('%%'.strtoupper($k).'%%',stripslashes($ticket[$k]),$msg);

		}

        else

        {

        	$msg = str_replace('%%'.strtoupper($k).'%%','',$msg);

        }

	}



	/* Message at the end */

	$msg = str_replace('%%MESSAGE%%',$ticket['message'],$msg);



    return $msg;



} // END hesk_getEmailMessage

Klemen
Site Admin
Posts: 10147
Joined: Fri Feb 11, 2005 4:04 pm

Re: bcc instead of to in notify

Post by Klemen »

In HESK settings under "Emails" > "Send emails using" do you have PHP mail() or SMTP server selected?

If it's PHP mail it could be as easy as adding something like

Code: Select all

$headers = "Bcc: $to\n";
just below

Code: Select all

$headers = "From: $hesk_settings[from_header]\n";
Klemen, creator of HESK and PHPJunkyardWas this helpful? You can buy me a drink here Image

Image You should follow me on Twitter here

Help desk software | Cloud help desk | Guestbook | Link manager | Click counter | more PHP Scripts ...

Also browse for php hosting companies, read php books, find php resources and use webmaster tools
IR123
Posts: 5
Joined: Wed Apr 10, 2013 10:51 pm

Re: bcc instead of to in notify

Post by IR123 »

Hello Klemen !

Thanks for the answer, I appreciate your help !

Unfortunately, it does not seems to be that simple since it is still sending emails with all recipients shown in the 'to' field.

I am in PHP mail mode.

Any other idea ??

I am stumped for this one.... !!

All the best !
Ian
Klemen
Site Admin
Posts: 10147
Joined: Fri Feb 11, 2005 4:04 pm

Re: bcc instead of to in notify

Post by Klemen »

Try to also replace

Code: Select all

mail($to,$subject,$message,$headers);
with

Code: Select all

mail('some_default@email.com',$subject,$message,$headers);
Klemen, creator of HESK and PHPJunkyardWas this helpful? You can buy me a drink here Image

Image You should follow me on Twitter here

Help desk software | Cloud help desk | Guestbook | Link manager | Click counter | more PHP Scripts ...

Also browse for php hosting companies, read php books, find php resources and use webmaster tools
IR123
Posts: 5
Joined: Wed Apr 10, 2013 10:51 pm

Re: bcc instead of to in notify

Post by IR123 »

Hello Klemen !

I think it worked !! :D

I switched the 'to' to a specific address, did a test and received the email twice to two different addresses (the one in the new 'to' field and, I am guessing, the one in the 'bcc' field).

I will let you know when I can confirm that all is good.

Thanks à lot for your help, I RREEEEAAAALLLLYYYY appreciate this one ! :D

All the best !
Ian
Post Reply