Пример #1
0
function mail_update_7_8()
{
    $sent_mails = MailContents::findAll(array('conditions' => "`state`=3 AND `has_attachments`=1"));
    foreach ($sent_mails as $mail) {
        if (!$mail instanceof MailContent) {
            continue;
        }
        /* @var $mail MailContent */
        $attachments = array();
        MailUtilities::parseMail($mail->getContent(), $decoded, $parsedEmail, $warnings);
        if (isset($parsedEmail['Attachments'])) {
            $attachments = $parsedEmail['Attachments'];
        } else {
            if ($mail->getHasAttachments() && !in_array($parsedEmail['Type'], array('html', 'text', 'delivery-status')) && isset($parsedEmail['FileName'])) {
                // if the email is the attachment
                $attachments = array(array('Data' => $parsedEmail['Data'], 'Type' => $parsedEmail['Type'], 'FileName' => $parsedEmail['FileName']));
            }
        }
        foreach ($attachments as $att) {
            $file = ProjectFiles::getByFilename($att['FileName']);
            /* @var $file ProjectFile */
            if ($file instanceof ProjectFile) {
                $file->setMailId($mail->getId());
                $file->setMarkTimestamps(false);
                // dont change updated_on date
                $file->save();
                $file->addToSharingTable();
            }
        }
    }
    DB::executeAll("UPDATE " . TABLE_PREFIX . "objects o INNER JOIN " . TABLE_PREFIX . "project_files f ON f.object_id=o.id\n\t\t\tSET o.updated_by_id=o.created_by_id, o.updated_on=o.created_on\n\t\t\tWHERE f.mail_id>0;");
}
Пример #2
0
function mail_on_page_load()
{
    //check if have outbox mails
    $usu = logged_user();
    $accounts = MailAccounts::instance()->getMailAccountsByUser($usu);
    $account_ids = array();
    foreach ($accounts as $acc) {
        $account_ids[] = $acc->getId();
    }
    if (count($account_ids) == 0) {
        return;
    }
    $accounts_sql = " AND account_id IN (" . implode(',', $account_ids) . ")";
    $user_pg_ids = $usu->getPermissionGroupIds();
    if (count($user_pg_ids) == 0) {
        return;
    }
    $permissions_sql = " AND EXISTS (SELECT sh.group_id FROM " . TABLE_PREFIX . "sharing_table sh WHERE sh.object_id=o.id AND sh.group_id IN (" . implode(',', $user_pg_ids) . "))";
    $conditions = array("conditions" => array("`state` >= 200 AND (`state`%2 = 0) AND `archived_on`=0 AND `trashed_on`=0 {$accounts_sql} {$permissions_sql} AND `created_by_id` =" . $usu->getId()));
    $outbox_mails = MailContents::findAll($conditions);
    if ($outbox_mails != null) {
        if (count($outbox_mails) >= 1) {
            $arguments = array("conditions" => array("`context` LIKE 'mails_in_outbox%' AND `contact_id` = " . $usu->getId() . ";"));
            $exist_reminder = ObjectReminders::find($arguments);
            if (!(count($exist_reminder) > 0)) {
                $reminder = new ObjectReminder();
                $minutes = 0;
                $reminder->setMinutesBefore($minutes);
                $reminder->setType("reminder_popup");
                $reminder->setContext("mails_in_outbox " . count($outbox_mails));
                $reminder->setObject($usu);
                $reminder->setUserId($usu->getId());
                $reminder->setDate(DateTimeValueLib::now());
                $reminder->save();
            }
        }
    }
}
 /**
  * search according to the conditions of mail rules
  * @param string $condition
  * @return object 
  */
 function getConditionsRules($condition)
 {
     return MailContents::findAll(array('conditions' => $condition, 'join' => array('table' => MailDatas::instance()->getTableName(), 'jt_field' => 'id', 'e_field' => 'object_id')));
 }
