/** * the singleton pattern * * @return Felamimail_Controller_Message_Flags */ public static function getInstance() { if (self::$_instance === NULL) { self::$_instance = new Felamimail_Controller_Message_Flags(); } return self::$_instance; }
/** * test delete in different accounts */ public function testDeleteMessagesInDifferentAccounts() { $clonedAccount = $this->_cloneAccount(); $trashFolderMainAccount = $this->getFolder('Trash'); $trashFolderClonedAccount = $this->getFolder('Trash', $clonedAccount); // empty trash Felamimail_Controller_Folder::getInstance()->emptyFolder($trashFolderMainAccount); $cachedMessage1 = $this->messageTestHelper('multipart_mixed.eml', 'multipart/mixed', $trashFolderMainAccount); $cachedMessage2 = $this->messageTestHelper('complete.eml', 'text/service', $trashFolderClonedAccount); Felamimail_Controller_Message_Flags::getInstance()->addFlags(array($cachedMessage1->getId(), $cachedMessage2->getId()), array(Zend_Mail_Storage::FLAG_DELETED)); $result1 = $this->_searchOnImap('multipart/mixed', $trashFolderMainAccount); $this->assertEquals(0, count($result1), $trashFolderMainAccount->globalname . ' still contains multipart/mixed messages:' . print_r($result1, TRUE)); $result2 = $this->_searchOnImap('text/service', $trashFolderClonedAccount); $this->assertEquals(0, count($result2), $trashFolderClonedAccount->globalname . ' still contains text/service messages:' . print_r($result2, TRUE)); }
/** * send mail via transport (smtp) * * @param Zend_Mail $_mail * @param Felamimail_Model_Account $_account * @param boolean $_saveInSent * @param Felamimail_Model_Message $_message * @param array $_nonPrivateRecipients */ protected function _sendMailViaTransport(Zend_Mail $_mail, Felamimail_Model_Account $_account, Felamimail_Model_Message $_message = null, $_saveInSent = false, $_nonPrivateRecipients = array()) { $smtpConfig = $_account->getSmtpConfig(); if (!empty($smtpConfig) && (isset($smtpConfig['hostname']) || array_key_exists('hostname', $smtpConfig))) { $transport = new Felamimail_Transport($smtpConfig['hostname'], $smtpConfig); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { $debugConfig = $smtpConfig; $whiteList = array('hostname', 'username', 'port', 'auth', 'ssl'); foreach ($debugConfig as $key => $value) { if (!in_array($key, $whiteList)) { unset($debugConfig[$key]); } } Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' About to send message via SMTP with the following config: ' . print_r($debugConfig, true)); } Tinebase_Smtp::getInstance()->sendMessage($_mail, $transport); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' successful.'); } // append mail to sent folder if ($_saveInSent) { $this->_saveInSent($transport, $_account, $this->_getAdditionalHeaders($_message)); } if ($_message !== null) { // add reply/forward flags if set if (!empty($_message->flags) && ($_message->flags == Zend_Mail_Storage::FLAG_ANSWERED || $_message->flags == Zend_Mail_Storage::FLAG_PASSED) && $_message->original_id instanceof Felamimail_Model_Message) { Felamimail_Controller_Message_Flags::getInstance()->addFlags($_message->original_id, array($_message->flags)); } // add email notes to contacts (only to/cc) if ($_message->note) { $this->_addEmailNote($_nonPrivateRecipients, $_message->subject, $_message->getPlainTextBody()); } } } else { Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Could not send message, no smtp config found.'); } }
/** * Returns registry data of felamimail. * @see Tinebase_Application_Json_Abstract * * @return mixed array 'variable name' => 'data' * * @todo get default account data (host, port, ...) from preferences? */ public function getRegistryData() { try { $accounts = $this->searchAccounts(''); } catch (Exception $e) { Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Could not get accounts: ' . $e->getMessage()); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $e->getTraceAsString()); } $accounts = array('results' => array(), 'totalcount' => 0); } $supportedFlags = Felamimail_Controller_Message_Flags::getInstance()->getSupportedFlags(); $result = array('accounts' => $accounts, 'supportedFlags' => array('results' => $supportedFlags, 'totalcount' => count($supportedFlags))); $result['vacationTemplates'] = $this->getVacationMessageTemplates(); return $result; }
/** * set flags on cache if different * * @param array $flags * @param Felamimail_Model_Folder $_folderId * @param Tinebase_Record_RecordSet $messages * @param boolean $checkDiff */ protected function _setFlagsOnCache($flags, $folder, $messages, $checkDiff = true) { $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb()); $supportedFlags = array_keys(Felamimail_Controller_Message_Flags::getInstance()->getSupportedFlags(FALSE)); $updateCount = 0; foreach ($messages as $cachedMessage) { if (isset($flags[$cachedMessage->messageuid]) || array_key_exists($cachedMessage->messageuid, $flags)) { $newFlags = array_intersect($flags[$cachedMessage->messageuid]['flags'], $supportedFlags); if ($checkDiff) { $cachedFlags = array_intersect($cachedMessage->flags, $supportedFlags); $diff1 = array_diff($cachedFlags, $newFlags); $diff2 = array_diff($newFlags, $cachedFlags); } if (!$checkDiff || count($diff1) > 0 || count($diff2) > 0) { try { $this->_backend->setFlags(array($cachedMessage->getId()), $newFlags, $folder->getId()); $updateCount++; } catch (Zend_Db_Statement_Exception $zdse) { if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) { Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' Could not update flags, maybe message was deleted or is not in the cache yet.'); } Tinebase_Exception::log($zdse); } } } } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Updated ' . $updateCount . ' messages.'); } Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId); }
/** * (non-PHPdoc) * @see ActiveSync_Frontend_Abstract::updateEntry() */ public function updateEntry($folderId, $serverId, Syncroton_Model_IEntry $entry) { if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " CollectionId: {$folderId} Id: {$serverId}"); } try { $message = $this->_contentController->get($serverId); } catch (Tinebase_Exception_NotFound $tenf) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $tenf); } throw new Syncroton_Exception_NotFound($tenf->getMessage()); } if (isset($entry->read)) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " CollectionId: {$folderId} Id: {$serverId} set read flag: {$entry->read}"); } if ($entry->read == 1) { Felamimail_Controller_Message_Flags::getInstance()->addFlags($serverId, Zend_Mail_Storage::FLAG_SEEN); } else { Felamimail_Controller_Message_Flags::getInstance()->clearFlags($serverId, Zend_Mail_Storage::FLAG_SEEN); } } if (isset($entry->flag)) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " CollectionId: {$folderId} Id: {$serverId} set flagged flag: {$entry->flag->status}"); } if ($entry->flag->status == Syncroton_Model_EmailFlag::STATUS_ACTIVE) { Felamimail_Controller_Message_Flags::getInstance()->addFlags($serverId, Zend_Mail_Storage::FLAG_FLAGGED); } else { Felamimail_Controller_Message_Flags::getInstance()->clearFlags($serverId, Zend_Mail_Storage::FLAG_FLAGGED); } } $message->timestamp = $this->_syncTimeStamp; $this->_contentController->update($message); return; }
/** * Tears down the fixture * This method is called after a test is executed. * * @access protected */ protected function tearDown() { Felamimail_Controller_Message_Flags::getInstance()->addFlags($this->_createdMessages, array(Zend_Mail_Storage::FLAG_DELETED)); Tinebase_TransactionManager::getInstance()->rollBack(); }
/** * get complete message by id * * @param string|Felamimail_Model_Message $_id * @param string $_partId * @param boolean $_setSeen * @return Felamimail_Model_Message */ public function getCompleteMessage($_id, $_partId = NULL, $_setSeen = FALSE) { if ($_id instanceof Felamimail_Model_Message) { $message = $_id; } else { $message = $this->get($_id); } if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Getting message content ' . $message->messageuid); } $folder = Felamimail_Controller_Folder::getInstance()->get($message->folder_id); $account = Felamimail_Controller_Account::getInstance()->get($folder->account_id); $this->_checkMessageAccount($message, $account); $message = $this->_getCompleteMessageContent($message, $account, $_partId); if ($_setSeen) { Felamimail_Controller_Message_Flags::getInstance()->setSeenFlag($message); } $this->prepareAndProcessParts($message); if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($message->toArray(), true)); } return $message; }
/** * update existing entry * * @param string $_folderId * @param string $_serverId * @param SimpleXMLElement $_data * @return Tinebase_Record_Abstract */ public function updateEntry($_folderId, $_serverId, SimpleXMLElement $_entry) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " CollectionId: {$_folderId} Id: {$_serverId}"); $xmlData = $_entry->children('uri:Email'); if (isset($xmlData->Read)) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " CollectionId: {$_folderId} Id: {$_serverId} set read flag: {$xmlData->Read}"); } if ((int) $xmlData->Read === 1) { Felamimail_Controller_Message_Flags::getInstance()->addFlags($_serverId, Zend_Mail_Storage::FLAG_SEEN); } else { Felamimail_Controller_Message_Flags::getInstance()->clearFlags($_serverId, Zend_Mail_Storage::FLAG_SEEN); } $message = $this->_contentController->get($_serverId); $message->timestamp = $this->_syncTimeStamp; $this->_contentController->update($message); } return; }
/** * set flags on cache if different * * @param Tinebase_Record_RecordSet $_messages * @param array $_flags * @param string $_folderId * * @todo check which flags our imap server supports and allow more */ protected function _setFlagsOnCache($_messages, $_flags, $_folderId) { $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb()); $supportedFlags = array_keys(Felamimail_Controller_Message_Flags::getInstance()->getSupportedFlags(FALSE)); $updateCount = 0; foreach ($_messages as $cachedMessage) { if (array_key_exists($cachedMessage->messageuid, $_flags)) { $newFlags = array_intersect($_flags[$cachedMessage->messageuid]['flags'], $supportedFlags); $cachedFlags = array_intersect($cachedMessage->flags, $supportedFlags); $diff1 = array_diff($cachedFlags, $newFlags); $diff2 = array_diff($newFlags, $cachedFlags); if (count($diff1) > 0 || count($diff2) > 0) { $this->_backend->setFlags(array($cachedMessage->getId()), $newFlags, $_folderId); $updateCount++; } } } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Updated ' . $updateCount . ' flags.'); } Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId); }
/** * Returns registry data of felamimail. * @see Tinebase_Application_Json_Abstract * * @return mixed array 'variable name' => 'data' * * @todo get default account data (host, port, ...) from preferences? */ public function getRegistryData() { try { $accounts = $this->searchAccounts(''); } catch (Exception $e) { Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Could not get accounts: ' . $e->getMessage()); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $e->getTraceAsString()); } $accounts = array('results' => array(), 'totalcount' => 0); } $supportedFlags = Felamimail_Controller_Message_Flags::getInstance()->getSupportedFlags(); $extraSenderAccounts = array(); foreach ($accounts['results'] as $key => $account) { try { $extraSenderAccounts = Felamimail_Controller_Folder::getInstance()->getUsersWithSendAsAcl($account['id']); } catch (Felamimail_Exception_IMAPFolderNotFound $ex) { if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . $ex->getMessage()); } // Ignore this exception here, it happens when INBOX folder is unaccessible. } catch (Felamimail_Exception_IMAPServiceUnavailable $ex) { // Ignoring this Exception here. } unset($account['host']); unset($account['port']); unset($account['ssl']); unset($account['smtp_hostname']); unset($account['smtp_port']); unset($account['smtp_ssl']); unset($account['smtp_auth']); $accounts['results'][$key] = $account; } $result = array('extraSenderAccounts' => $extraSenderAccounts, 'accounts' => $accounts, 'supportedFlags' => array('results' => $supportedFlags, 'totalcount' => count($supportedFlags))); $defaults = Tinebase_Config::getInstance()->getConfigAsArray(Tinebase_Config::IMAP); $defaults['smtp'] = Tinebase_Config::getInstance()->getConfigAsArray(Tinebase_Config::SMTP); // remove sensitive data unset($defaults['user']); unset($defaults['host']); unset($defaults['port']); unset($defaults['password']); unset($defaults['smtp']); $result['defaults'] = $defaults; return $result; }
/** * test flag update */ public function testUpdateFlags() { $message = $this->_emailTestClass->messageTestHelper('multipart_mixed.eml', 'multipart/mixed'); // appended messages already have the SEEN flag $this->assertTrue(in_array(Zend_Mail_Storage::FLAG_SEEN, $message->flags), 'SEEN flag not found: ' . print_r($message->flags, TRUE)); // add another flag Felamimail_Controller_Message_Flags::getInstance()->addFlags($message, Zend_Mail_Storage::FLAG_ANSWERED); while (!isset($updatedFolder) || $updatedFolder->cache_status === Felamimail_Model_Folder::CACHE_STATUS_INCOMPLETE) { $updatedFolder = $this->_controller->updateCache($this->_folder, 30, 1); } // clear/add flag on imap $this->_imap->clearFlags($message->messageuid, array(Zend_Mail_Storage::FLAG_SEEN)); $flagsToAdd = array(Zend_Mail_Storage::FLAG_FLAGGED, Zend_Mail_Storage::FLAG_DRAFT, Zend_Mail_Storage::FLAG_PASSED); try { $this->_imap->addFlags($message->messageuid, $flagsToAdd); } catch (Zend_Mail_Storage_Exception $zmse) { // some imap servers (dbmail, ...) do not support PASSED flag if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $zmse->getMessage()); } $this->_imap->addFlags($message->messageuid, array(Zend_Mail_Storage::FLAG_FLAGGED, Zend_Mail_Storage::FLAG_DRAFT)); } $this->_controller->updateFlags($updatedFolder); $cachedMessage = Felamimail_Controller_Message::getInstance()->get($message->getId()); $this->assertTrue(!in_array(Zend_Mail_Storage::FLAG_SEEN, $cachedMessage->flags), 'SEEN flag found: ' . print_r($cachedMessage->flags, TRUE)); $expectedFlags = array(Zend_Mail_Storage::FLAG_FLAGGED, Zend_Mail_Storage::FLAG_DRAFT, Zend_Mail_Storage::FLAG_ANSWERED); $this->assertEquals(3, count($cachedMessage->flags), 'found too many flags: ' . print_r($cachedMessage->flags, TRUE)); foreach ($expectedFlags as $expectedFlag) { $this->assertTrue(in_array($expectedFlag, $cachedMessage->flags), $expectedFlag . ' flag not found: ' . print_r($cachedMessage->flags, TRUE)); } $this->_controller->updateFlags($updatedFolder); $cachedMessageAgain = Felamimail_Controller_Message::getInstance()->get($message->getId()); // cached message should not have been updated again $this->assertEquals($cachedMessage->timestamp->__toString(), $cachedMessageAgain->timestamp->__toString()); }
/** * test sync of existing imap folder */ public function testPingForEmails() { $imapConfig = Tinebase_Config::getInstance()->get(Tinebase_Config::IMAP); if (!$imapConfig || !isset($imapConfig->useSystemAccount) || $imapConfig->useSystemAccount != TRUE) { $this->markTestSkipped('IMAP backend not configured'); } $emailController = new ActiveSync_Controller_Email($this->_device, new Tinebase_DateTime(null, null, 'de_DE')); $folders = $emailController->getAllFolders(); $this->assertGreaterThan(0, count($folders)); foreach ($folders as $folder) { if (strtoupper($folder['displayName']) == 'INBOX') { break; } } $emailController->updateCache($folder['folderId']); // first do a foldersync $doc = new DOMDocument(); $doc->loadXML('<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE AirSync PUBLIC "-//AIRSYNC//DTD AirSync//EN" "http://www.microsoft.com/"> <FolderSync xmlns="uri:FolderHierarchy"><SyncKey>0</SyncKey></FolderSync>'); $folderSync = new Syncope_Command_FolderSync($doc, $this->_device, $this->_device->policykey); $folderSync->handle(); $syncDoc = $folderSync->getResponse(); #$syncDoc->formatOutput = true; echo $syncDoc->saveXML(); // request initial synckey $doc = new DOMDocument(); $doc->loadXML('<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE AirSync PUBLIC "-//AIRSYNC//DTD AirSync//EN" "http://www.microsoft.com/"> <Sync xmlns="uri:AirSync" xmlns:AirSyncBase="uri:AirSyncBase"><Collections><Collection><Class>Email</Class><SyncKey>0</SyncKey><CollectionId>' . $folder['folderId'] . '</CollectionId><DeletesAsMoves/><GetChanges/><WindowSize>100</WindowSize><Options><FilterType>4</FilterType><AirSyncBase:BodyPreference><AirSyncBase:Type>1</AirSyncBase:Type><AirSyncBase:TruncationSize>5120</AirSyncBase:TruncationSize></AirSyncBase:BodyPreference><Conflict>1</Conflict></Options></Collection></Collections></Sync>'); $sync = new Syncope_Command_Sync($doc, $this->_device, $this->_device->policykey); $sync->handle(); $syncDoc = $sync->getResponse(); #$syncDoc->formatOutput = true; echo $syncDoc->saveXML(); // now do the first sync $doc = new DOMDocument(); $doc->loadXML('<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE AirSync PUBLIC "-//AIRSYNC//DTD AirSync//EN" "http://www.microsoft.com/"> <Sync xmlns="uri:AirSync" xmlns:AirSyncBase="uri:AirSyncBase"><Collections><Collection><Class>Email</Class><SyncKey>1</SyncKey><CollectionId>' . $folder['folderId'] . '</CollectionId><DeletesAsMoves/><GetChanges/><WindowSize>100</WindowSize><Options><FilterType>4</FilterType><AirSyncBase:BodyPreference><AirSyncBase:Type>1</AirSyncBase:Type><AirSyncBase:TruncationSize>5120</AirSyncBase:TruncationSize></AirSyncBase:BodyPreference><Conflict>1</Conflict></Options></Collection></Collections></Sync>'); $sync = new Syncope_Command_Sync($doc, $this->_device, $this->_device->policykey); $sync->handle(); $syncDoc = $sync->getResponse(); #$syncDoc->formatOutput = true; echo $syncDoc->saveXML(); // and now we can start the ping request $doc = new DOMDocument(); $doc->loadXML('<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE AirSync PUBLIC "-//AIRSYNC//DTD AirSync//EN" "http://www.microsoft.com/"> <Ping xmlns="uri:Ping"><HeartBeatInterval>10</HeartBeatInterval><Folders><Folder><Id>' . $folder['folderId'] . '</Id><Class>Email</Class></Folder></Folders></Ping>'); // add test email message to folder $emailTest = new Felamimail_Controller_MessageTest(); $emailTest->setUp(); $inbox = $emailTest->getFolder('INBOX'); $email = file_get_contents(dirname(__FILE__) . '/../../Felamimail/files/text_plain.eml'); Felamimail_Controller_Message::getInstance()->appendMessage($inbox, $email); $ping = new Syncope_Command_Ping($doc, $this->_device, null); $ping->handle(); $responseDoc = $ping->getResponse(); $responseDoc->formatOutput = true; //echo $responseDoc->saveXML(); $xpath = new DomXPath($responseDoc); $xpath->registerNamespace('Ping', 'uri:Ping'); $nodes = $xpath->query('//Ping:Ping/Ping:Status'); $this->assertEquals(1, $nodes->length, $responseDoc->saveXML()); $this->assertEquals(Syncope_Command_Ping::STATUS_CHANGES_FOUND, $nodes->item(0)->nodeValue, $responseDoc->saveXML()); $nodes = $xpath->query('//Ping:Ping/Ping:Folders/Ping:Folder'); $this->assertEquals(1, $nodes->length, $responseDoc->saveXML()); $this->assertEquals($folder['folderId'], $nodes->item(0)->nodeValue, $responseDoc->saveXML()); $message = $emailTest->searchAndCacheMessage('text/plain', $inbox); Felamimail_Controller_Message_Flags::getInstance()->addFlags(array($message), array(Zend_Mail_Storage::FLAG_DELETED)); }
/** * Tears down the fixture * This method is called after a test is executed. * * @access protected */ protected function tearDown() { if ($this->_emailTestClass instanceof Felamimail_Controller_MessageTest) { $this->_emailTestClass->tearDown(); } Felamimail_Controller_Message_Flags::getInstance()->addFlags($this->_createdMessages, array(Zend_Mail_Storage::FLAG_DELETED)); Felamimail_Controller_Message::getInstance()->delete($this->_createdMessages->getArrayOfIds()); parent::tearDown(); }
/** * send mail via transport (smtp) * * @param Zend_Mail $_mail * @param Felamimail_Model_Account $_account * @param boolean $_saveInSent * @param Felamimail_Model_Message $_message * @param array $_nonPrivateRecipients */ protected function _sendMailViaTransport(Zend_Mail $_mail, Felamimail_Model_Account $_account, Felamimail_Model_Message $_message = NULL, $_saveInSent = false, $_nonPrivateRecipients = array()) { $smtpConfig = $_account->getSmtpConfig(); if (!empty($smtpConfig) && array_key_exists('hostname', $smtpConfig)) { $transport = new Felamimail_Transport($smtpConfig['hostname'], $smtpConfig); // send message via smtp if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' About to send message via SMTP ...'); } Tinebase_Smtp::getInstance()->sendMessage($_mail, $transport); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' successful.'); } // append mail to sent folder if ($_saveInSent) { $this->_saveInSent($transport, $_account, $_message !== NULL ? array('Bcc' => $_message->bcc) : array()); } if ($_message !== NULL) { // add reply/forward flags if set if (!empty($_message->flags) && ($_message->flags == Zend_Mail_Storage::FLAG_ANSWERED || $_message->flags == Zend_Mail_Storage::FLAG_PASSED) && $_message->original_id instanceof Felamimail_Model_Message) { Felamimail_Controller_Message_Flags::getInstance()->addFlags($_message->original_id, array($_message->flags)); } // add email notes to contacts (only to/cc) if ($_message->note) { $this->_addEmailNote($_nonPrivateRecipients, $_message->subject, $_message->getPlainTextBody()); } } } else { Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Could not send message, no smtp config found.'); } }