Exemplo n.º 1
0
 /**
  * Saves a sent email into the database.
  *
  * @param Conjoon_Modules_Groupware_Email_Draft $message
  * @param Conjoon_Modules_Groupware_Email_Account $account
  * @param integer $userId
  * @param Conjoon_Mail_Sent $mailSent
  * @param string $type
  * @param integer $referencesId The id of the email that was refernced sending this
  * message. This argument will only be taken into account if $type euqals to
  * reply or reply_all
  * @param array $postedAttachments
  * @param array $removeAttachmentIds
  *
  * @return array the data from groupware_email_item associated with
  * the newly saved entry
  */
 public function saveSentEmail(Conjoon_Modules_Groupware_Email_Draft $message, Conjoon_Modules_Groupware_Email_Account $account, $userId, Conjoon_Mail_Sent $mailSent, $type = "", $referencesId = -1, $postedAttachments = array(), $removeAttachmentIds = array())
 {
     $mail = $mailSent->getMailObject();
     $userId = (int) $userId;
     $accountId = (int) $account->getId();
     $messageId = (int) $message->getId();
     $referenceId = $referencesId <= 0 ? 0 : $referencesId;
     if ($userId <= 0 || $accountId <= 0) {
         return array();
     }
     $referencesModel = new Conjoon_Modules_Groupware_Email_Item_Model_References();
     $emailRecipientsFilter = new Conjoon_Filter_EmailRecipients();
     $emailRecipientsToStringFilter = new Conjoon_Filter_EmailRecipientsToString();
     $outboxModel = new Conjoon_Modules_Groupware_Email_Item_Model_Outbox();
     $folderModel = new Conjoon_Modules_Groupware_Email_Folder_Model_Folder();
     // first check the folder type of the email
     $folderId = $message->getGroupwareEmailFoldersId();
     $messageType = 'scratch';
     // negative/0, means the message was created from draft
     if ($folderId <= 0) {
         $messageType = 'scratch';
     } else {
         // anything else needs the meta info type fetched out of the folder model
         $metaInfo = $folderModel->getMetaInfo($folderId);
         switch ($metaInfo) {
             case Conjoon_Modules_Groupware_Email_Folder_Model_Folder::META_INFO_OUTBOX:
                 $messageType = 'outbox';
                 break;
             case Conjoon_Modules_Groupware_Email_Folder_Model_Folder::META_INFO_DRAFT:
                 $messageType = 'draft';
                 break;
                 // anything else is probably a reply or forward to an existing message in any other
                 // folder
             // anything else is probably a reply or forward to an existing message in any other
             // folder
             default:
                 $messageType = 'scratch';
                 break;
         }
     }
     // adjust the message type depending on the type
     if ($type == 'reply' || $type == 'reply_all' || $type == 'forward') {
         $messageType = 'scratch';
     }
     // prefill update/insert arrays
     $sentFolderId = $folderModel->getSentFolder($accountId, $userId);
     $date = new Zend_Date($mail->getDate(), Zend_Date::RFC_2822);
     $replyTo = (string) $mail->getReplyTo();
     $to = $message->getTo();
     $cc = $message->getCc();
     $bcc = $message->getBcc();
     $fromAddress = new Conjoon_Modules_Groupware_Email_Address(array($account->getAddress(), $account->getUserName()));
     $toString = array();
     foreach ($to as $recipient) {
         $toString[] = $recipient->__toString();
     }
     $toString = implode(', ', $toString);
     $ccString = array();
     foreach ($cc as $recipient) {
         $ccString[] = $recipient->__toString();
     }
     $ccString = implode(', ', $ccString);
     $bccString = array();
     foreach ($bcc as $recipient) {
         $bccString[] = $recipient->__toString();
     }
     $bccString = implode(', ', $bccString);
     $outboxUpdate = array('sent_timestamp' => time(), 'raw_header' => $mailSent->getSentHeaderText(), 'raw_body' => $mailSent->getSentBodyText(), 'groupware_email_accounts_id' => $message->getGroupwareEmailAccountsId());
     /**
      * @see Conjoon_Filter_DateToUtc
      */
     require_once 'Conjoon/Filter/DateToUtc.php';
     $filterToUtc = new Conjoon_Filter_DateToUtc();
     $itemUpdate = array('reply_to' => $replyTo, 'from' => $fromAddress->__toString(), 'recipients' => $emailRecipientsToStringFilter->filter($emailRecipientsFilter->filter(array($toString, $ccString, $bccString))), 'sender' => $emailRecipientsToStringFilter->filter($emailRecipientsFilter->filter(array($fromAddress->__toString()))), 'groupware_email_folders_id' => $sentFolderId, 'date' => $filterToUtc->filter($date->get(Zend_Date::ISO_8601)));
     switch ($messageType) {
         // if the message was sent from an opened draft or from the outbox,
         // we simply can create a new entry in the tables,
         // as if it was created from scratch
         // if, however, the email was sent from drafts, a user might have updated
         // the addresses, the subject, the email text and the attachments.
         // those fields have to be updated in the datastorage as well
         case 'draft':
             Conjoon_Util_Array::apply($itemUpdate, array('subject' => $message->getSubject(), 'to' => $toString, 'cc' => $ccString, 'bcc' => $bccString, 'content_text_plain' => $message->getContentTextPlain(), 'content_text_html' => $message->getContentTextHtml()));
             $this->saveAttachmentsForDraft($message, $postedAttachments, $removeAttachmentIds);
             // most simple: mesageType is outbox which means we have simply to update a few fields
         // most simple: mesageType is outbox which means we have simply to update a few fields
         case 'outbox':
             if ($messageId <= 0 || $sentFolderId == 0) {
                 return array();
             }
             // the message might have referenced an item when it was created.
             // look up entry in reference table and set this to is_pending = false
             $referencesWhere = $referencesModel->getAdapter()->quoteInto('groupware_email_items_id = ?', $messageId) . ' AND ' . $referencesModel->getAdapter()->quoteInto('user_id = ?', $userId);
             $referencesModel->update(array('is_pending' => 0), $referencesWhere);
             $outboxWhere = $outboxModel->getAdapter()->quoteInto('groupware_email_items_id = ?', $messageId);
             $outboxModel->update($outboxUpdate, $outboxWhere);
             $itemWhere = $this->getAdapter()->quoteInto('id = ?', $messageId);
             $this->update($itemUpdate, $itemWhere);
             return $this->getItemForUser($messageId, $userId);
             break;
             // if the message was created from scratch, i.e. has no id and no folderId,
             // save a fresh row into the tables groupware_email_items_id, groupware_email_items_flags,
             // groupware_email_items_outbox
         // if the message was created from scratch, i.e. has no id and no folderId,
         // save a fresh row into the tables groupware_email_items_id, groupware_email_items_flags,
         // groupware_email_items_outbox
         case 'scratch':
             Conjoon_Util_Array::apply($itemUpdate, array('subject' => $message->getSubject(), 'to' => $toString, 'cc' => $ccString, 'bcc' => $bccString, 'in_reply_to' => $message->getInReplyTo(), 'references' => $message->getReferences(), 'content_text_plain' => $message->getContentTextPlain(), 'content_text_html' => $message->getContentTextHtml()));
             $messageId = (int) $this->insert($itemUpdate);
             if ($messageId <= 0) {
                 return array();
             }
             $flagModel = new Conjoon_Modules_Groupware_Email_Item_Model_Flag();
             $referenceType = '';
             if (($type == Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_REPLY || $type == Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_REPLY_ALL || $type == Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_FORWARD) && $referenceId != 0) {
                 $referenceType = $type;
                 $referenceUpdate = array('groupware_email_items_id' => $messageId, 'user_id' => $userId, 'reference_items_id' => $referenceId, 'reference_type' => $referenceType);
                 $referencesModel->insert($referenceUpdate);
             }
             $flagUpdate = array('groupware_email_items_id' => $messageId, 'user_id' => $userId, 'is_read' => 1, 'is_spam' => 0, 'is_deleted' => 0);
             $flagModel->insert($flagUpdate);
             Conjoon_Util_Array::apply($outboxUpdate, array('groupware_email_items_id' => $messageId));
             $outboxModel->insert($outboxUpdate);
             $message->setId($messageId);
             $this->saveAttachmentsForDraft($message, $postedAttachments, $removeAttachmentIds);
             return $this->getItemForUser($messageId, $userId);
             break;
     }
     return null;
 }