Пример #4
0
		$pass = $account->getSyncPass();		
		$server = $account->getSyncServer();
		$folder = $account->getSyncFolder();
		$address = $account->getSyncAddr();		
		if($pass == null || $server == null || $folder == null || $address == null) {		
			echo(lang('cant sync account'));	
		    ?><br><a href="<?php echo ROOT_URL?>/index.php?c=access&a=index" target="_top">Go back to Feng Office</a><?php
			return;
		}			
		$conditions = array("conditions" => array("`sync`=0 AND `state` = 3 AND `account_id` =".$account->getId()));			
		
		$check_sync_box = MailUtilities::checkSyncMailbox($server, $account->getSyncSsl(), $account->getOutgoingTrasnportType(), $account->getSyncSslPort(), $folder, $address, $pass);		
				
		if ($check_sync_box){
			$sent_mails = MailContents::findAll($conditions);			
			if (count($sent_mails)==0){
				echo(lang('mails on imap acc already sync'));											
				?><br><a href="<?php echo ROOT_URL?>/index.php?c=access&a=index" target="_top">Go back to Feng Office</a><?php
				return;
			}		
			foreach ($sent_mails as $mail){			
				try{
					DB::beginWork();				
					$content = $mail->getContent();		
					MailUtilities::sendToServerThroughIMAP($server, $account->getSyncSsl(), $account->getOutgoingTrasnportType(), $account->getSyncSslPort(), $folder, $address, $pass, $content);			
					$mail->setSync(true);
					$mail->save();
					DB::commit();				
				}
				catch(Exception $e){			
 function SaveMail(&$content, MailAccount $account, $uidl, $state = 0, $imap_folder_name = '')
 {
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         self::log_connection_status();
         Logger::log("UID: {$uidl}");
     }
     if (!mysql_ping(DB::connection()->getLink())) {
         DB::connection()->reconnect();
         Logger::log("*** Connection Lost -> Reconnected ***");
     }
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         Logger::log("mem  1) " . format_filesize(memory_get_usage()));
     }
     if (strpos($content, '+OK ') > 0) {
         $content = substr($content, strpos($content, '+OK '));
     }
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         Logger::log("mem  2) " . format_filesize(memory_get_usage()));
     }
     self::parseMail($content, $decoded, $parsedMail, $warnings);
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         Logger::log("mem  3) " . format_filesize(memory_get_usage()));
     }
     $encoding = array_var($parsedMail, 'Encoding', 'UTF-8');
     $enc_conv = EncodingConverter::instance();
     $to_addresses = self::getAddresses(array_var($parsedMail, "To"));
     $from = self::getAddresses(array_var($parsedMail, "From"));
     $message_id = self::getHeaderValueFromContent($content, "Message-ID");
     $in_reply_to_id = self::getHeaderValueFromContent($content, "In-Reply-To");
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         Logger::log("mem  4) " . format_filesize(memory_get_usage()));
     }
     $uid = trim($uidl);
     if (str_starts_with($uid, '<') && str_ends_with($uid, '>')) {
         $uid = utf8_substr($uid, 1, utf8_strlen($uid, $encoding) - 2, $encoding);
     }
     if ($uid == '') {
         $uid = trim($message_id);
         if ($uid == '') {
             $uid = array_var($parsedMail, 'Subject', 'MISSING UID');
         }
         if (str_starts_with($uid, '<') && str_ends_with($uid, '>')) {
             $uid = utf8_substr($uid, 1, utf8_strlen($uid, $encoding) - 2, $encoding);
         }
         if (MailContents::mailRecordExists($account->getId(), $uid, $imap_folder_name == '' ? null : $imap_folder_name)) {
             return;
         }
     }
     if (!$from) {
         $parsedMail["From"] = self::getFromAddressFromContent($content);
         $from = array_var($parsedMail["From"][0], 'address', '');
         if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
             Logger::log("mem  4.1) " . format_filesize(memory_get_usage()));
         }
     }
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         Logger::log("mem  5) " . format_filesize(memory_get_usage()));
     }
     if (defined('EMAIL_MESSAGEID_CONTROL') && EMAIL_MESSAGEID_CONTROL) {
         if (trim($message_id) != "") {
             $id_condition = " AND `message_id`='" . trim($message_id) . "'";
         } else {
             $id_condition = " AND `subject`='" . trim(array_var($parsedMail, 'Subject')) . "' AND `from`='{$from}'";
             if (array_var($parsedMail, 'Date')) {
                 $sent_date_dt = new DateTimeValue(strtotime(array_var($parsedMail, 'Date')));
                 $sent_date_str = $sent_date_dt->toMySQL();
                 $id_condition .= " AND `sent_date`='" . $sent_date_str . "'";
             }
         }
         $same = MailContents::findOne(array('conditions' => "`account_id`=" . $account->getId() . $id_condition, 'include_trashed' => true));
         if ($same instanceof MailContent) {
             return;
         }
     }
     if ($state == 0) {
         if ($from == $account->getEmailAddress()) {
             if (strpos($to_addresses, $from) !== FALSE) {
                 $state = 5;
             } else {
                 $state = 1;
             }
             //Show only in sent folder
         }
     }
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         Logger::log("mem  6) " . format_filesize(memory_get_usage()));
         self::log_connection_status();
     }
     $from_spam_junk_folder = strpos(strtolower($imap_folder_name), 'spam') !== FALSE || strpos(strtolower($imap_folder_name), 'junk') !== FALSE || strpos(strtolower($imap_folder_name), 'trash') !== FALSE;
     $user_id = logged_user() instanceof User ? logged_user()->getId() : $account->getUserId();
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         self::log_connection_status();
     }
     $max_spam_level = user_config_option('max_spam_level', null, $user_id);
     if ($max_spam_level < 0) {
         $max_spam_level = 0;
     }
     $mail_spam_level = strlen(trim(array_var($decoded[0]['Headers'], 'x-spam-level:', '')));
     // if max_spam_level >= 10 then nothing goes to junk folder
     $spam_in_subject = false;
     if (config_option('check_spam_in_subject')) {
         $spam_in_subject = strpos_utf(strtoupper(array_var($parsedMail, 'Subject')), "**SPAM**") !== false;
     }
     if ($max_spam_level < 10 && ($mail_spam_level > $max_spam_level || $from_spam_junk_folder) || $spam_in_subject) {
         $state = 4;
         // send to Junk folder
     }
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         Logger::log("mem  7) " . format_filesize(memory_get_usage()));
         self::log_connection_status();
     }
     if (!isset($parsedMail['Subject'])) {
         $parsedMail['Subject'] = '';
     }
     $mail = new MailContent();
     $mail->setAccountId($account->getId());
     $mail->setState($state);
     $mail->setImapFolderName($imap_folder_name);
     $mail->setFrom($from);
     $cc = trim(self::getAddresses(array_var($parsedMail, "Cc")));
     if ($cc == '' && array_var($decoded, 0) && array_var($decoded[0], 'Headers')) {
         $cc = array_var($decoded[0]['Headers'], 'cc:', '');
     }
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         self::log_connection_status();
         Logger::log("mem  8) " . format_filesize(memory_get_usage()));
     }
     $mail->setCc($cc);
     $from_name = trim(array_var(array_var(array_var($parsedMail, 'From'), 0), 'name'));
     $from_encoding = detect_encoding($from_name);
     if ($from_name == '') {
         $from_name = $from;
     } else {
         if (strtoupper($encoding) == 'KOI8-R' || strtoupper($encoding) == 'CP866' || $from_encoding != 'UTF-8' || !$enc_conv->isUtf8RegExp($from_name)) {
             //KOI8-R and CP866 are Russian encodings which PHP does not detect
             $utf8_from = $enc_conv->convert($encoding, 'UTF-8', $from_name);
             if ($enc_conv->hasError()) {
                 $utf8_from = utf8_encode($from_name);
             }
             $utf8_from = utf8_safe($utf8_from);
             $mail->setFromName($utf8_from);
         } else {
             $mail->setFromName($from_name);
         }
     }
     $subject_aux = $parsedMail['Subject'];
     $subject_encoding = detect_encoding($subject_aux);
     if (strtoupper($encoding) == 'KOI8-R' || strtoupper($encoding) == 'CP866' || $subject_encoding != 'UTF-8' || !$enc_conv->isUtf8RegExp($subject_aux)) {
         //KOI8-R and CP866 are Russian encodings which PHP does not detect
         $utf8_subject = $enc_conv->convert($encoding, 'UTF-8', $subject_aux);
         if ($enc_conv->hasError()) {
             $utf8_subject = utf8_encode($subject_aux);
         }
         $utf8_subject = utf8_safe($utf8_subject);
         $mail->setSubject($utf8_subject);
     } else {
         $utf8_subject = utf8_safe($subject_aux);
         $mail->setSubject($utf8_subject);
     }
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         self::log_connection_status();
         Logger::log("mem  9) " . format_filesize(memory_get_usage()));
     }
     $mail->setTo($to_addresses);
     $sent_timestamp = false;
     if (array_key_exists("Date", $parsedMail)) {
         $sent_timestamp = strtotime($parsedMail["Date"]);
     }
     if ($sent_timestamp === false || $sent_timestamp === -1 || $sent_timestamp === 0) {
         $mail->setSentDate(DateTimeValueLib::now());
     } else {
         $mail->setSentDate(new DateTimeValue($sent_timestamp));
     }
     // if this constant is defined, mails older than this date will not be fetched
     if (defined('FIRST_MAIL_DATE')) {
         $first_mail_date = DateTimeValueLib::makeFromString(FIRST_MAIL_DATE);
         if ($mail->getSentDate()->getTimestamp() < $first_mail_date->getTimestamp()) {
             // return true to stop getting older mails from the server
             return true;
         }
     }
     $received_timestamp = false;
     if (array_key_exists("Received", $parsedMail) && $parsedMail["Received"]) {
         $received_timestamp = strtotime($parsedMail["Received"]);
     }
     if ($received_timestamp === false || $received_timestamp === -1 || $received_timestamp === 0) {
         $mail->setReceivedDate($mail->getSentDate());
     } else {
         $mail->setReceivedDate(new DateTimeValue($received_timestamp));
         if ($state == 5 && $mail->getSentDate()->getTimestamp() > $received_timestamp) {
             $mail->setReceivedDate($mail->getSentDate());
         }
     }
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         self::log_connection_status();
         Logger::log("mem 10) " . format_filesize(memory_get_usage()));
     }
     $mail->setSize(strlen($content));
     $mail->setHasAttachments(!empty($parsedMail["Attachments"]));
     $mail->setCreatedOn(new DateTimeValue(time()));
     $mail->setCreatedById($account->getUserId());
     $mail->setAccountEmail($account->getEmail());
     $mail->setMessageId($message_id);
     $mail->setInReplyToId($in_reply_to_id);
     $mail->setUid($uid);
     $type = array_var($parsedMail, 'Type', 'text');
     switch ($type) {
         case 'html':
             $utf8_body = $enc_conv->convert($encoding, 'UTF-8', array_var($parsedMail, 'Data', ''));
             if ($enc_conv->hasError()) {
                 $utf8_body = utf8_encode(array_var($parsedMail, 'Data', ''));
             }
             $utf8_body = utf8_safe($utf8_body);
             $mail->setBodyHtml($utf8_body);
             break;
         case 'text':
             $utf8_body = $enc_conv->convert($encoding, 'UTF-8', array_var($parsedMail, 'Data', ''));
             if ($enc_conv->hasError()) {
                 $utf8_body = utf8_encode(array_var($parsedMail, 'Data', ''));
             }
             $utf8_body = utf8_safe($utf8_body);
             $mail->setBodyPlain($utf8_body);
             break;
         case 'delivery-status':
             $utf8_body = $enc_conv->convert($encoding, 'UTF-8', array_var($parsedMail, 'Response', ''));
             if ($enc_conv->hasError()) {
                 $utf8_body = utf8_encode(array_var($parsedMail, 'Response', ''));
             }
             $utf8_body = utf8_safe($utf8_body);
             $mail->setBodyPlain($utf8_body);
             break;
         default:
             break;
     }
     if (isset($parsedMail['Alternative'])) {
         foreach ($parsedMail['Alternative'] as $alt) {
             if ($alt['Type'] == 'html' || $alt['Type'] == 'text') {
                 $body = $enc_conv->convert(array_var($alt, 'Encoding', 'UTF-8'), 'UTF-8', array_var($alt, 'Data', ''));
                 if ($enc_conv->hasError()) {
                     $body = utf8_encode(array_var($alt, 'Data', ''));
                 }
                 // remove large white spaces
                 $exploded = preg_split("/[\\s]+/", $body, -1, PREG_SPLIT_NO_EMPTY);
                 $body = implode(" ", $exploded);
                 // remove html comments
                 $body = preg_replace('/<!--.*-->/i', '', $body);
             }
             $body = utf8_safe($body);
             if ($alt['Type'] == 'html') {
                 $mail->setBodyHtml($body);
             } else {
                 if ($alt['Type'] == 'text') {
                     $plain = html_to_text(html_entity_decode($utf8_body, null, "UTF-8"));
                     $mail->setBodyPlain($plain);
                 }
             }
             // other alternative parts (like images) are not saved in database.
         }
     }
     $repository_id = self::SaveContentToFilesystem($mail->getUid(), $content);
     $mail->setContentFileId($repository_id);
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         self::log_connection_status();
         Logger::log("mem 11) " . format_filesize(memory_get_usage()));
     }
     try {
         if ($in_reply_to_id != "") {
             if ($message_id != "") {
                 $conv_mail = MailContents::findOne(array("conditions" => "`account_id`=" . $account->getId() . " AND `in_reply_to_id` = '{$message_id}'"));
                 if (!$conv_mail) {
                     $conv_mail = MailContents::findOne(array("conditions" => "`account_id`=" . $account->getId() . " AND `message_id` = '{$in_reply_to_id}'"));
                 } else {
                     // Search for other discontinued conversation part to link it
                     $other_conv_emails = MailContents::findAll(array("conditions" => "`account_id`=" . $account->getId() . " AND `message_id` = '{$in_reply_to_id}' AND `conversation_id`<>" . $conv_mail->getConversationId()));
                 }
             } else {
                 $conv_mail = MailContents::findOne(array("conditions" => "`account_id`=" . $account->getId() . " AND `message_id` = '{$in_reply_to_id}'"));
             }
             if ($conv_mail instanceof MailContent) {
                 // Remove "Re: ", "Fwd: ", etc to compare the subjects
                 $conv_original_subject = strtolower($conv_mail->getSubject());
                 if (($pos = strrpos($conv_original_subject, ":")) !== false) {
                     $conv_original_subject = trim(substr($conv_original_subject, $pos + 1));
                 }
             }
             if ($conv_mail instanceof MailContent && strpos(strtolower($mail->getSubject()), strtolower($conv_original_subject)) !== false) {
                 $mail->setConversationId($conv_mail->getConversationId());
                 if (isset($other_conv_emails) && is_array($other_conv_emails)) {
                     foreach ($other_conv_emails as $ocm) {
                         $ocm->setConversationId($conv_mail->getConversationId());
                         $ocm->save();
                     }
                 }
             } else {
                 $conv_id = MailContents::getNextConversationId($account->getId());
                 $mail->setConversationId($conv_id);
             }
         } else {
             $conv_id = MailContents::getNextConversationId($account->getId());
             $mail->setConversationId($conv_id);
         }
         if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
             self::log_connection_status();
             Logger::log("mem 12) " . format_filesize(memory_get_usage()));
         }
         $mail->save();
         if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
             self::log_connection_status();
             Logger::log("mem 13) " . format_filesize(memory_get_usage()));
         }
         // CLASSIFY RECEIVED MAIL WITH THE CONVERSATION
         if (user_config_option('classify_mail_with_conversation', null, $account->getUserId()) && isset($conv_mail) && $conv_mail instanceof MailContent) {
             $wss = $conv_mail->getWorkspaces();
             foreach ($wss as $ws) {
                 $acc_user = Users::findById($account->getUserId());
                 if ($acc_user instanceof User && $acc_user->hasProjectPermission($ws, ProjectUsers::CAN_READ_MAILS)) {
                     $mail->addToWorkspace($ws);
                 }
             }
         }
         // CLASSIFY MAILS IF THE ACCOUNT HAS A WORKSPACE
         if ($account->getColumnValue('workspace', 0) != 0) {
             $workspace = Projects::findById($account->getColumnValue('workspace', 0));
             if ($workspace && $workspace instanceof Project && !$mail->hasWorkspace($workspace)) {
                 $mail->addToWorkspace($workspace);
             }
         }
         //END CLASSIFY
         $user = Users::findById($account->getUserId());
         if ($user instanceof User) {
             $mail->subscribeUser($user);
         }
     } catch (Exception $e) {
         FileRepository::deleteFile($repository_id);
         if (strpos($e->getMessage(), "Query failed with message 'Got a packet bigger than 'max_allowed_packet' bytes'") === false) {
             throw $e;
         }
     }
     unset($parsedMail);
     if (defined('DEBUG_EMAIL_RETRIEVAL') && DEBUG_EMAIL_RETRIEVAL) {
         Logger::log("mem fin) " . format_filesize(memory_get_usage()));
         self::log_connection_status();
     }
     return false;
 }
 /**
  * Edit email account
  *
  * @access public
  * @param void
  * @return null
  */
 function edit_account()
 {
     if (logged_user()->isGuest()) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     $this->setTemplate('add_account');
     $mailAccount = MailAccounts::findById(get_id());
     if (!$mailAccount instanceof MailAccount) {
         flash_error(lang('mailAccount dnx'));
         ajx_current("empty");
         return;
     }
     // if
     if (!$mailAccount->canEdit(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     // if
     // get mail account users
     $mailAccountUsers = MailAccountUsers::getByAccount($mailAccount);
     $mau = array();
     foreach ($mailAccountUsers as $au) {
         $mau[$au->getUserId()] = array('name' => $au->getUser()->getDisplayName(), 'can_edit' => $au->getCanEdit());
     }
     tpl_assign('mailAccountUsers', $mau);
     $is_admin = false;
     if (logged_user()->isAdministrator()) {
         $is_admin = true;
     }
     tpl_assign('is_admin', $is_admin);
     $mailAccount_data = array_var($_POST, 'mailAccount');
     if (!is_array($mailAccount_data)) {
         $mailAccount_data = array('user_id' => logged_user()->getId(), 'name' => $mailAccount->getName(), 'email' => $mailAccount->getEmail(), 'email_addr' => $mailAccount->getEmailAddress(), 'password' => MailUtilities::ENCRYPT_DECRYPT($mailAccount->getPassword()), 'server' => $mailAccount->getServer(), 'is_imap' => $mailAccount->getIsImap(), 'incoming_ssl' => $mailAccount->getIncomingSsl(), 'incoming_ssl_port' => $mailAccount->getIncomingSslPort(), 'smtp_server' => $mailAccount->getSmtpServer(), 'smtp_port' => $mailAccount->getSmtpPort(), 'smtp_username' => $mailAccount->getSmtpUsername(), 'smtp_password' => MailUtilities::ENCRYPT_DECRYPT($mailAccount->getSmtpPassword()), 'smtp_use_auth' => $mailAccount->getSmtpUseAuth(), 'del_from_server' => $mailAccount->getDelFromServer(), 'outgoing_transport_type' => $mailAccount->getOutgoingTrasnportType(), 'workspace' => $mailAccount->getColumnValue('workspace', 0));
         // array
         if (config_option('sent_mails_sync')) {
             $sync_details = array('sync_server' => $mailAccount->getSyncServer(), 'sync_addr' => $mailAccount->getSyncAddr(), 'sync_pass' => MailUtilities::ENCRYPT_DECRYPT($mailAccount->getSyncPass()), 'sync_ssl' => $mailAccount->getSyncSsl(), 'sync_sslport' => $mailAccount->getSyncSslPort());
             $mailAccount_data = array_merge($mailAccount_data, $sync_details);
         }
     } else {
         if (!isset($mailAccount_data['incoming_ssl'])) {
             $mailAccount_data['incoming_ssl'] = false;
         }
         if (!isset($mailAccount_data['is_default'])) {
             $mailAccount_data['is_default'] = false;
         }
     }
     if ($mailAccount->getIsImap()) {
         try {
             $real_folders = MailUtilities::getImapFolders($mailAccount);
             DB::beginWork();
             foreach ($real_folders as $folder_name) {
                 if (!MailAccountImapFolders::findById(array('account_id' => $mailAccount->getId(), 'folder_name' => $folder_name))) {
                     $acc_folder = new MailAccountImapFolder();
                     $acc_folder->setAccountId($mailAccount->getId());
                     $acc_folder->setFolderName($folder_name);
                     $acc_folder->setCheckFolder($folder_name == 'INBOX');
                     // By default only INBOX is checked
                     $acc_folder->save();
                 }
             }
             DB::commit();
         } catch (Exception $e) {
             DB::rollback();
             flash_error($e->getMessage());
         }
         $imap_folders = MailAccountImapFolders::getMailAccountImapFolders($mailAccount->getId());
         tpl_assign('imap_folders', $imap_folders);
     }
     tpl_assign('mailAccount', $mailAccount);
     tpl_assign('mailAccount_data', $mailAccount_data);
     if (array_var($_POST, 'submitted')) {
         try {
             $user_changed = false;
             $selected_user = array_var($_POST, 'users_select_box');
             if (!$is_admin) {
                 $mail_account_user = Users::findById($mailAccount->getUserId());
             } else {
                 $mail_account_user = Users::findById($selected_user);
                 $old_user_id = $mailAccount->getUserId();
                 if ($old_user_id != $mail_account_user->getId()) {
                     $user_changed = true;
                 }
             }
             $mailAccount_data['user_id'] = $mail_account_user->getId();
             DB::beginWork();
             $logged_user_settings = MailAccountUsers::getByAccountAndUser($mailAccount, logged_user());
             $logged_user_can_edit = $logged_user_settings instanceof MailAccountUser && $logged_user_settings->getCanEdit() || $mailAccount->getUserId() == logged_user()->getId();
             if ($logged_user_can_edit) {
                 if (!array_var($mailAccount_data, 'del_mails_from_server', false)) {
                     $mailAccount_data['del_from_server'] = 0;
                 }
                 $mailAccount->setFromAttributes($mailAccount_data);
                 $mailAccount->setPassword(MailUtilities::ENCRYPT_DECRYPT($mailAccount->getPassword()));
                 $mailAccount->setSmtpPassword(MailUtilities::ENCRYPT_DECRYPT($mailAccount->getSmtpPassword()));
                 $outbox_folder = array_var($_POST, 'outbox_select_box');
                 if (config_option("sent_mails_sync") && isset($outbox_folder)) {
                     $mailAccount->setSyncPass(MailUtilities::ENCRYPT_DECRYPT($mailAccount_data['sync_pass']));
                     $mailAccount->setSyncFolder($outbox_folder);
                 }
                 //in case there is a new owner of the email account
                 if ($user_changed) {
                     $conditions = array("conditions" => "`created_by_id` = '{$old_user_id}' AND `account_id` = " . $mailAccount->getId() . "");
                     $all_emails = MailContents::findAll($conditions);
                     foreach ($all_emails as $e) {
                         $e->setCreatedById($mail_account_user->getId());
                         $e->save();
                     }
                 }
                 //If imap, save folders to check
                 if ($mailAccount->getIsImap() && is_array(array_var($_POST, 'check'))) {
                     $checks = array_var($_POST, 'check');
                     if (is_array($imap_folders) && count($imap_folders)) {
                         foreach ($imap_folders as $folder) {
                             $folder->setCheckFolder(false);
                             foreach ($checks as $name => $cf) {
                                 $name = str_replace(array('¡', '!'), array('[', ']'), $name);
                                 //to avoid a mistaken array if name contains [
                                 if (strcasecmp($name, $folder->getFolderName()) == 0) {
                                     $folder->setCheckFolder($cf == 'checked');
                                     break;
                                 }
                             }
                             $folder->save();
                         }
                     }
                 }
                 $mailAccount->save();
                 // process users
                 $account_users = $mail_account_user->getCompany()->getUsers();
                 $user_access = array_var($_POST, 'user_access');
                 foreach ($account_users as $account_user) {
                     $user_id = $account_user->getId();
                     $access = array_var($user_access, $user_id, 'none');
                     $account_user = MailAccountUsers::getByAccountAndUser($mailAccount, $account_user);
                     if ($access != 'none' || $user_id == $mail_account_user->getId()) {
                         if (!$account_user instanceof MailAccountUser) {
                             $account_user = new MailAccountUser();
                             $account_user->setAccountId($mailAccount->getId());
                             $account_user->setUserId($user_id);
                         }
                         $account_user->setCanEdit($access == 'write');
                         $account_user->save();
                     } else {
                         if ($account_user instanceof MailAccountUser) {
                             $account_user->delete();
                         }
                     }
                 }
                 /*// delete any remaining ones
                 		$account_users = MailAccountUsers::getByAccount($mailAccount);
                 		foreach ($account_users as $account_user) {
                 			if ($access = array_var($user_access, $account_user->getId(), 'none') == 'none') {
                 				$account_user->delete();
                 			}
                 		}*/
                 evt_add("mail account edited", array("id" => $mailAccount->getId(), "name" => $mailAccount->getName(), "email" => $mailAccount->getEmail()));
             }
             // personal settings
             if (array_var($_POST, 'is_default')) {
                 $user_accounts = MailAccountUsers::getByUser(logged_user());
                 foreach ($user_accounts as $acc) {
                     if ($acc->getAccountId() != $mailAccount->getId()) {
                         $acc->setIsDefault(false);
                         $acc->save();
                     } else {
                         $acc->setIsDefault(true);
                         $acc->save();
                     }
                 }
             }
             $logged_user_settings = MailAccountUsers::getByAccountAndUser($mailAccount, logged_user());
             if ($logged_user_settings instanceof MailAccountUser) {
                 $logged_user_settings->setSignature(array_var($_POST, 'signature'));
                 $logged_user_settings->setSenderName(array_var($_POST, 'sender_name'));
                 $logged_user_settings->save();
             }
             DB::commit();
             flash_success(lang('success edit mail account', $mailAccount->getName()));
             ajx_current("back");
             // Error...
         } catch (Exception $e) {
             DB::rollback();
             ajx_current("empty");
             flash_error($e->getMessage());
         }
         // try
     }
     // if
 }
 function SaveMail(&$content, MailAccount $account, $uidl, $state = 0, $imap_folder_name = '', $read = null, &$received_count)
 {
     try {
         if (strpos($content, '+OK ') > 0) {
             $content = substr($content, strpos($content, '+OK '));
         }
         self::parseMail($content, $decoded, $parsedMail, $warnings);
         $encoding = array_var($parsedMail, 'Encoding', 'UTF-8');
         $enc_conv = EncodingConverter::instance();
         $to_addresses = self::getAddresses(array_var($parsedMail, "To"));
         $from = self::getAddresses(array_var($parsedMail, "From"));
         $message_id = self::getHeaderValueFromContent($content, "Message-ID");
         $in_reply_to_id = self::getHeaderValueFromContent($content, "In-Reply-To");
         $uid = trim($uidl);
         if (str_starts_with($uid, '<') && str_ends_with($uid, '>')) {
             $uid = utf8_substr($uid, 1, utf8_strlen($uid, $encoding) - 2, $encoding);
         }
         if ($uid == '') {
             $uid = trim($message_id);
             if ($uid == '') {
                 $uid = array_var($parsedMail, 'Subject', 'MISSING UID');
             }
             if (str_starts_with($uid, '<') && str_ends_with($uid, '>')) {
                 $uid = utf8_substr($uid, 1, utf8_strlen($uid, $encoding) - 2, $encoding);
             }
         }
         // do not save duplicate emails
         if (MailContents::mailRecordExists($account->getId(), $uid, $imap_folder_name == '' ? null : $imap_folder_name)) {
             return;
         }
         if (!$from) {
             $parsedMail["From"] = self::getFromAddressFromContent($content);
             $from = array_var($parsedMail["From"][0], 'address', '');
         }
         if (defined('EMAIL_MESSAGEID_CONTROL') && EMAIL_MESSAGEID_CONTROL) {
             if (trim($message_id) != "") {
                 $id_condition = " AND `message_id`='" . trim($message_id) . "' AND `from`='{$from}'";
             } else {
                 $id_condition = " AND `name`= " . DB::escape(trim(array_var($parsedMail, 'Subject'))) . " AND `from`='{$from}'";
                 if (array_var($parsedMail, 'Date')) {
                     $sent_date_dt = new DateTimeValue(strtotime(array_var($parsedMail, 'Date')));
                     $sent_date_str = $sent_date_dt->toMySQL();
                     $id_condition .= " AND `sent_date`='" . $sent_date_str . "'";
                 }
             }
             $same = MailContents::findOne(array('conditions' => "`account_id`=" . $account->getId() . $id_condition, 'include_trashed' => true));
             if ($same instanceof MailContent) {
                 return;
             }
         }
         $from_spam_junk_folder = strpos(strtolower($imap_folder_name), 'spam') !== FALSE || strpos(strtolower($imap_folder_name), 'junk') !== FALSE || strpos(strtolower($imap_folder_name), 'trash') !== FALSE;
         $user_id = logged_user() instanceof Contact ? logged_user()->getId() : $account->getContactId();
         $max_spam_level = user_config_option('max_spam_level', null, $user_id);
         if ($max_spam_level < 0) {
             $max_spam_level = 0;
         }
         $spam_level_header = 'x-spam-level:';
         foreach ($decoded[0]['Headers'] as $hdr_name => $hdrval) {
             if (strpos(strtolower($hdr_name), "spamscore") !== false || strpos(strtolower($hdr_name), "x-spam-level")) {
                 $spam_level_header = $hdr_name;
                 break;
             }
         }
         $mail_spam_level = strlen(trim(array_var($decoded[0]['Headers'], $spam_level_header, '')));
         // if max_spam_level >= 10 then nothing goes to junk folder
         $spam_in_subject = false;
         if (config_option('check_spam_in_subject')) {
             $spam_in_subject = strpos_utf(strtoupper(array_var($parsedMail, 'Subject')), "**SPAM**") !== false;
         }
         if ($max_spam_level < 10 && ($mail_spam_level > $max_spam_level || $from_spam_junk_folder) || $spam_in_subject) {
             $state = 4;
             // send to Junk folder
         }
         //if you are in the table spam MailSpamFilters
         if ($state != 4) {
             $spam_email = MailSpamFilters::getFrom($account->getId(), $from);
             if ($spam_email) {
                 $state = 0;
                 if ($spam_email[0]->getSpamState() == "spam") {
                     $state = 4;
                 }
             } else {
                 if ($state == 0) {
                     if (strtolower($from) == strtolower($account->getEmailAddress())) {
                         if (strpos($to_addresses, $from) !== FALSE) {
                             $state = 5;
                         } else {
                             $state = 1;
                         }
                         //Show only in sent folder
                     }
                 }
             }
         }
         if (!isset($parsedMail['Subject'])) {
             $parsedMail['Subject'] = '';
         }
         $mail = new MailContent();
         $mail->setAccountId($account->getId());
         $mail->setState($state);
         $mail->setImapFolderName($imap_folder_name);
         $mail->setFrom($from);
         $cc = trim(self::getAddresses(array_var($parsedMail, "Cc")));
         if ($cc == '' && array_var($decoded, 0) && array_var($decoded[0], 'Headers')) {
             $cc = array_var($decoded[0]['Headers'], 'cc:', '');
         }
         $mail->setCc($cc);
         $from_name = trim(array_var(array_var(array_var($parsedMail, 'From'), 0), 'name'));
         $from_encoding = detect_encoding($from_name);
         if ($from_name == '') {
             $from_name = $from;
         } else {
             if (strtoupper($encoding) == 'KOI8-R' || strtoupper($encoding) == 'CP866' || $from_encoding != 'UTF-8' || !$enc_conv->isUtf8RegExp($from_name)) {
                 //KOI8-R and CP866 are Russian encodings which PHP does not detect
                 $utf8_from = $enc_conv->convert($encoding, 'UTF-8', $from_name);
                 if ($enc_conv->hasError()) {
                     $utf8_from = utf8_encode($from_name);
                 }
                 $utf8_from = utf8_safe($utf8_from);
                 $mail->setFromName($utf8_from);
             } else {
                 $mail->setFromName($from_name);
             }
         }
         $subject_aux = $parsedMail['Subject'];
         $subject_encoding = detect_encoding($subject_aux);
         $subject_multipart_encoding = array_var($parsedMail, 'SubjectEncoding', strtoupper($encoding));
         if ($subject_multipart_encoding != 'UTF-8' && ($subject_multipart_encoding == 'KOI8-R' || $subject_multipart_encoding == 'CP866' || $subject_encoding != 'UTF-8' || !$enc_conv->isUtf8RegExp($subject_aux))) {
             //KOI8-R and CP866 are Russian encodings which PHP does not detect
             $utf8_subject = $enc_conv->convert($subject_multipart_encoding, 'UTF-8', $subject_aux);
             if ($enc_conv->hasError()) {
                 $utf8_subject = utf8_encode($subject_aux);
             }
             $utf8_subject = utf8_safe($utf8_subject);
             $mail->setSubject($utf8_subject);
         } else {
             $utf8_subject = utf8_safe($subject_aux);
             $mail->setSubject($utf8_subject);
         }
         $mail->setTo($to_addresses);
         $sent_timestamp = false;
         if (array_key_exists("Date", $parsedMail)) {
             $sent_timestamp = strtotime($parsedMail["Date"]);
         }
         if ($sent_timestamp === false || $sent_timestamp === -1 || $sent_timestamp === 0) {
             $mail->setSentDate(DateTimeValueLib::now());
         } else {
             $mail->setSentDate(new DateTimeValue($sent_timestamp));
         }
         // if this constant is defined, mails older than this date will not be fetched
         if (defined('FIRST_MAIL_DATE')) {
             $first_mail_date = DateTimeValueLib::makeFromString(FIRST_MAIL_DATE);
             if ($mail->getSentDate()->getTimestamp() < $first_mail_date->getTimestamp()) {
                 // return true to stop getting older mails from the server
                 return true;
             }
         }
         $received_timestamp = false;
         if (array_key_exists("Received", $parsedMail) && $parsedMail["Received"]) {
             $received_timestamp = strtotime($parsedMail["Received"]);
         }
         if ($received_timestamp === false || $received_timestamp === -1 || $received_timestamp === 0) {
             $mail->setReceivedDate($mail->getSentDate());
         } else {
             $mail->setReceivedDate(new DateTimeValue($received_timestamp));
             if ($state == 5 && $mail->getSentDate()->getTimestamp() > $received_timestamp) {
                 $mail->setReceivedDate($mail->getSentDate());
             }
         }
         $mail->setSize(strlen($content));
         $mail->setCreatedOn(new DateTimeValue(time()));
         $mail->setCreatedById($account->getContactId());
         $mail->setAccountEmail($account->getEmail());
         $mail->setMessageId($message_id);
         $mail->setInReplyToId($in_reply_to_id);
         // set hasAttachments=true onlu if there is any attachment with FileDisposition='attachment'
         $has_attachments = false;
         foreach (array_var($parsedMail, "Attachments", array()) as $attachment) {
             if (array_var($attachment, 'FileDisposition') == 'attachment') {
                 $has_attachments = true;
             }
         }
         $mail->setHasAttachments($has_attachments);
         $mail->setUid($uid);
         $type = array_var($parsedMail, 'Type', 'text');
         switch ($type) {
             case 'html':
                 $utf8_body = $enc_conv->convert($encoding, 'UTF-8', array_var($parsedMail, 'Data', ''));
                 //Solve bad syntax styles outlook if it exists
                 if (substr_count($utf8_body, "<style>") != substr_count($utf8_body, "</style>") && substr_count($utf8_body, "/* Font Definitions */") >= 1) {
                     $p1 = strpos($utf8_body, "/* Font Definitions */", 0);
                     $utf8_body1 = substr($utf8_body, 0, $p1);
                     $p0 = strrpos($utf8_body1, "</style>");
                     $html_content = ($p0 >= 0 ? substr($utf8_body1, 0, $p0) : $utf8_body1) . substr($utf8_body, $p1);
                     $utf8_body = str_replace_first("/* Font Definitions */", "<style>", $utf8_body);
                 }
                 if ($enc_conv->hasError()) {
                     $utf8_body = utf8_encode(array_var($parsedMail, 'Data', ''));
                 }
                 $utf8_body = utf8_safe($utf8_body);
                 $mail->setBodyHtml($utf8_body);
                 break;
             case 'text':
                 $utf8_body = $enc_conv->convert($encoding, 'UTF-8', array_var($parsedMail, 'Data', ''));
                 if ($enc_conv->hasError()) {
                     $utf8_body = utf8_encode(array_var($parsedMail, 'Data', ''));
                 }
                 $utf8_body = utf8_safe($utf8_body);
                 $mail->setBodyPlain($utf8_body);
                 break;
             case 'delivery-status':
                 $utf8_body = $enc_conv->convert($encoding, 'UTF-8', array_var($parsedMail, 'Response', ''));
                 if ($enc_conv->hasError()) {
                     $utf8_body = utf8_encode(array_var($parsedMail, 'Response', ''));
                 }
                 $utf8_body = utf8_safe($utf8_body);
                 $mail->setBodyPlain($utf8_body);
                 break;
             default:
                 if (array_var($parsedMail, 'FileDisposition') == 'inline') {
                     $attachs = array_var($parsedMail, 'Attachments', array());
                     $attached_body = "";
                     foreach ($attachs as $k => $attach) {
                         if (array_var($attach, 'Type') == 'html' || array_var($attach, 'Type') == 'text') {
                             $attached_body .= $enc_conv->convert(array_var($attach, 'Encoding'), 'UTF-8', array_var($attach, 'Data'));
                         }
                     }
                     $mail->setBodyHtml($attached_body);
                 } else {
                     if (isset($parsedMail['FileName'])) {
                         // content-type is a file type => set as it has attachments, they will be parsed when viewing email
                         $mail->setHasAttachments(true);
                     }
                 }
                 break;
         }
         if (isset($parsedMail['Alternative'])) {
             foreach ($parsedMail['Alternative'] as $alt) {
                 if ($alt['Type'] == 'html' || $alt['Type'] == 'text') {
                     $body = $enc_conv->convert(array_var($alt, 'Encoding', 'UTF-8'), 'UTF-8', array_var($alt, 'Data', ''));
                     if ($enc_conv->hasError()) {
                         $body = utf8_encode(array_var($alt, 'Data', ''));
                     }
                     // remove large white spaces
                     //$exploded = preg_split("/[\s]+/", $body, -1, PREG_SPLIT_NO_EMPTY);
                     //$body = implode(" ", $exploded);
                     // remove html comments
                     $body = preg_replace('/<!--.*-->/i', '', $body);
                 }
                 $body = utf8_safe($body);
                 if ($alt['Type'] == 'html') {
                     $mail->setBodyHtml($body);
                 } else {
                     if ($alt['Type'] == 'text') {
                         $plain = html_to_text(html_entity_decode($body, null, "UTF-8"));
                         $mail->setBodyPlain($plain);
                     }
                 }
                 // other alternative parts (like images) are not saved in database.
             }
         }
         $repository_id = self::SaveContentToFilesystem($mail->getUid(), $content);
         $mail->setContentFileId($repository_id);
         // START TRANSACTION
         DB::beginWork();
         // Conversation
         //check if exists a conversation for this mail
         $conv_mail = "";
         if ($in_reply_to_id != "" && $message_id != "") {
             $conv_mail = MailContents::findOne(array("conditions" => "`account_id`=" . $account->getId() . " AND (`message_id` = '{$in_reply_to_id}' OR `in_reply_to_id` = '{$message_id}')"));
             //check if this mail is in two diferent conversations and fixit
             if ($conv_mail) {
                 $other_conv_mail = MailContents::findOne(array("conditions" => "`account_id`=" . $account->getId() . " AND `conversation_id` != " . $conv_mail->getConversationId() . " AND (`message_id` = '{$in_reply_to_id}' OR `in_reply_to_id` = '{$message_id}')"));
                 if ($other_conv_mail) {
                     $other_conv = MailContents::findAll(array("conditions" => "`account_id`=" . $account->getId() . " AND `conversation_id` = " . $other_conv_mail->getConversationId()));
                     if ($other_conv) {
                         foreach ($other_conv as $mail_con) {
                             $mail_con->setConversationId($conv_mail->getConversationId());
                             $mail_con->save();
                         }
                     }
                 }
             }
         } elseif ($in_reply_to_id != "") {
             $conv_mail = MailContents::findOne(array("conditions" => "`account_id`=" . $account->getId() . " AND `message_id` = '{$in_reply_to_id}'"));
         } elseif ($message_id != "") {
             $conv_mail = MailContents::findOne(array("conditions" => "`account_id`=" . $account->getId() . " AND `in_reply_to_id` = '{$message_id}'"));
         }
         if ($conv_mail instanceof MailContent) {
             $conv_id = $conv_mail->getConversationId();
         } else {
             $conv_id = MailContents::getNextConversationId($account->getId());
         }
         $mail->setConversationId($conv_id);
         $mail->save();
         // CLASSIFY RECEIVED MAIL WITH THE CONVERSATION
         $classified_with_conversation = false;
         $member_ids = array();
         if (user_config_option('classify_mail_with_conversation', null, $account->getContactId()) && isset($conv_mail) && $conv_mail instanceof MailContent) {
             $member_ids = array_merge($member_ids, $conv_mail->getMemberIds());
             $classified_with_conversation = true;
         }
         // CLASSIFY MAILS IF THE ACCOUNT HAS A DIMENSION MEMBER AND NOT CLASSIFIED WITH CONVERSATION
         $account_owner = Contacts::findById($account->getContactId());
         if ($account->getMemberId() != '' && !$classified_with_conversation) {
             $acc_mem_ids = explode(',', $account->getMemberId());
             foreach ($acc_mem_ids as $acc_mem_id) {
                 $member_ids[] = $acc_mem_id;
             }
         }
         foreach ($member_ids as $k => &$mem_id) {
             if ($mem_id == "") {
                 unset($member_ids[$k]);
             }
         }
         if (count($member_ids) > 0) {
             $members = Members::instance()->findAll(array('conditions' => 'id IN (' . implode(',', $member_ids) . ')'));
             $mail->addToMembers($members, true);
             /*	$ctrl = new ObjectController();
             			$ctrl->add_to_members($mail, $member_ids, $account_owner);*/
             $mail_controller = new MailController();
             $mail_controller->do_classify_mail($mail, $member_ids, null, false, true);
         }
         $user = Contacts::findById($account->getContactId());
         if ($user instanceof Contact) {
             $mail->subscribeUser($user);
         }
         $mail->addToSharingTable();
         $mail->orderConversation();
         //if email is from an imap account copy the state (read/unread) from the server
         if (!is_null($read)) {
             $mail->setIsRead($account->getContactId(), $read);
         }
         // increase received count
         $received_count++;
         // to apply email rules
         $null = null;
         Hook::fire('after_mail_download', $mail, $null);
         DB::commit();
     } catch (Exception $e) {
         $ret = null;
         Hook::fire('on_save_mail_error', array('content' => $content, 'account' => $account, 'exception' => $e), $ret);
         Logger::log($e->__toString());
         DB::rollback();
         if (FileRepository::isInRepository($repository_id)) {
             FileRepository::deleteFile($repository_id);
         }
         if (strpos($e->getMessage(), "Query failed with message 'Got a packet bigger than 'max_allowed_packet' bytes'") === false) {
             throw $e;
         }
     }
     unset($parsedMail);
     return false;
 }
Пример #8
0
	function delete($deleteMails = false){
		MailAccountContacts::deleteByAccount($this);
		if ($deleteMails) {
			session_commit();
			ini_set('memory_limit', '1024M');
			
			LinkedObjects::delete(array("(`object_id` IN (SELECT `object_id` FROM `".TABLE_PREFIX."mail_contents` WHERE `account_id` = " . DB::escape($this->getId()).")) 
				or (`rel_object_id` IN (SELECT `object_id` FROM `".TABLE_PREFIX."mail_contents` WHERE `account_id` = " . DB::escape($this->getId())."))")); 
			
      		SearchableObjects::delete(array("`rel_object_id` IN (SELECT `object_id` FROM `".TABLE_PREFIX."mail_contents` WHERE `account_id` = " . DB::escape($this->getId()).") "));
			ReadObjects::delete("`rel_object_id` IN (SELECT `object_id` FROM `".TABLE_PREFIX."mail_contents` WHERE `account_id` = " . DB::escape($this->getId()).") ");
			
			$account_email_ids = MailContents::findAll(array('id' => true, 'conditions' => '`account_id` = ' . DB::escape($this->getId()), 'include_trashed' => true));
			if (count($account_email_ids) > 0) {
				MailDatas::delete('id IN ('.implode(',', $account_email_ids).')');
				MailContents::delete('`account_id` = ' . DB::escape($this->getId()));
			}
		}
		if ($this->getIsImap()) {
			MailAccountImapFolders::delete('account_id = ' . $this->getId());
		}
		parent::delete();
	}
Пример #9
0
 function delete($deleteMails = false)
 {
     MailAccountUsers::deleteByAccount($this);
     if ($deleteMails) {
         session_commit();
         LinkedObjects::delete(array("(`object_id` IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_contents` WHERE `account_id` = " . DB::escape($this->getId()) . ") and `object_manager` = 'MailContents') \n\t\t\t\tor (`rel_object_id` IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_contents` WHERE `account_id` = " . DB::escape($this->getId()) . ") and `rel_object_manager` = 'MailContents')"));
         SearchableObjects::delete(array("`rel_object_manager` = 'MailContents' AND `rel_object_id` IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_contents` WHERE `account_id` = " . DB::escape($this->getId()) . ") "));
         ReadObjects::delete("`rel_object_manager` = 'MailContents' AND `rel_object_id` IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_contents` WHERE `account_id` = " . DB::escape($this->getId()) . ") ");
         $account_emails = MailContents::findAll(array('conditions' => '`account_id` = ' . DB::escape($this->getId()), 'include_trashed' => true));
         foreach ($account_emails as $email) {
             $email->delete();
         }
         //MailContents::delete('`account_id` = ' . DB::escape($this->getId()));
     }
     if ($this->getIsImap()) {
         MailAccountImapFolders::delete('account_id = ' . $this->getId());
     }
     parent::delete();
 }
 function sync_old_sent_mails()
 {
     if (!config_option("sent_mails_sync")) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     set_time_limit(0);
     if (logged_user()->isGuest()) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     $id = get_id();
     $account = MailAccounts::findById($id);
     if (!$account instanceof MailAccount) {
         flash_error(lang('mailAccount dnx'));
         ajx_current("empty");
         return;
     }
     $pass = $account->getSyncPass();
     $server = $account->getSyncServer();
     $folder = $account->getSyncFolder();
     $address = $account->getSyncAddr();
     if ($pass == null || $server == null || $folder == null || $address == null) {
         flash_error(lang('cant sync account'));
         ajx_current("empty");
         return;
     }
     $conditions = array("conditions" => array("`sync`=0 AND `state` = 3 AND `account_id` =" . $account->getId()));
     $check_sync_box = MailUtilities::checkSyncMailbox($server, $account->getSyncSsl(), $account->getOutgoingTrasnportType(), $account->getSyncSslPort(), $folder, $address, $pass);
     if ($check_sync_box) {
         $sent_mails = MailContents::findAll($conditions);
         if (count($sent_mails) == 0) {
             flash_success(lang('mails on imap acc already sync'));
             ajx_current("empty");
             return;
         }
         foreach ($sent_mails as $mail) {
             try {
                 DB::beginWork();
                 $content = $mail->getContent();
                 MailUtilities::sendToServerThroughIMAP($server, $account->getSyncSsl(), $account->getOutgoingTrasnportType(), $account->getSyncSslPort(), $folder, $address, $pass, $content);
                 $mail->setSync(true);
                 $mail->save();
                 DB::commit();
             } catch (Exception $e) {
                 DB::rollback();
             }
         }
         flash_success(lang('sync complete'));
         ajx_current("empty");
         return;
     } else {
         flash_error(lang('invalid sync settings'));
         ajx_current("empty");
         return;
     }
 }
 /**
  * Show dashboard index page
  *
  * @param void
  * @return null
  */
 function index()
 {
     $this->setHelp('dashboard');
     $tag = array_var($_GET, 'active_tag');
     $logged_user = logged_user();
     if (active_project() instanceof Project) {
         $wscsv = active_project()->getAllSubWorkspacesQuery(true);
     } else {
         $wscsv = null;
     }
     $activity_log = null;
     $include_private = $logged_user->isMemberOfOwnerCompany();
     $include_silent = $logged_user->isAdministrator();
     $activity_log = ApplicationLogs::getOverallLogs($include_private, $include_silent, $wscsv, config_option('dashboard_logs_count', 15));
     if (user_config_option('show charts widget') && module_enabled('reporting')) {
         $charts = ProjectCharts::getChartsAtProject(active_project(), active_tag());
         tpl_assign('charts', $charts);
         if (BillingCategories::count() > 0 && active_project() instanceof Project) {
             tpl_assign('billing_chart_data', active_project()->getBillingTotalByUsers(logged_user()));
         }
     }
     if (user_config_option('show messages widget') && module_enabled('notes')) {
         list($messages, $pagination) = ProjectMessages::getMessages(active_tag(), active_project(), 0, 10, '`updated_on`', 'DESC', false);
         tpl_assign('messages', $messages);
     }
     if (user_config_option('show comments widget')) {
         $comments = Comments::getSubscriberComments(active_project(), $tag);
         tpl_assign('comments', $comments);
     }
     if (user_config_option('show documents widget') && module_enabled('documents')) {
         list($documents, $pagination) = ProjectFiles::getProjectFiles(active_project(), null, false, ProjectFiles::ORDER_BY_MODIFYTIME, 'DESC', 1, 10, false, active_tag(), null);
         tpl_assign('documents', $documents);
     }
     if (user_config_option('show emails widget') && module_enabled('email')) {
         $activeWs = active_project();
         list($unread_emails, $pagination) = MailContents::getEmails($tag, null, 'received', 'unread', '', $activeWs, 0, 10);
         if ($activeWs && user_config_option('always show unread mail in dashboard')) {
             // add unread unclassified emails
             list($all_unread, $pagination) = MailContents::getEmails($tag, null, 'received', 'unread', 'unclassified', null, 0, 10);
             $unread_emails = array_merge($unread_emails, $all_unread);
         }
         tpl_assign('unread_emails', $unread_emails);
     }
     //Tasks widgets
     $show_pending = user_config_option('show pending tasks widget') && module_enabled('tasks');
     $show_in_progress = user_config_option('show tasks in progress widget') && module_enabled('tasks');
     $show_late = user_config_option('show late tasks and milestones widget') && module_enabled('tasks');
     if ($show_pending || $show_in_progress || $show_late) {
         $assigned_to = explode(':', user_config_option('pending tasks widget assigned to filter'));
         $to_company = array_var($assigned_to, 0, 0);
         $to_user = array_var($assigned_to, 1, 0);
         tpl_assign('assigned_to_user_filter', $to_user);
         tpl_assign('assigned_to_company_filter', $to_company);
     }
     if ($show_pending) {
         $tasks = ProjectTasks::getProjectTasks(active_project(), ProjectTasks::ORDER_BY_DUEDATE, 'ASC', null, null, $tag, $to_company, $to_user, null, true, 'all', false, false, false, 10);
         tpl_assign('dashtasks', $tasks);
     }
     if ($show_in_progress) {
         $tasks_in_progress = ProjectTasks::getOpenTimeslotTasks(logged_user(), logged_user(), active_project(), $tag, $to_company, $to_user);
         tpl_assign('tasks_in_progress', $tasks_in_progress);
     }
     if ($show_late) {
         tpl_assign('today_milestones', $logged_user->getTodayMilestones(active_project(), $tag, 10));
         tpl_assign('late_milestones', $logged_user->getLateMilestones(active_project(), $tag, 10));
         tpl_assign('today_tasks', ProjectTasks::getDayTasksByUser(DateTimeValueLib::now(), $logged_user, active_project(), $tag, $to_company, $to_user, 10));
         tpl_assign('late_tasks', ProjectTasks::getLateTasksByUser($logged_user, active_project(), $tag, $to_company, $to_user, 10));
     }
     tpl_assign('activity_log', $activity_log);
     $usu = logged_user();
     $conditions = array("conditions" => array("`state` >= 200 AND (`state`%2 = 0) AND `trashed_by_id`=0 AND `created_by_id` =" . $usu->getId()));
     $outbox_mails = MailContents::findAll($conditions);
     if ($outbox_mails != null) {
         if (count($outbox_mails) == 1) {
             flash_error(lang('outbox mail not sent', 1));
         } else {
             if (count($outbox_mails) > 1) {
                 flash_error(lang('outbox mails not sent', count($outbox_mails)));
             }
         }
     }
     ajx_set_no_toolbar(true);
 }