2021-04-28 20:10:26 +02:00

1279 lines
46 KiB
PHP

<?php
/*************************************
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
* SPDX-License-Identifier: AGPL-3.0-only
************************************/
/* crmv@2963m */
/** Function used to send email
* $module -- current module
* $to_email -- to email address
* $from_name -- currently loggedin user name
* $from_email -- currently loggedin vte_users's email id. you can give as '' if you are not in HelpDesk module
* $subject -- subject of the email you want to send
* $contents -- body of the email you want to send
* $cc -- add email ids with comma seperated. - optional
* $bcc -- add email ids with comma seperated. - optional.
* $attachment -- whether we want to attach the currently selected file or all vte_files.[values = current,all] - optional
* $emailid -- id of the email object which will be used to get the vte_attachments
*/
function send_mail($module,$to_email,$from_name,$from_email,$subject,$contents,$cc='',$bcc='',$attachment='',$emailid='',$logo='',$newsletter_params='',&$mail_tmp='',$messageid='',$message_mode='',$queue=false, $sendAfter = null) //crmv@22700 crmv@25351 crmv@129149 crmv@131904
{
global $adb, $log, $root_directory, $HELPDESK_SUPPORT_EMAIL_ID, $HELPDESK_SUPPORT_NAME, $send_mail_ow;
// crmv@197876
if (isset($send_mail_ow['to_email'])) $to_email = $send_mail_ow['to_email'];
if (isset($send_mail_ow['cc'])) $cc = $send_mail_ow['cc'];
if (isset($send_mail_ow['bcc'])) $bcc = $send_mail_ow['bcc'];
if (isset($send_mail_ow['subject_prefix'])) $subject = trim($send_mail_ow['subject_prefix']).' '.$subject;
// crmv@197876e
// crmv@129149
$VTEP = VTEProperties::getInstance();
$focusEmails = CRMentity::getInstance('Emails');
if ($queue && $VTEP->getProperty('modules.emails.send_mail_queue')) {
$focusEmails->add2SendNotQueue($to_email, $from_name, $from_email, $subject,
array(
'module'=>$module,
'contents'=>$contents,
'cc'=>$cc,
'bcc'=>$bcc,
'attachment'=>$attachment,
'emailid'=>$emailid,
'logo'=>$logo,
'newsletter_params'=>$newsletter_params,
//&$mail_tmp,
'messageid'=>$messageid,
'message_mode'=>$message_mode
),
$sendAfter // crmv@131904
);
return 1;
}
// crmv@129149e
$adb->println("To id => '".$to_email."'\nSubject ==>'".$subject."'\nContents ==> '".$contents."'");
//Get the email id of assigned_to user -- pass the value and name, name must be "user_name" or "id"(field names of vte_users vte_table)
//$to_email = getUserEmailId('id',$assigned_user_id);
//if module is HelpDesk then from_email will come based on support email id
if($from_email == '')//$module != 'HelpDesk')
$from_email = getUserEmailId('user_name',$from_name);
$mail = new VTEMailer(); // crmv@180739
setMailerProperties($mail,$subject,$contents,$from_email,$from_name,$to_email,$attachment,$emailid,$module,$logo);
//crmv@34245
if($newsletter_params && $newsletter_params['smtp_config']['enable'] === true) {
if($newsletter_params['smtp_config']['smtp_auth'] == "true"){
$mail->SMTPAuth = true; // turn on SMTP authentication
} else {
$mail->SMTPAuth = false; // turn off SMTP authentication
}
$mail->Host = $newsletter_params['smtp_config']['server']; // specify main and backup server
$mail->Username = $newsletter_params['smtp_config']['server_username'] ; // SMTP username
$mail->Password = $newsletter_params['smtp_config']['server_password'] ; // SMTP password
// crmv@114260
if ($newsletter_params['smtp_config']['server_port'] > 0) {
$mail->Port = $newsletter_params['smtp_config']['server_port'];
}
// crmv@114260e
}
//crmv@34245e
if (method_exists($focusEmails, 'overwriteMailConfiguration')) $focusEmails->overwriteMailConfiguration($mail); //crmv@80029
setCCAddress($mail,'cc',$cc);
setCCAddress($mail,'bcc',$bcc);
// vtmailscanner customization: If Support Reply to is defined use it.
global $HELPDESK_SUPPORT_EMAIL_REPLY_ID;
if($HELPDESK_SUPPORT_EMAIL_REPLY_ID && $HELPDESK_SUPPORT_EMAIL_ID != $HELPDESK_SUPPORT_EMAIL_REPLY_ID) {
$mail->addReplyTo($HELPDESK_SUPPORT_EMAIL_REPLY_ID); // crmv@200330
}
// END
// Fix: Return immediately if Outgoing server not configured
if(empty($mail->Host)) {
return 0;
}
// END
//crmv@22700
if ($newsletter_params) {
if ($newsletter_params['sender'] != '') {
$mail->Sender = $newsletter_params['sender'];
$mail->addCustomHeader("Errors-To: ".$newsletter_params['sender']);
}
if ($newsletter_params['newsletterid'] != '') {
$mail->addCustomHeader("X-MessageID: ".$newsletter_params['newsletterid']);
}
if ($newsletter_params['crmid'] != '') {
$mail->addCustomHeader("X-ListMember: ".$newsletter_params['crmid']);
}
// crmv@151474
if ($newsletter_params['reply_to'] != '') {
$mail->ClearReplyTos();
// crmv@200330
$addresses = getAddresses($newsletter_params['reply_to']);
if (!empty($addresses)) {
foreach($addresses as $address) {
$mail->addReplyTo($address[0],$address[1]);
}
}
// crmv@200330e
}
// crmv@151474e
$mail->addCustomHeader("Precedence: bulk");
}
//crmv@22700e
if (!empty($messageid) && in_array($message_mode,array('reply','reply_all','forward'))) {
$focusMessage = CRMentity::getInstance('Messages');
$result = $focusMessage->retrieve_entity_info_no_html($messageid,'Messages',false);
if (empty($result)) { // no errors
$mail->addCustomHeader("In-Reply-To: ".$focusMessage->column_fields['messageid']);
$mail->addCustomHeader("References: ".preg_replace('/\s+/',' ',$focusMessage->column_fields['mreferences']).' '.$focusMessage->column_fields['messageid']); //crmv@131260
//TODO: $mail->addCustomHeader("Thread-Index: ");
}
}
//crmv@174550
if ($newsletter_params && $newsletter_params['debug'] === true) {
$_SMTPDebug_copy = $mail->SMTPDebug;
$mail->SMTPDebug = true;
ob_start();
}
//crmv@174550e
$mail_status = MailSend($mail);
//crmv@174550
if ($newsletter_params && $newsletter_params['debug'] === true) {
$debug = ob_get_contents();
ob_end_clean();
$mail->SMTPDebug = $_SMTPDebug_copy;
if ($mail_status != 1) echo "Error for newsletterid:{$newsletter_params['newsletterid']}, crmid:{$newsletter_params['crmid']}, to_email:{$to_email}. SMTPDebug:\n".$debug;
}
//crmv@174550e
if($mail_status == 1) {
$mail_tmp = $mail;
} else {
$error_string ='Send mail failed! from '.$from_email.' to '.$to_email.' subject '.$subject.' reason:'.$mail_status;
$log->fatal($error_string);
}
$mail_error = $mail_status;
return $mail_error;
}
/** Function to get the user Email id based on column name and column value
* $name -- column name of the vte_users vte_table
* $val -- column value
*/
function getUserEmailId($name,$val)
{
global $adb,$table_prefix;
$adb->println("Inside the function getUserEmailId. --- ".$name." = '".$val."'");
if($val != '')
{
//$sql = "select email1, email2, yahoo_id from vte_users where ".$name." = '".$val."'";
//done to resolve the PHP5 specific behaviour
$sql = "SELECT email1, email2, yahoo_id from ".$table_prefix."_users WHERE status='Active' AND ". $adb->sql_escape_string($name)." = ?";
$res = $adb->pquery($sql, array($val));
$email = $adb->query_result($res,0,'email1');
if($email == '')
{
$email = $adb->query_result($res,0,'email2');
if($email == '')
{
$email = $adb->query_result($res,0,'yahoo_id');
}
}
$adb->println("Email id is selected => '".$email."'");
return $email;
}
else
{
$adb->println("User id is empty. so return value is ''");
return '';
}
}
//crmv@26807
function getContactsEmailId($contactid)
{
global $adb,$table_prefix;
$email = '';
if($contactid != '') {
$sql = "SELECT email,yahooid FROM ".$table_prefix."_contactdetails WHERE contactid = ?";
$res = $adb->pquery($sql, array($contactid));
$email = $adb->query_result($res,0,'email');
if($email == '') {
$email = $adb->query_result($res,0,'yahooid');
}
return $email;
}
else {
return $email;
}
}
//crmv@26807e
//crmv@61023 crmv@106075
function getCompanyLogoInformation(){
global $adb,$table_prefix;
$default_folder = "storage/logo/";
$sql = "SELECT logoname FROM {$table_prefix}_organizationdetails";
$res = $adb->pquery($sql,array());
if($res && $adb->num_rows($res) > 0){
$logoname = $adb->query_result($res,0,'logoname');
(exif_imagetype($default_folder.$logoname) == IMAGETYPE_PNG) ? $default_filetype = "image/png" : $default_filetype = "image/jpeg";
$fullpath = $default_folder.$logoname;
if(file_exists($fullpath)){
return array('fullpath'=>$fullpath,'logoname'=>$logoname,'filetype'=>$default_filetype);
}
}
return false;
}
//crmv@61023e crmv@106075e
/** Function to set all the Mailer properties
* $mail -- reference of the mail object
* $subject -- subject of the email you want to send
* $contents -- body of the email you want to send
* $from_email -- from email id which will be displayed in the mail
* $from_name -- from name which will be displayed in the mail
* $to_email -- to email address -- This can be an email in a single string, a comma separated
* list of emails or an array of email addresses
* $attachment -- whether we want to attach the currently selected file or all vte_files.
[values = current,all] - optional
* $emailid -- id of the email object which will be used to get the vte_attachments - optional
*/
function setMailerProperties(&$mail,$subject,$contents,$from_email,$from_name,$to_email,$attachment='',$emailid='',$module='',$logo='') //crmv@86304
{
global $adb,$table_prefix;
$adb->println("Inside the function setMailerProperties");
if(($module == "Support" || $logo ==1) && strpos($contents,'cid:logo') !== false) { //crmv@61892
//crmv@61023
$logo_information = getCompanyLogoInformation();
if(is_array($logo_information)){
$mail->addEmbeddedImage($logo_information['fullpath'], 'logo', $logo_information['logoname'],"base64",$logo_information['filetype']);
}
else{
$mail->addEmbeddedImage('storage/logo/logo.gif', 'logo', 'logo.gif',"base64","image/gif"); //crmv@20774
}
//crmv@61023e
}
$mail->Subject = $subject;
//crmv@22700
if (is_array($contents)) {
$mail->Body = $contents['html'];
$mail->AltBody = $contents['text'];
} else {
$mail->Body = $contents;
//$mail->Body = html_entity_decode(nl2br($contents)); //if we get html tags in mail then we will use this line
$mail->AltBody = strip_tags(preg_replace(array("/<p>/i","/<br>/i","/<br \/>/i"),array("\n","\n","\n"),$contents));
}
//crmv@22700e
HandleInlineAttachments($mail,$_REQUEST['uploaddir']); //crmv@81704
$mail->IsSMTP(); //set mailer to use SMTP
//$mail->Host = "smtp1.example.com;smtp2.example.com"; // specify main and backup server
setMailServerProperties($mail, $from_email); //crmv@46572
//Handle the from name and email for HelpDesk
$mail->From = $from_email;
$rs = $adb->pquery("select first_name,last_name from ".$table_prefix."_users where user_name=?", array($from_name));
if($adb->num_rows($rs) > 0)
$from_name = $adb->query_result($rs,0,"first_name")." ".$adb->query_result($rs,0,"last_name");
$mail->FromName = decode_html($from_name);
if($to_email != '')
{
if(is_array($to_email)) {
foreach($to_email as $e) {
// crmv@198780
$addresses = getAddresses($e);
if (!empty($addresses)) {
foreach($addresses as $address) {
$mail->addAddress($address[0],$address[1]);
}
}
// crmv@198780e
}
} else {
// crmv@198780
$addresses = getAddresses($to_email);
if (!empty($addresses)) {
foreach($addresses as $address) {
$mail->addAddress($address[0],$address[1]);
}
}
// crmv@198780e
}
}
$mail->addReplyTo($from_email); // crmv@200330
$mail->WordWrap = 50;
// crmv@68357 - advanced attachments
if (is_array($attachment)) {
addAdvancedAttachments($mail, $attachment);
$attachment = '';
}
// crmv@68357e
// crmv@187130
if($attachment == 'current') {
// If we want to add the currently selected file only then we will use the following function
if (isset($_REQUEST['filename_hidden'])) {
$file_name = $_REQUEST['filename_hidden'];
} else {
$file_name = $_FILES['filename']['name'];
}
addAttachment($mail,$file_name);
} elseif($attachment == 'some') {
if (!empty($emailid) && isset($_REQUEST['attach_contentids'])) {
$contlist = array_filter(explode(',', $_REQUEST['attach_contentids']), function($v) {
return $v !== "" && $v >= 0;
});
if (count($contlist) > 0) {
addSomeAttachments($mail,$emailid, $contlist);
}
}
} elseif($attachment == 'all') {
// This will add all the files which are related to this record or email
if (!empty($emailid)) {
addAllAttachments($mail,$emailid);
}
}
if (!empty($_REQUEST['uploaddir'])) {
puploadAttachments($mail,$_REQUEST['uploaddir']);
}
if (!empty($_REQUEST['pdf_attachment']) && is_array($_REQUEST['pdf_attachment'])) {
foreach ($_REQUEST['pdf_attachment'] as $att_pdf) {
//crmv@193042
$doc_id = GetDocumentIdByFileName($att_pdf);
if($doc_id != null && $doc_id > 0 && isPermitted('Documents', 'DetailView', $doc_id) == 'yes')
$mail->AddAttachment($root_directory . 'storage/' . $att_pdf);
//crmv@193042e
}
} elseif (!empty($_REQUEST['pdf_attachment'])) {
//crmv@193042
$doc_id = GetDocumentIdByFileName($_REQUEST['pdf_attachment']);
if($doc_id != null && $doc_id > 0 && isPermitted('Documents', 'DetailView', $doc_id) == 'yes')
$mail->AddAttachment($root_directory . 'storage/' . $_REQUEST['pdf_attachment']);
//crmv@193042e
}
if ($module == 'MorphsuitServer' && $attachment != '') {
$mail->AddAttachment($attachment);
}
// crmv@187130e
$mail->IsHTML(true); // set email format to HTML
return;
}
// crmv@193042
/**
* Getting id of document by attachment id from file name
* @param $file
*/
function GetDocumentIdByFileName($file) {
$parts = explode('-', $file);
$fileclass = FileStorage::getInstance();
//crmv@204903
$docid = $fileclass->getParentId($parts[0]);
if($docid == null || $docid <= 0)
{
$parts = explode('/', $file);
$parts = $parts[count($parts)-1];
$parts = explode('_', $parts);
$docid = $parts[0];
}
return $docid;
//crmv@204903e
}
// crmv@193042e
/** Function to set the Mail Server Properties in the object passed
* $mail -- reference of the mailobject
*/
//crmv@157490
function setMailServerProperties($mail, $from_email) //crmv@46572
{
global $adb;
$adb->println("Inside the function setMailServerProperties");
$serverConfigUtils = ServerConfigUtils::getInstance();
$serverConfig = $serverConfigUtils->getConfiguration('email');
if(isset($_REQUEST['server']))
$server = $_REQUEST['server'];
else
$server = $serverConfig['server'];
if(isset($_REQUEST['server_username']))
$username = $_REQUEST['server_username'];
else
$username = $serverConfig['server_username'];
if(isset($_REQUEST['server_password'])) {
$password = $_REQUEST['server_password'];
if (!empty($serverConfig['id']) && $password == '') $password = $serverConfigUtils->getConfiguration($serverConfig['id'], array('server_password'), 'id', true); //crmv@43764
}
else
$password = $serverConfig['server_password']; //crmv@20785
// Prasad: First time read smtp_auth from the request
//crmv@32079
if(isset($_REQUEST['smtp_auth'])) {
$smtp_auth = $_REQUEST['smtp_auth'];
if($smtp_auth == 'on') {
$smtp_auth = 'true';
}
} else if (isset($_REQUEST['module']) && $_REQUEST['module'] == 'Settings' && $_REQUEST['action'] == 'Save' && $_REQUEST['server_type'] == 'email' && (!isset($_REQUEST['smtp_auth']))) {
//added to avoid issue while editing the values in the outgoing mail server.
$smtp_auth = 'false';
} else {
$smtp_auth = $serverConfig['smtp_auth'];
}
if(isset($_REQUEST['port']))
$port = $_REQUEST['port'];
else
$port = $serverConfig['server_port'];
$adb->println("Mail server name,username & password => '".$server."','".$username."','".$password."'");
if($smtp_auth == "true") {
$mail->SMTPAuth = true; // turn on SMTP authentication
}
$mail->Host = $server; // specify main and backup server
$mail->Hostname = $server; // server name used in Message-Id
$mail->Username = $username ; // SMTP username
$mail->Password = $password ; // SMTP password
if (isset($port) && $port != '' && $port != 0) {
$mail->Port = $port;
}
//crmv@32079e
//crmv@46572
(isset($_REQUEST['account_smtp'])) ? $account = $_REQUEST['account_smtp'] : $account = $serverConfig['account']; // smtp account type
//crmv@94605
$parsed_host = parse_url($server);
if(isset($parsed_host['host']) && !empty($parsed_host['host'])){
$mail->Helo = $parsed_host['host'];
}
//crmv@94605e
if ($account == 'Gmail' && $username != $from_email) { // if (smtp account type is Gmail) and (smtp username != )
$emailsFocus = CRMEntity::getInstance('Emails');
$accountid = $emailsFocus->getFromEmailAccount($from_email);
$emailsFocus = CRMEntity::getInstance('Messages');
$accountinfo = $emailsFocus->getUserAccounts('',$accountid);
if (!empty($accountinfo)) {
$accountinfo = $accountinfo[0];
if ($accountinfo['account'] == 'Gmail' || strpos($accountinfo['server'],'gmail') !== false) { // if imap account type is Gmail //crmv@61262
$mail->Username = $accountinfo['username'];
$mail->Password = $accountinfo['password'];
}
}
}
//crmv@46572e
// crmv@206145
if ($account == 'Office365' && $username != $from_email) {
$emailsFocus = CRMEntity::getInstance('Emails');
$accountid = $emailsFocus->getFromEmailAccount($from_email);
$emailsFocus = CRMEntity::getInstance('Messages');
$accountinfo = $emailsFocus->getUserAccounts('',$accountid);
if (!empty($accountinfo)) {
$accountinfo = $accountinfo[0];
if ($accountinfo['account'] == 'Office365' || strpos($accountinfo['server'],'office365') !== false) {
$mail->Username = $accountinfo['username'];
$mail->Password = $accountinfo['password'];
}
}
}
// crmv@206145e
return;
}
//crmv@157490e
// crmv@68357 - advanced attachments
// crmv@71388 - support for original email attachments
/**
* Add one or more attachments from different sources and different formats
* $attachment is an array of arrays of the form:
* array(
* 'sourcetype' => 'file', 'string' or 'email', mandatory
* 'content' => path/to/file, string or contentid(s), depending on sourcetype, mandatory
* 'recordid' => crmid of the record to use to retrieve the attachments, mandatory when sourcetype = 'email'
* 'filename' => '...', mandatory if sourcetype = 'string', the filename of the attachment
* 'encoding' => defaults to base64, optional
* 'contenttype' => defaults to application/octet-stream, optional
* 'altbody' => true/false, if true, this is not an attachment, but part of the multipart/alternatives
* 'charset' => '...', charset to use, when altbody = true,
* 'method' => '...', method to use, when altbody = true
* )
*/
function addAdvancedAttachments(&$mail, $attachments = array()) { //crmv@86304
foreach ($attachments as $att) {
if ($att['sourcetype'] == 'email') {
$contentids = $att['content'];
if (!is_array($contentids)) $contentids = array($contentids);
if (count($contentids) > 0) {
addSomeAttachments($mail, $att['recordid'], $contentids);
}
} elseif ($att['sourcetype'] == 'file') {
$mail->AddAttachment($att['content'], $att['filename'], $att['encoding'] ?: "base64", $att['contenttype'] ?: "application/octet-stream");
} elseif ($att['sourcetype'] == 'string') {
if ($att['altbody']) {
// crmv@180739
if ($att['contenttype'] == 'text/calendar') {
$mail->Ical = $att['content'];
$mail->IcalMethod = $att['method'] ?: 'REQUEST';
} else {
// not supported!
}
// crmv@180739e
} else {
$mail->addStringAttachment($att['content'], $att['filename'], $att['encoding'] ?: "base64", $att['contenttype'] ?: "application/octet-stream");
}
}
}
}
// crmv@71388e
// crmv@68357e
/** Function to add the file as attachment with the mail object
* $mail -- reference of the mail object
* $filename -- filename which is going to added with the mail
*/
function addAttachment(&$mail,$filename) //crmv@86304
{
global $adb, $root_directory;
$adb->println("Inside the function addAttachment");
$adb->println("The file name is => '".$filename."'");
//This is the file which has been selected in Email EditView
if(is_file($filename) && $filename != '')
{
$mail->AddAttachment($filename); // crmv@39106
}
}
/*
* Add only the attachments specified in $contentids array
*/
function addSomeAttachments(&$mail,$record, $contentids) { //crmv@86304
if (!is_array($contentids)) $contentids = array($contentids);
return addAllAttachments($mail, $record, $contentids);
}
/** Function to add all the files as attachment with the mail object
* $mail -- reference of the mail object
* $record -- email id ie., record id which is used to get the all vte_attachments from database
* $onlythese -- if not null, only these contentids will be attached
*/
function addAllAttachments(&$mail,$record, $onlythese = null) //crmv@86304
{
global $adb,$log,$root_directory,$table_prefix,$current_user;
$adb->println("Inside the function addAllAttachments");
if (getSalesEntityType($record) == 'Messages') {
$focusMessages = CRMEntity::getInstance('Messages');
$focusMessages->id = $record;
$result = $focusMessages->retrieve_entity_info($record,'Messages',false);
if (empty($result)) { // no errors
$atts = $focusMessages->getAttachmentsInfo();
if (!empty($atts)) {
//crmv@47673 crmv@65328
if ($focusMessages->column_fields['mtype'] == 'Link') {
$sql = "select t.* from {$table_prefix}_messages_attach a
inner join {$table_prefix}_seattachmentsrel s on s.crmid = a.document
inner join {$table_prefix}_notes n on n.notesid = a.document
inner join {$table_prefix}_attachments t on t.attachmentsid = s.attachmentsid
inner join {$table_prefix}_crmentity e on e.crmid = t.attachmentsid
where messagesid = ? and coalesce(a.document,'') <> '' and e.deleted=0";
$params = Array($record);
$res = $adb->pquery($sql,$params);
if ($res && $adb->num_rows($res)>0) {
while($row=$adb->fetchByAssoc($res)) {
$filename = $row['name'];
$filewithpath = $root_directory.$row['path'].$row['attachmentsid']."_".$filename;
if (is_file($filewithpath)) {
$mail->AddAttachment($filewithpath,$filename);
}
}
}
//crmv@47673e crmv@65328e
} else {
//$resetMailResource = false;
//if (!empty($focusMessages->column_fields['assigned_user_id']) && $focusMessages->column_fields['assigned_user_id'] != $current_user->id) {
// Shared folder (reset mail resource and connect to mailbox of the original mail)
$focusMessages->setAccount($focusMessages->column_fields['account']); //crmv@47673
$focusMessages->getZendMailStorageImap($focusMessages->column_fields['assigned_user_id']);
// $resetMailResource = true;
//} else {
// $focusMessages->getZendMailStorageImap();
//}
$focusMessages->selectFolder($focusMessages->column_fields['folder']);
//crmv@57484
try {
$messageId = $focusMessages->getMailResource()->getNumberByUniqueId($focusMessages->column_fields['xuid']);
} catch(Exception $e) {
if ($e->getMessage() == 'unique id not found') {
return;
}
}
//crmv@57484e
$message = $focusMessages->getMailResource()->getMessage($messageId);
$data = $focusMessages->getMessageContentParts($message,$messageId,true); //crmv@59492
foreach($atts as $contentid => $att) {
if (empty($data['other'][$contentid])) {
continue;
}
if (!is_null($onlythese) && is_array($onlythese) && !in_array($contentid, $onlythese)) continue;
$att = $att['parameters'];
$str = $focusMessages->decodeAttachment($data['other'][$contentid]['content'],$att['encoding'],$att['charset']);
AddStringAttachment($mail,$str,$att['name'],$att['encoding'],$att['contenttype'],$att['contentdisposition'],$att['content_id']);
}
/* crmv@47673
if ($resetMailResource) { // Recover mail resource to current user
$focusMessages->resetMailResource();
$focusMessages->getZendMailStorageImap($current_user->id);
}*/
}
}
}
} else {
//Retrieve the vte_files from database where avoid the file which has been currently selected
$sql = "select ".$table_prefix."_attachments.* from ".$table_prefix."_attachments inner join ".$table_prefix."_seattachmentsrel on ".$table_prefix."_attachments.attachmentsid = ".$table_prefix."_seattachmentsrel.attachmentsid inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid = ".$table_prefix."_attachments.attachmentsid where ".$table_prefix."_crmentity.deleted=0 and ".$table_prefix."_seattachmentsrel.crmid=?";
$res = $adb->pquery($sql, array($record));
$count = $adb->num_rows($res);
for($i=0;$i<$count;$i++)
{
$fileid = $adb->query_result($res,$i,'attachmentsid');
$filename = decode_html($adb->query_result($res,$i,'name'));
$filepath = $adb->query_result($res,$i,'path');
$filewithpath = $root_directory.$filepath.$fileid."_".$filename;
//if the file is exist in cache/upload directory then we will add directly
//else get the contents of the file and write it as a file and then attach (this will occur when we unlink the file)
if(is_file($filewithpath))
{
$mail->AddAttachment($filewithpath,$filename);
}
}
}
}
function AddStringAttachment($mail, $string, $filename, $encoding = "base64", $type = "application/octet-stream", $contentdisposition = "", $cid = "") {
if (empty($encoding)) return; //crmv@58687
$mail->addStringAttachment($string, $filename, $encoding, $type, $contentdisposition, (empty($cid)) ? 0 : $cid); // crmv@198780
}
function puploadAttachments(&$mail,$dir) { //crmv@86304
$targetDir = 'storage/uploads_emails_'.$dir;
// crmv@205309
for($count_att=0;;$count_att++) {
if (empty($_REQUEST['uploader_'.$count_att.'_tmpname'])) {
break;
}
$filename = $_REQUEST['uploader_'.$count_att.'_name'];
$filewithpath = $targetDir."/".$_REQUEST['uploader_'.$count_att.'_tmpname'];
if(is_dir($targetDir) && is_file($filewithpath))
{
$mail->AddAttachment($filewithpath,$filename);
} else {
// try to search it in DB
$FSDB = FileStorageDB::getInstance();
$fileid = $FSDB->isFilePresentByPath($filewithpath);
file_put_contents('logs/mlog.log', "FILEID: $fileid\n", FILE_APPEND);
if ($fileid > 0) {
$tname = $FSDB->createTempFile($fileid);
file_put_contents('logs/mlog.log', "TNAME: $tname\n", FILE_APPEND);
if ($tname) {
$mail->AddAttachment($tname,$filename);
file_put_contents('logs/mlog.log', "ADDED\n", FILE_APPEND);
}
}
}
}
// crmv@205309e
}
function cleanPuploadAttachments($dir) {
$targetDir = 'storage/uploads_emails_'.$dir;
if (is_dir($targetDir)) {
FSUtils::deleteFolder($targetDir);
}
}
/** Function to set the CC or BCC addresses in the mail
* $mail -- reference of the mail object
* $cc_mod -- mode to set the address ie., cc or bcc
* $cc_val -- addresss with comma seperated to set as CC or BCC in the mail
*/
function setCCAddress($mail,$cc_mod,$cc_val)
{
global $adb;
$adb->println("Inside the functin setCCAddress");
if($cc_mod == 'cc')
$method = 'AddCC';
if($cc_mod == 'bcc')
$method = 'AddBCC';
if($cc_val != '')
{
// crmv@121744 crmv@198780
$addresses = getAddresses($cc_val);
if (!empty($addresses)) {
foreach($addresses as $address) {
$mail->$method($address[0],$address[1]);
}
}
// crmv@121744e crmv@198780e
}
}
// crmv@198780
function getAddresses($string) {
$focus = CRMEntity::getInstance('Messages');
$parsed_array = $focus->parseAddressList($string);
$addresses = array();
if (!empty($parsed_array)) {
foreach($parsed_array as $parsed_email) {
if (empty($parsed_email['name'])) {
$parsed_email['name'] = preg_replace('/([^@]+)@(.*)/', '$1', $parsed_email['email']);
}
$addresses[] = array(
$parsed_email['email'],
$parsed_email['name'],
);
}
}
return $addresses;
}
// crmv@198780e
/** Function to send the mail which will be called after set all the mail object values
* $mail -- reference of the mail object
*/
function MailSend($mail)
{
global $log;
$log->info("Inside of Send Mail function.");
if(!$mail->Send())
{
$log->debug("Error in Mail Sending : Error log = '".$mail->ErrorInfo."'");
return $mail->ErrorInfo;
}
else
{
$log->info("Mail has been sent from the vteCRM system : Status : '".$mail->ErrorInfo."'");
return 1;
}
}
/** Function to get the Parent email id from HelpDesk to send the details about the ticket via email
* $returnmodule -- Parent module value. Contact or Account for send email about the ticket details
* $parentid -- id of the parent ie., contact or vte_account
*/
function getParentMailId($parentmodule,$parentid)
{
global $adb,$table_prefix;
$adb->println("Inside the function getParentMailId. \n parent module and id => ".$parentmodule."&".$parentid);
if($parentmodule == 'Contacts')
{
$tablename = $table_prefix.'_contactdetails';
$idname = 'contactid';
$first_email = 'email';
$second_email = 'yahooid';
}
if($parentmodule == 'Accounts')
{
$tablename = $table_prefix.'_account';
$idname = 'accountid';
$first_email = 'email1';
$second_email = 'email2';
}
if($parentmodule == 'Users')
{
$tablename = $table_prefix.'_users';
$idname = 'id';
$first_email = 'email1';
$second_email = 'email2';
}
if($parentid != '')
{
$query = 'select * from '.$tablename.' where '. $idname.' = ?';
$res = $adb->pquery($query, array($parentid));
$mailid = $adb->query_result($res,0,$first_email);
$mailid2 = $adb->query_result($res,0,$second_email);
}
if($mailid == '' && $mailid2 != '') {
$mailid = $mailid2;
}
return $mailid;
}
/** Function to parse and get the mail error
* $mail -- reference of the mail object
* $mail_status -- status of the mail which is sent or not
* $to -- the email address to whom we sent the mail and failes
* return -- Mail error occured during the mail sending process
*/
function getMailError($mail,$mail_status,$to)
{
//Error types in class.phpmailer.php
/*
provide_address, mailer_not_supported, execute, instantiate, file_access, file_open, encoding, data_not_accepted, authenticate,
connect_host, recipients_failed, from_failed
*/
global $adb;
$adb->println("Inside the function getMailError");
$msg = array_search($mail_status,$mail->getTranslations());
$adb->println("Error message ==> ".$msg);
if($msg == 'connect_host')
{
$error_msg = $msg;
}
elseif(strstr($msg,'from_failed'))
{
$error_msg = $msg;
}
elseif(strstr($msg,'recipients_failed'))
{
$error_msg = $msg;
}
else
{
$adb->println("Mail error is not as connect_host or from_failed or recipients_failed");
//$error_msg = $msg;
}
$adb->println("return error => ".$error_msg);
return $error_msg;
}
/** Function to get the mail status string (string of sent mail status)
* $mail_status_str -- concatenated string with all the error messages with &&& seperation
* return - the error status as a encoded string
*/
function getMailErrorString($mail_status_str)
{
global $adb;
$adb->println("Inside getMailErrorString function.\nMail status string ==> ".$mail_status_str);
$mail_status_str = trim($mail_status_str,"&&&");
$mail_status_array = explode("&&&",$mail_status_str);
$adb->println("All Mail status ==>\n".$mail_status_str."\n");
foreach($mail_status_array as $key => $val)
{
$list = explode("=",$val);
$adb->println("Mail id & status ==> ".$list[0]." = ".$list[1]);
if($list[1] == 0)
{
$mail_error_str .= $list[0]."=".$list[1]."&&&";
}
}
$adb->println("Mail error string => '".$mail_error_str."'");
if($mail_error_str != '')
{
$mail_error_str = 'mail_error='.base64_encode($mail_error_str);
}
return $mail_error_str;
}
/** Function to parse the error string
* $mail_error_str -- base64 encoded string which contains the mail sending errors as concatenated with &&&
* return - Error message to display
*/
function parseEmailErrorString($mail_error_str)
{
//TODO -- we can modify this function for better email error handling in future
global $adb, $mod_strings;
$adb->println("Inside the parseEmailErrorString function.\n encoded mail error string ==> ".$mail_error_str);
$mail_error = base64_decode($mail_error_str);
$adb->println("Original error string => ".$mail_error);
$mail_status = explode("&&&",trim($mail_error,"&&&"));
foreach($mail_status as $key => $val)
{
$status_str = explode("=",$val);
$adb->println('Mail id => "'.$status_str[0].'".........status => "'.$status_str[1].'"');
if($status_str[1] != 1 && $status_str[1] != '')
{
$adb->println("Error in mail sending");
if($status_str[1] == 'connect_host')
{
$adb->println("if part - Mail sever is not configured");
$errorstr .= '<br><b><font color=red>'.$mod_strings['MESSAGE_CHECK_MAIL_SERVER_NAME'].'</font></b>';
break;
}
elseif($status_str[1] == '0')
{
$adb->println("first elseif part - status will be 0 which is the case of assigned to vte_users's email is empty.");
$errorstr .= '<br><b><font color=red> '.$mod_strings['MESSAGE_MAIL_COULD_NOT_BE_SEND'].' '.$mod_strings['MESSAGE_PLEASE_CHECK_FROM_THE_MAILID'].'</font></b>';
//Added to display the message about the CC && BCC mail sending status
if($status_str[0] == 'cc_success')
{
$cc_msg = 'But the mail has been sent to CC & BCC addresses.';
$errorstr .= '<br><b><font color=purple>'.$cc_msg.'</font></b>';
}
}
elseif(strstr($status_str[1],'from_failed'))
{
$adb->println("second elseif part - from email id is failed.");
$from = explode('from_failed',$status_str[1]);
$errorstr .= "<br><b><font color=red>".$mod_strings['MESSAGE_PLEASE_CHECK_THE_FROM_MAILID']." '".$from[1]."'</font></b>";
}
else
{
$adb->println("else part - mail send process failed due to the following reason.");
$errorstr .= "<br><b><font color=red> ".$mod_strings['MESSAGE_MAIL_COULD_NOT_BE_SEND_TO_THIS_EMAILID']." '".$status_str[0]."'. ".$mod_strings['PLEASE_CHECK_THIS_EMAILID']."</font></b>";
}
}
}
$adb->println("Return Error string => ".$errorstr);
return $errorstr;
}
function append_mail($mail,$account,$parentid,$to_email,$from_name,$from_email,$subject,$contents,$cc='',$bcc='',$send_mode='Single')
{
$subject = html_entity_decode(trim($subject), ENT_COMPAT, 'UTF-8'); //crmv@146141
//crmv@32079 //crmv@49285
$mail_server_smtp = $mail->Host; // crmv@206145
// crmv@202172
$VTEP = VTEProperties::getInstance();
$auto_append_servers = $VTEP->getProperty('modules.emails.auto_append_servers');
$auto_append = false;
if (!empty($auto_append_servers)) {
foreach($auto_append_servers as $auto_append_server) {
if (strpos($mail_server_smtp,$auto_append_server) !== FALSE) {
$auto_append = true;
break;
}
}
}
if ($auto_append) {
// crmv@202172e
$messageFocus = CRMEntity::getInstance('Messages');
try {
$messageFocus->setAccount($account);
$messageFocus->getZendMailStorageImap();
$specialFolders = $messageFocus->getSpecialFolders();
//crmv@61262
$saved_message = $messageFocus->fetchNews($specialFolders['Sent']);
//$saved_message = $messageFocus->getSavedMessages();
//crmv@61262e
} catch (Exception $e) {
return false;
}
if (!empty($saved_message)) {
$focus = CRMEntity::getInstance('Messages');
$focus->retrieve_entity_info_no_html($saved_message[0],'Messages');
$message_id = $focus->column_fields['messageid'];
$subject = $focus->column_fields['subject']; // crmv@81338
$parentids = $_REQUEST['relation'];
if (!empty($parentids)) {
$ids = array_filter(explode('|', $parentids));
foreach ($ids as $relid) {
list($elid, $fieldid) = explode('@', $relid, 2);
if (strpos($elid,'x') !== false) {
$elid = explode('x',$elid);
$elid = $elid[1];
}
$mod = getSalesEntityType($elid);
if ($mod) {
$focus->save_related_module_small($message_id, $mod, $elid, $subject); // crmv@81338 crmv@82688
}
}
}
if (!empty($_REQUEST['ModCommentsMethod'])) {
$messageFocus->saveModComment($saved_message[0],$message_id);
}
if (!empty($parentid)) {
$messageFocus->setRecipients($saved_message[0],$parentid);
}
if (!empty($send_mode)) {
$messageFocus->setSendMode($saved_message[0],$send_mode);
}
if(isset($_REQUEST['reply_mail_converter']) && $_REQUEST['reply_mail_converter'] != '') {
$messageFocus->setVisibility($saved_message[0],'Public');
}
return true; //crmv@109607
}
return false; //crmv@109607
}
//crmv@32079e //crmv@49285e
$mail->clearAddresses(); // crmv@180739
if($to_email != '')
{
if(is_array($to_email)) {
foreach($to_email as $e) {
// crmv@198780
$addresses = getAddresses($e);
if (!empty($addresses)) {
foreach($addresses as $address) {
$mail->addAddress($address[0],$address[1]);
}
}
// crmv@198780e
}
} else {
// crmv@198780
$addresses = getAddresses($to_email);
if (!empty($addresses)) {
foreach($addresses as $address) {
$mail->addAddress($address[0],$address[1]);
}
}
// crmv@198780e
}
}
if($from_email == '') {
$from_email = getUserEmailId('user_name',$from_name);
}
$mail->Subject = $subject;
if (is_array($contents)) {
$mail->Body = $contents['html'];
$mail->AltBody = $contents['text'];
} else {
$mail->Body = $contents;
$mail->AltBody = strip_tags(preg_replace(array("/<p>/i","/<br>/i","/<br \/>/i"),array("\n","\n","\n"),$contents));
}
HandleInlineAttachments($mail,$_REQUEST['uploaddir'],'append'); //crmv@81704
setCCAddress($mail,'cc',$cc);
setCCAddress($mail,'bcc',$bcc);
try {
$messageFocus = CRMEntity::getInstance('Messages');
if ($messageFocus->appendMessage($mail,$account,'Sent',$_REQUEST['relation'])) {
//fetch new messages from Sent folder
$specialFolders = $messageFocus->getSpecialFolders();
$saved_message = $messageFocus->fetchNews($specialFolders['Sent']); //crmv@54904
if (!empty($saved_message)) {
if (!empty($_REQUEST['ModCommentsMethod'])) {
$messageFocus->saveModComment($saved_message[0],$mail->getLastMessageID()); // crmv@180739
}
if (!empty($parentid)) {
$messageFocus->setRecipients($saved_message[0],$parentid);
}
if (!empty($send_mode)) {
$messageFocus->setSendMode($saved_message[0],$send_mode);
}
//crmv@2043m
if(isset($_REQUEST['reply_mail_converter']) && $_REQUEST['reply_mail_converter'] != '') {
$messageFocus->setVisibility($saved_message[0],'Public');
}
//crmv@2043m
}
return true;
} else {
return false;
}
} catch (Exception $e) {
//crmv@86304
return false;
/* if ($e->getMessage() == 'ERR_IMAP_CREDENTIALS_EMPTY') {
// user has not configured the mailbox
return;
} else {
// throw again the exception
throw $e;
} */
//crmv@86304e
}
}
function setflag_mail($messagesid, $action) {
$flag = '';
$return = '';
if ($action == 'reply' || $action == 'reply_all') {
$flag = "answered";
} elseif ($action == 'forward') {
$flag = "forwarded";
}
if (!empty($flag)) {
$messageFocus = CRMEntity::getInstance('Messages');
$messageFocus->id = $messagesid;
$result = $messageFocus->retrieve_entity_info($messagesid,'Messages',false);
if (empty($result)) { // no errors
$messageFocus->setAccount($messageFocus->column_fields['account']); //crmv@46021
try {
$messageFocus->getZendMailStorageImap();
} catch (Exception $e) {
return $return;
}
$messageFocus->setFlag($flag,1);
$flags = $messageFocus->getCacheFlags();
if (in_array(Zend\Mail\Storage::FLAG_ANSWERED,$flags) && in_array('Forwarded',$flags)) {
$return = "window.opener.jQuery('#flag_{$messagesid}_answered').hide();window.opener.jQuery('#flag_{$messagesid}_forwarded').hide();window.opener.jQuery('#flag_{$messagesid}_answered_forwarded').show();";
} elseif (in_array(Zend\Mail\Storage::FLAG_ANSWERED,$flags)) {
$return = "window.opener.jQuery('#flag_{$messagesid}_answered').show();";
} elseif (in_array('Forwarded',$flags)) {
$return = "window.opener.jQuery('#flag_{$messagesid}_forwarded').show();";
}
}
}
return $return;
}
//crmv@31263
function save_draft_mail($module,$account,$to_email,$from_name,$from_email,$subject,$contents,$cc='',$bcc='',$attachment='',$emailid='',&$mail='',$parentids='',$recipientids='',$send_mode='Single') //crmv@22700 //crmv@25351
{
global $root_directory;
global $HELPDESK_SUPPORT_EMAIL_ID, $HELPDESK_SUPPORT_NAME;
//if module is HelpDesk then from_email will come based on support email id
if($from_email == '')//$module != 'HelpDesk')
$from_email = getUserEmailId('user_name',$from_name);
$mail = new VTEMailer(); // crmv@180739
setMailerProperties($mail,$subject,$contents,$from_email,$from_name,$to_email,$attachment,$emailid,$module);
setCCAddress($mail,'cc',$cc);
setCCAddress($mail,'bcc',$bcc);
// vtmailscanner customization: If Support Reply to is defined use it.
global $HELPDESK_SUPPORT_EMAIL_REPLY_ID;
if($HELPDESK_SUPPORT_EMAIL_REPLY_ID && $HELPDESK_SUPPORT_EMAIL_ID != $HELPDESK_SUPPORT_EMAIL_REPLY_ID) {
$mail->addReplyTo($HELPDESK_SUPPORT_EMAIL_REPLY_ID); // crmv@200330
}
// END
// Fix: Return immediately if Outgoing server not configured
if(empty($mail->Host)) {
return 0;
}
// END
if (is_array($contents)) {
$mail->Body = $contents['html'];
$mail->AltBody = $contents['text'];
} else {
$mail->Body = $contents;
$mail->AltBody = strip_tags(preg_replace(array("/<p>/i","/<br>/i","/<br \/>/i"),array("\n","\n","\n"),$contents));
}
$mail->preSend(); // crmv@180739
$messageFocus = CRMEntity::getInstance('Messages');
$append_result = $messageFocus->appendMessage($mail,$account,'Drafts',$parentids);
if ($append_result) {
//fetch new messages from Draft folder
$messageFocus->getZendMailStorageImap();
$specialFolders = $messageFocus->getSpecialFolders();
$messageFocus->fetchNews($specialFolders['Drafts']);
if (isset($_REQUEST['draft_id']) && $_REQUEST['draft_id'] != '') {
global $adb, $table_prefix, $current_user;
// crmv@198780
if ($adb->isMysql()) {
$adb->pquery("insert ignore into {$table_prefix}_messages_drafts (id, messagehash, userid) values (?,?,?)",array($_REQUEST['draft_id'],$messageFocus->getMessageHash($mail->getLastMessageID(), ''),$current_user->id)); // crmv@81338 crmv@180739
} else {
$result = $adb->pquery("select id from {$table_prefix}_messages_drafts where id = ? and messagehash = ?", array($_REQUEST['draft_id'],$messageFocus->getMessageHash($mail->getLastMessageID(), '')));
if ($result && $adb->num_rows($result) == 0) {
$adb->pquery("insert into {$table_prefix}_messages_drafts (id, messagehash, userid) values (?,?,?)",array($_REQUEST['draft_id'],$messageFocus->getMessageHash($mail->getLastMessageID(), ''),$current_user->id)); // crmv@81338 crmv@180739
}
}
// crmv@198780e
}
$saved_message = $messageFocus->getSavedMessages();
if (!empty($saved_message) && !empty($recipientids)) {
$messageFocus->setRecipients($saved_message[0],$recipientids);
}
if (!empty($send_mode)) {
$messageFocus->setSendMode($saved_message[0],$send_mode);
}
}
return $append_result;
}
function delete_draft_mail($draftid,$skip_messageid='') {
global $adb, $table_prefix;
$messageFocus = CRMEntity::getInstance('Messages');
//crmv@174073
$query = "SELECT {$table_prefix}_messages_drafts.id, {$table_prefix}_messages_drafts.messagehash, messagesid, messageid, xuid, account
FROM {$table_prefix}_messages_drafts
INNER JOIN {$table_prefix}_messages ON {$table_prefix}_messages_drafts.messagehash = {$table_prefix}_messages.messagehash
WHERE deleted = 0 AND id = ?";
//crmv@174073e
$params = array($draftid);
if (!empty($skip_messageid)) {
$query .= " AND {$table_prefix}_messages_drafts.messagehash <> ?";
$params[] = $messageFocus->getMessageHash($skip_messageid, ''); //crmv@86194
}
$result = $adb->pquery($query,$params);
if ($result && $adb->num_rows($result) > 0) {
while($row=$adb->fetchByAssoc($result)) {
$messageFocus->setAccount($row['account']);
$messageFocus->trash('Messages',$row['messagesid']);
}
}
$query = "delete from {$table_prefix}_messages_drafts where id = ?";
if (!empty($skip_messageid)) {
$query .= " AND {$table_prefix}_messages_drafts.messagehash <> ?";
}
$adb->pquery($query,$params);
if (!empty($_REQUEST['sending_queue_currentid'])) $adb->pquery("update {$table_prefix}_emails_send_queue set s_clean_drafts = ? where id = ?",array(1,$_REQUEST['sending_queue_currentid'])); //crmv@48501
}
//crmv@31263e
// crmv@81704 crmv@205899
function HandleInlineAttachments(&$mail,$dir,$mode = 'send'){
$targetDir = 'storage/uploads_emails_'.$dir;
$targetDir_quoted = preg_quote($targetDir,'/');
$cnt = 0;
$replacements = Array();
$cids = Array();
preg_match_all('/<img[^>]*src=[\'"]?('.$targetDir_quoted.'[^\s<>\'"]+)[\'"]?/i', $mail->Body, $matches, PREG_SET_ORDER);
if (!empty($matches)){
foreach($matches as $match) {
if (file_exists($match[1])) {
$cidname = ++$cnt;
$replacements['/'.preg_quote($match[1],'/').'/'] = "cid:".$cidname;
$cids[$match[1]] = $cidname;
}
}
unset($matches);
}
// ex. <img src="storage/uploads_emails_4_20200904151503/VTENEXT (2).png"
preg_match_all('/<img[^>]*src=[\'"]('.$targetDir_quoted.'[^<>\'"]+)[\'"]/i', $mail->Body, $matches, PREG_SET_ORDER);
if (!empty($matches)){
foreach($matches as $match) {
if (file_exists($match[1])) {
$cidname = ++$cnt;
$replacements['/'.preg_quote($match[1],'/').'/'] = "cid:".$cidname;
$cids[$match[1]] = $cidname;
}
}
unset($matches);
}
if ($cnt > 0) {
if (!empty($replacements)){
$mail->Body = preg_replace(array_keys($replacements), array_values($replacements), $mail->Body);
$mail->AltBody = preg_replace(array_keys($replacements), array_values($replacements), $mail->AltBody);
}
unset($replacements);
if ($mode == 'send'){
if (!empty($cids)){
$finfo = finfo_open(FILEINFO_MIME_TYPE);
foreach ($cids as $filepath=>$cidname) {
$mail->addEmbeddedImage($filepath, $cidname, pathinfo($filepath,PATHINFO_BASENAME), 'base64', finfo_file($finfo, $filepath));
}
}
}
unset($cids);
unset($finfo);
}
}
// crmv@81704e cmrv@205899e