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;"); }
function delete_mails_from_server() { try { _log("Checking mail accounts to delete mails from server..."); $count = MailUtilities::deleteMailsFromServerAllAccounts(); _log("Deleted {$count} mails from server..."); } catch (Exception $e) { _log("Error deleting mails from server: " . $e->getMessage()); } }
function delete_mails_from_server() { if (Plugins::instance()->isActivePlugin('mail')) { try { _log("Checking mail accounts to delete mails from server..."); $count = MailUtilities::deleteMailsFromServerAllAccounts(); _log("Deleted $count mails from server..."); } catch (Exception $e) { _log("Error deleting mails from server: " . $e->getMessage()); } } }
if ($remove_quoted) { $content .= '<a id="'.$genid.'showQuotedText" style="font-family:verdana,arial,helvetica,sans-serif; font-size:11px; line-height:150%; cursor:pointer; color:#003562; padding-left:10px;" onclick="og.showQuotedHtml(\''.$pre.'\', \''.gen_id().'\', \''.$genid.'\', \''.$user_token.'\');"> :: '.lang('show quoted text').' ::</a>'; } $content .= ' <input type="hidden" id="'.$genid.'viewingImages" value="'.($remove_images?'no':'yes').'" /> <input type="hidden" id="'.$genid.'viewingQuoted" value="'.($remove_quoted?'no':'yes').'" /> '; } else { if ($email->getBodyPlain() != '') { $remove_quoted = MailUtilities::hasQuotedText($email->getBodyPlain()) && $hide_quoted_text_in_emails; $content = ""; if ($remove_quoted) { $content = MailUtilities::replaceQuotedText($email->getBodyPlain(), '-----'.lang('hidden quoted text').'-----'); $content = '<div id="'.$genid.'noQuoteMail">' . escape_html_whitespace(convert_to_links(clean($content))) . '</div>'; $content = str_replace('-----'.lang('hidden quoted text')."-----", '<span style="color: #777;font-style:italic;padding: 5px 20px"><'.lang('hidden quoted text').'></span>', $content); $content .= '<a class="internalLink" style="padding-left:10px;" id="'.$genid.'quotedLink" href="#" onclick="og.showQuotedText(\''.$genid.'\')">:: '.lang('show quoted text').' ::</a>'; } $content .= '<div id="'.$genid.'completeMail"'.($remove_quoted ? ' style="display:none"' : '').'>' . escape_html_whitespace(convert_to_links(clean($email->getBodyPlain()))) . '</div>'; $content = '<div style="max-height: 600px; overflow: auto;">' . $content . '</div>'; } else $content = '<div></div>'; } $strDraft = ''; if ($email->getIsDraft()) { $strDraft = "<span style='font-size:80%;color:red'> ".lang('draft')."</style>"; } tpl_assign("title", lang('email') . ': ' . clean($email->getSubject()).$strDraft); tpl_assign('iconclass', $email->isTrashed()? 'ico-large-email-trashed' : ($email->isArchived() ? 'ico-large-email-archived' : 'ico-large-email'));
$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){ DB::rollback(); } } echo(lang('sync complete')); }else{ echo(lang('invalid sync settings')); } ?><br><a href="<?php echo ROOT_URL?>/index.php?c=access&a=index" target="_top">Go back to Feng Office</a>
/** * Used for Drag & Drop, adds objects to a member * @author alvaro */ function add_objects_to_member() { $ids = json_decode(array_var($_POST, 'objects')); $mem_id = array_var($_POST, 'member'); if (!is_array($ids) || count($ids) == 0) { ajx_current("empty"); return; } try { DB::beginWork(); if ($mem_id) { $user_ids = array(); $member = Members::findById($mem_id); $objects = array(); $from = array(); foreach ($ids as $oid) { /* @var $obj ContentDataObject */ $obj = Objects::findObject($oid); if ($obj instanceof ContentDataObject && $obj->canAddToMember(logged_user(), $member, active_context())) { $dim_obj_type_content = DimensionObjectTypeContents::findOne(array('conditions' => array('`dimension_id`=? AND `dimension_object_type_id`=? AND `content_object_type_id`=?', $member->getDimensionId(), $member->getObjectTypeId(), $obj->getObjectTypeId()))); if (!$dim_obj_type_content instanceof DimensionObjectTypeContent) { continue; } if (!$dim_obj_type_content->getIsMultiple() || array_var($_POST, 'remove_prev')) { $db_res = DB::execute("SELECT group_concat(om.member_id) as old_members FROM " . TABLE_PREFIX . "object_members om INNER JOIN " . TABLE_PREFIX . "members m ON om.member_id=m.id WHERE m.dimension_id=" . $member->getDimensionId() . " AND om.object_id=" . $obj->getId()); $row = $db_res->fetchRow(); if (array_var($row, 'old_members') != "") { $from[$obj->getId()] = $row['old_members']; } // remove from previous members ObjectMembers::delete('`object_id` = ' . $obj->getId() . ' AND `member_id` IN (SELECT `m`.`id` FROM `' . TABLE_PREFIX . 'members` `m` WHERE `m`.`dimension_id` = ' . $member->getDimensionId() . ')'); } $obj->addToMembers(array($member)); $obj->addToSharingTable(); $objects[] = $obj; if (Plugins::instance()->isActivePlugin('mail') && $obj instanceof MailContent) { $conversation = MailContents::getMailsFromConversation($obj); foreach ($conversation as $conv_email) { if (array_var($_POST, 'attachment') && $conv_email->getHasAttachments()) { MailUtilities::parseMail($conv_email->getContent(), $decoded, $parsedEmail, $warnings); $classification_data = array(); for ($j = 0; $j < count(array_var($parsedEmail, "Attachments", array())); $j++) { $classification_data["att_" . $j] = true; } MailController::classifyFile($classification_data, $conv_email, $parsedEmail, array($member), array_var($_POST, 'remove_prev'), false); } } } // if object is contact ask to add default permissions in member if ($obj instanceof Contact && $obj->isUser() && can_manage_security(logged_user())) { $user_ids[] = $obj->getId(); } } else { throw new Exception(lang('you dont have permissions to classify object in member', $obj->getName(), $member->getName())); } } // if object is contact ask to add default permissions in member if (can_manage_security(logged_user()) && count($user_ids) > 0 && $member->getDimension()->getDefinesPermissions()) { evt_add('ask to assign default permissions', array('user_ids' => $user_ids, 'member' => array('id' => $member->getId(), 'name' => clean($member->getName())), '')); } Hook::fire('after_dragdrop_classify', $objects, $member); $display_name = $member->getName(); $lang_key = count($ids) > 1 ? 'objects moved to member success' : 'object moved to member success'; $log_datas = array(); $actions = array(); // add to application logs foreach ($objects as $obj) { $actions[$obj->getId()] = array_var($from, $obj->getId()) ? ApplicationLogs::ACTION_MOVE : ApplicationLogs::ACTION_COPY; $log_datas[$obj->getId()] = (array_var($from, $obj->getId()) ? "from:" . array_var($from, $obj->getId()) . ";" : "") . "to:" . $member->getId(); } } else { if ($dim_id = array_var($_POST, 'dimension')) { $dimension = Dimensions::getDimensionById($dim_id); $from = array(); foreach ($ids as $oid) { /* @var $obj ContentDataObject */ $obj = Objects::findObject($oid); if ($obj instanceof ContentDataObject) { $db_res = DB::execute("SELECT group_concat(om.member_id) as old_members FROM " . TABLE_PREFIX . "object_members om INNER JOIN " . TABLE_PREFIX . "members m ON om.member_id=m.id WHERE m.dimension_id=" . $dim_id . " AND om.object_id=" . $obj->getId()); $row = $db_res->fetchRow(); if (array_var($row, 'old_members') != "") { $from[$obj->getId()] = $row['old_members']; } // remove from previous members ObjectMembers::delete('`object_id` = ' . $obj->getId() . ' AND `member_id` IN ( SELECT `m`.`id` FROM `' . TABLE_PREFIX . 'members` `m` WHERE `m`.`dimension_id` = ' . $dim_id . ')'); } $obj->addToMembers(array()); $obj->addToSharingTable(); $objects[] = $obj; } $display_name = $dimension->getName(); $lang_key = count($ids) > 1 ? 'objects removed from' : 'object removed from'; $log_datas = array(); $actions = array(); // add to application logs foreach ($objects as $obj) { $actions[$obj->getId()] = array_var($from, $obj->getId()) ? ApplicationLogs::ACTION_MOVE : ApplicationLogs::ACTION_COPY; $log_datas[$obj->getId()] = array_var($from, $obj->getId()) ? "from:" . array_var($from, $obj->getId()) . ";" : ""; } } } DB::commit(); foreach ($objects as $object) { ApplicationLogs::instance()->createLog($object, $actions[$object->getId()], false, true, true, $log_datas[$object->getId()]); } flash_success(lang($lang_key, $display_name)); if (array_var($_POST, 'reload')) { ajx_current('reload'); } else { ajx_current('empty'); } } catch (Exception $e) { DB::rollback(); ajx_current("empty"); flash_error($e->getMessage()); } }
function print_mail() { $this->setLayout("html"); $email = MailContents::findById(get_id()); if (!$email instanceof MailContent) { flash_error(lang('email dnx')); ajx_current("empty"); return; } if ($email->getIsDeleted()) { flash_error(lang('email dnx deleted')); ajx_current("empty"); return; } if (!$email->canView(logged_user())) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } if ($email->getBodyHtml() != '') { MailUtilities::parseMail($email->getContent(), $decoded, $parsedEmail, $warnings); $tmp_folder = "/tmp/" . $email->getAccountId() . "_" . logged_user()->getId() . "_" . $email->getId() . "_temp_mail_content_res"; if (is_dir(ROOT . $tmp_folder)) { remove_dir(ROOT . $tmp_folder); } if ($parts_container = array_var($decoded, 0)) { $email->setBodyHtml(self::rebuild_body_html($email->getBodyHtml(), array_var($parts_container, 'Parts'), $tmp_folder)); } } tpl_assign('email', $email); $this->setTemplate("print_view"); //ajx_current("empty"); }
echo lang('to'); ?> :</td><td style="padding-left:10px;"> <?php echo MailUtilities::displayMultipleAddresses(clean($email->getTo()), true, false); ?> </td></tr> <?php if ($email->getCc() != '') { ?> <tr><td style="font-weight: bold;"><?php echo lang('mail CC'); ?> :</td><td style="padding-left:10px;"> <?php echo MailUtilities::displayMultipleAddresses(clean($email->getCc()), true, false); ?> </td></tr> <?php } ?> <tr><td style="font-weight: bold;"><?php echo lang('subject'); ?> :</td><td style="padding-left:10px;"> <?php echo $email->getSubject(); ?> </td></tr> </table> <br /><br />
function move() { if (logged_user()->isGuest()) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } ajx_current("empty"); $ids = array_var($_GET, 'ids'); if (!$ids) { return; } $wsid = array_var($_GET, 'ws'); $keep = array_var($_GET, 'keep', 1) == 1; $atts = array_var($_GET, 'atts', 0) == 1; $workspace = Projects::findById($wsid); if (!$workspace instanceof Project) { flash_error(lang('project dnx')); return; } $id_list = explode(",", $ids); $err = 0; $succ = 0; foreach ($id_list as $cid) { list($manager, $id) = explode(":", $cid); if (isset($maganer) && $maganer == 'Projects') { continue; } try { $obj = get_object_by_manager_and_id($id, $manager); if ($obj instanceof ProjectDataObject && $obj->canEdit(logged_user())) { if ($obj instanceof MailContent) { $conversation = MailContents::getMailsFromConversation($obj); $count = 0; foreach ($conversation as $conv_email) { $count += MailController::addEmailToWorkspace($conv_email->getId(), $workspace, $keep); if (array_var($_GET, 'atts') && $conv_email->getHasAttachments()) { MailUtilities::parseMail($conv_email->getContent(), $decoded, $parsedEmail, $warnings); $classification_data = array(); for ($j = 0; $j < count(array_var($parsedEmail, "Attachments", array())); $j++) { $classification_data["att_" . $j] = true; } $tags = implode(",", $conv_email->getTagNames()); MailController::classifyFile($classification_data, $conv_email, $parsedEmail, array($workspace), $keep, $tags); } } $succ++; } else { $remain = 0; if (!$keep || $obj instanceof ProjectTask || $obj instanceof ProjectMilestone) { // Tasks and Milestones can have only 1 workspace $removed = ""; $ws = $obj->getWorkspaces(); foreach ($ws as $w) { if (can_add(logged_user(), $w, get_class($obj->manager()))) { $obj->removeFromWorkspace($w); $removed .= $w->getId() . ","; } else { $remain++; } } $removed = substr($removed, 0, -1); $log_action = ApplicationLogs::ACTION_MOVE; $log_data = ($removed == "" ? "" : "from:{$removed};") . "to:{$wsid}"; } else { $log_action = ApplicationLogs::ACTION_COPY; $log_data = "to:{$wsid}"; } if ($remain > 0 && ($obj instanceof ProjectTask || $obj instanceof ProjectMilestone)) { $err++; } else { $obj->addToWorkspace($workspace); ApplicationLogs::createLog($obj, $obj->getWorkspaces(), $log_action, false, null, true, $log_data); $succ++; } } } else { $err++; } } catch (Exception $e) { $err++; } } if ($err > 0) { flash_error(lang("error move objects", $err)); } else { flash_success(lang("success move objects", $succ)); } }
/** * Used for Drag & Drop, adds objects to a member * @author alvaro */ function add_objects_to_member() { $ids = json_decode(array_var($_POST, 'objects')); $mem_id = array_var($_POST, 'member'); if (!is_array($ids) || count($ids) == 0) { ajx_current("empty"); return; } $member = Members::findById($mem_id); try { DB::beginWork(); $objects = array(); $from = array(); foreach ($ids as $oid) { /* @var $obj ContentDataObject */ $obj = Objects::findObject($oid); if ($obj instanceof ContentDataObject && $obj->canAddToMember(logged_user(), $member, active_context())) { $dim_obj_type_content = DimensionObjectTypeContents::findOne(array('conditions' => array('`dimension_id`=? AND `dimension_object_type_id`=? AND `content_object_type_id`=?', $member->getDimensionId(), $member->getObjectTypeId(), $obj->getObjectTypeId()))); if (!($dim_obj_type_content instanceof DimensionObjectTypeContent)) continue; if (!$dim_obj_type_content->getIsMultiple() || array_var($_POST, 'remove_prev')) { $db_res = DB::execute("SELECT group_concat(om.member_id) as old_members FROM ".TABLE_PREFIX."object_members om INNER JOIN ".TABLE_PREFIX."members m ON om.member_id=m.id WHERE m.dimension_id=".$member->getDimensionId()." AND om.object_id=".$obj->getId()); $row = $db_res->fetchRow(); if (array_var($row, 'old_members') != "") $from[$obj->getId()] = $row['old_members']; // remove from previous members ObjectMembers::delete('`object_id` = ' . $obj->getId() . ' AND `member_id` IN (SELECT `m`.`id` FROM `'.TABLE_PREFIX.'members` `m` WHERE `m`.`dimension_id` = '.$member->getDimensionId().')'); } $obj->addToMembers(array($member)); $obj->addToSharingTable(); $objects[] = $obj; if ($obj->allowsTimeslots()) { $timeslots = $obj->getTimeslots(); foreach ($timeslots as $timeslot) { $ts_mids = ObjectMembers::getMemberIdsByObject($timeslot->getId()); // if classified then reclassify if (count($ts_mids)) { if (array_var($_POST, 'remove_prev')) { ObjectMembers::delete('`object_id` = ' . $timeslot->getId() . ' AND `member_id` IN (SELECT `m`.`id` FROM `'.TABLE_PREFIX.'members` `m` WHERE `m`.`dimension_id` = '.$member->getDimensionId().')'); } $timeslot->addToMembers(array($member)); $timeslot->addToSharingTable(); $objects[] = $timeslot; } } } if ($obj instanceof MailContent) { $conversation = MailContents::getMailsFromConversation($obj); foreach ($conversation as $conv_email) { if (array_var($_POST, 'attachment') && $conv_email->getHasAttachments()) { MailUtilities::parseMail($conv_email->getContent(), $decoded, $parsedEmail, $warnings); $classification_data = array(); for ($j=0; $j < count(array_var($parsedEmail, "Attachments", array())); $j++) { $classification_data["att_".$j] = true; } MailController::classifyFile($classification_data, $conv_email, $parsedEmail, array($member), array_var($_POST, 'remove_prev')); } } } } else { throw new Exception(lang('you dont have permissions to classify object in member', $obj->getName(), $member->getName())); } } Hook::fire('after_dragdrop_classify', $objects, $member); DB::commit(); // add to application logs foreach ($objects as $object) { $action = array_var($from, $obj->getId()) ? ApplicationLogs::ACTION_MOVE : ApplicationLogs::ACTION_COPY; $log_data = (array_var($from, $obj->getId()) ? "from:" . array_var($from, $obj->getId()) . ";" : "") . "to:" . $member->getId(); ApplicationLogs::instance()->createLog($object, $action, false, true, true, $log_data); } $lang_key = count($ids)>1 ? 'objects moved to member success' : 'object moved to member success'; flash_success(lang($lang_key, $member->getName())); if (array_var($_POST, 'reload')) ajx_current('reload'); else ajx_current('empty'); } catch (Exception $e) { DB::rollback(); ajx_current("empty"); flash_error($e->getMessage()); } }
static function sendQueuedEmails() { $date = DateTimeValueLib::now(); $date->add("d", -2); $emails = QueuedEmails::getQueuedEmails($date); if (count($emails) <= 0) { return 0; } Env::useLibrary('swift'); $mailer = self::getMailer(); if (!$mailer instanceof Swift_Mailer) { throw new NotifierConnectionError(); } // if $fromSMTP = config_option("mail_transport", self::MAIL_TRANSPORT_MAIL) == self::MAIL_TRANSPORT_SMTP && config_option("smtp_authenticate", false); $count = 0; foreach ($emails as $email) { try { $body = $email->getBody(); $subject = $email->getSubject(); Hook::fire('notifier_email_body', $body, $body); Hook::fire('notifier_email_subject', $subject, $subject); if ($fromSMTP && config_option("smtp_address")) { $pos = strrpos($email->getFrom(), "<"); if ($pos !== false) { $sender_name = trim(substr($email->getFrom(), 0, $pos)); } else { $sender_name = ""; } $from = array(config_option("smtp_address") => $sender_name); } else { $pos = strrpos($email->getFrom(), "<"); if ($pos !== false) { $sender_name = trim(substr($email->getFrom(), 0, $pos)); $sender_address = str_replace(array("<", ">"), array("", ""), trim(substr($email->getFrom(), $pos, strlen($email->getFrom()) - 1))); } else { $sender_name = ""; $sender_address = $email->getFrom(); } $from = array($sender_address => $sender_name); } $message = Swift_Message::newInstance($subject)->setFrom($from)->setBody($body)->setContentType('text/html'); $to = MailUtilities::prepareEmailAddresses(implode(",", explode(";", $email->getTo()))); foreach ($to as $address) { $message->addTo(array_var($address, 0), array_var($address, 1)); } $result = $mailer->send($message); $email->delete(); $count++; } catch (Exception $e) { Logger::log('There has been a problem when sending the Queued emails. Problem:' . $e->getTraceAsString()); } } return $count; }
function mail_do_mark_as_read_unread_objects($ids_to_mark, $read) { $all_accounts = array(); $all_accounts_ids = array(); foreach ($ids_to_mark as $id) { $obj = Objects::findObject($id); if ($obj instanceof MailContent && logged_user() instanceof Contact) { //conversation set the rest of the conversation $uds_to_mark_from_conver = array(); if (user_config_option('show_emails_as_conversations')) { $emails_in_conversation = MailContents::getMailsFromConversation($obj); foreach ($emails_in_conversation as $email) { //$id is marked on object controller only mark the rest of the conversation if ($id != $email->getId()) { $email->setIsRead(logged_user()->getId(), $read); $uds_to_mark_from_conver[] = $email->getUid(); } } } //make the array with accounts and uids to send to the mail server //accounts if (!in_array($obj->getAccountId(), $all_accounts_ids)) { $account = $obj->getAccount(); //if logged user is owner of this account and is imap if ($account instanceof MailAccount && $account->getContactId() == logged_user()->getId() && $account->getIsImap()) { $all_accounts_ids[] = $obj->getAccountId(); $all_accounts[$account->getId()]['account'] = $account; } } //uids if (in_array($obj->getAccountId(), $all_accounts_ids)) { //add conversations uids //mientras ande mal el uid de los mails enviados si estan sincronizados no usar esta parte /*if (user_config_option('show_emails_as_conversations')) { foreach ($uds_to_mark_from_conver as $uid_conver){ $all_accounts[$obj->getAccountId()]['uids'][] = $uid_conver; } }*/ $all_accounts[$obj->getAccountId()]['folders'][$obj->getImapFolderName()][] = $obj->getUid(); } } } //foreach account send uids by folder to mark in the mail server foreach ($all_accounts as $account_data) { $account = $account_data['account']; $folders = $account_data['folders']; foreach ($folders as $key => $folder) { $folder_name = $key; $uids = $folder; if (!empty($folder_name)) { try { MailUtilities::setReadUnreadImapMails($account, $folder_name, $uids, $read); } catch (Exception $e) { Logger::log("Could not set mail as read on mail server, exception:\n" . $e->getMessage()); } } } } }