Exemplo n.º 2
0
 /**
  * Returns an assoc array with the data of an draft. The returned array
  * has all properties as according to Conjoon_Modules_Groupware_Email_Draft.
  *
  * @param integer $itemId
  * @param integer $userId
  * @param string $context The context used to fetch the draft. Important
  * when dealign with contexts "reply", "reply_all" and "forward".
  * - context "forward": fields "references" and "in_reply_to" will be set
  * to an empty string
  * - context "reply", "reply_all": "in_reply_to" will be set to the message-id
  * of the email, references will be concatenated with the message-id
  *
  * @return array
  */
 public function getDraft($itemId, $userId, $context = '')
 {
     $itemId = (int) $itemId;
     if ($itemId <= 0) {
         return array();
     }
     $itemModel = new Conjoon_Modules_Groupware_Email_Item_Model_Item();
     $row = $itemModel->fetchRow($itemModel->select()->from($itemModel)->where('id = ?', $itemId));
     if (!$row) {
         return array();
     }
     $draft = array('id' => $row->id, 'date' => $row->date, 'subject' => $row->subject, 'from' => $row->from, 'reply_to' => $row->reply_to, 'to' => $row->to, 'cc' => $row->cc, 'bcc' => $row->bcc, 'in_reply_to' => $row->in_reply_to, 'references' => $row->references, 'content_text_plain' => $row->content_text_plain, 'content_text_html' => $row->content_text_html, 'groupware_email_folders_id' => $row->groupware_email_folders_id, 'attachments' => array());
     // clear memory
     unset($row);
     // set in_reply_to, references according to the context
     switch ($context) {
         case Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_REPLY:
         case Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_REPLY_ALL:
             $inboxModel = new Conjoon_Modules_Groupware_Email_Item_Model_Inbox();
             $messageId = $inboxModel->getMessageIdForItem($draft['id']);
             if ($messageId != "") {
                 $draft['in_reply_to'] = $messageId;
                 $draft['references'] = $draft['references'] != '' ? $draft['references'] . ' ' . $messageId : $messageId;
             } else {
                 $draft['in_reply_to'] = '';
                 $draft['references'] = '';
             }
             break;
         case Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_FORWARD:
             $draft['in_reply_to'] = '';
             $draft['references'] = '';
         case '':
         case Conjoon_Modules_Groupware_Email_Keys::REFERENCE_TYPE_EDIT:
             /**
              * @see Conjoon_Modules_Groupware_Email_Attachment_Model_Attachment
              */
             require_once 'Conjoon/Modules/Groupware/Email/Attachment/Model/Attachment.php';
             $attachmentModel = new Conjoon_Modules_Groupware_Email_Attachment_Model_Attachment();
             $draft['attachments'] = $attachmentModel->getAttachmentsForItem($draft['id'])->toArray();
             break;
     }
     // check if the item is available in outbox and get the id of it under which it was
     // created. Otherwise, get the standard account out of the accounts-table
     $outboxModel = new Conjoon_Modules_Groupware_Email_Item_Model_Outbox();
     $accIdRow = $outboxModel->fetchRow($outboxModel->select()->from($outboxModel, array('groupware_email_accounts_id'))->where('groupware_email_items_id = ? ', $draft['id']));
     $accountModel = new Conjoon_Modules_Groupware_Email_Account_Model_Account();
     if (!$accIdRow) {
         $accId = $accountModel->getStandardAccountIdForUser($userId);
     } else {
         $accId = $accIdRow->groupware_email_accounts_id;
         // check if the account still exists
         $account = $accountModel->getAccount($accId, $userId);
         if (empty($account)) {
             $accId = $accountModel->getStandardAccountIdForUser($userId);
             if ($accId == 0) {
                 return array();
             }
         }
     }
     $draft['groupware_email_accounts_id'] = $accId;
     return $draft;
 }