Exemple #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;
 }
 public function getProcessedData()
 {
     $data = parent::getProcessedData();
     $data['contentTextHtml'] = "";
     switch ($this->_context) {
         case self::CONTEXT_NEW:
             $name = $data['name'];
             $address = $data['address'];
             unset($data['name']);
             unset($data['type']);
             unset($data['address']);
             $data['to'] = array();
             if ($address != "") {
                 /**
                  * @see Conjoon_Modules_Groupware_Email_Address
                  */
                 require_once 'Conjoon/Modules/Groupware/Email/Address.php';
                 if ($name === $address) {
                     $data['to'] = array(new Conjoon_Modules_Groupware_Email_Address(array($address)));
                 } else {
                     /**
                      * @see Conjoon_Filter_EmailRecipientsToString
                      */
                     require_once 'Conjoon/Filter/EmailRecipientsToString.php';
                     $recipientToStringFilter = new Conjoon_Filter_EmailRecipientsToString();
                     $str = $recipientToStringFilter->filter(array(array($address, $name)));
                     $data['to'] = array(new Conjoon_Modules_Groupware_Email_Address(array($address, $str)));
                 }
             }
             return $data;
             break;
         case self::CONTEXT_REPLY:
             if (!empty($data['replyTo'])) {
                 $data['to'] = $data['replyTo'];
             } else {
                 $data['to'] = $data['from'];
             }
             $data['cc'] = array();
             $data['bcc'] = array();
             break;
         case self::CONTEXT_REPLY_ALL:
             $data['userEmailAddresses'] = (array) $data['userEmailAddresses'];
             $merge = array();
             for ($i = 0, $len = max(count($data['cc']), count($data['to'])); $i < $len; $i++) {
                 if (isset($data['cc'][$i]) && !in_array($data['cc'][$i][0], $data['userEmailAddresses'])) {
                     $merge[] = $data['cc'][$i];
                 }
                 if (isset($data['to'][$i]) && !in_array($data['to'][$i][0], $data['userEmailAddresses'])) {
                     $merge[] = $data['to'][$i];
                 }
             }
             $data['cc'] = $merge;
             if (!empty($data['replyTo'])) {
                 $data['to'] = $data['replyTo'];
             } else {
                 $data['to'] = $data['from'];
             }
             break;
         case self::CONTEXT_EDIT:
             break;
         case self::CONTEXT_FORWARD:
             $data['inReplyTo'] = "";
             $data['bcc'] = array();
             break;
     }
     // unsetting is now donw in the controller
     //unset($data['userEmailAddresses']);
     //unset($data['from']);
     //unset($data['replyTo']);
     /**
      * @see Conjoon_Filter_QuoteToBlockquote
      */
     require_once 'Conjoon/Filter/QuoteToBlockquote.php';
     /**
      * @see Conjoon_Filter_NormalizeLineFeeds
      */
     require_once 'Conjoon/Filter/NormalizeLineFeeds.php';
     /**
      * @see Conjoon_Filter_PlainToHtml
      */
     require_once 'Conjoon/Filter/PlainToHtml.php';
     /**
      * @see Conjoon_Filter_SignatureStrip
      */
     require_once 'Conjoon/Filter/SignatureStrip.php';
     $signatureStripper = new Conjoon_Filter_SignatureStrip();
     $quoteFilter = new Conjoon_Filter_QuoteToBlockquote();
     $lineFeedFilter = new Conjoon_Filter_NormalizeLineFeeds();
     $plainToHtmlFilter = new Conjoon_Filter_PlainToHtml();
     $data['contentTextPlain'] = $signatureStripper->filter($lineFeedFilter->filter($data['contentTextPlain']));
     // if signature stripper returned empty messagem, return the data
     if (trim($data['contentTextPlain']) == "") {
         $data['contentTextPlain'] = trim($data['contentTextPlain']);
         return $data;
     }
     $startTag = "";
     $endTag = "";
     switch ($this->_context) {
         case self::CONTEXT_REPLY:
         case self::CONTEXT_REPLY_ALL:
             $startTag = "<blockquote>";
             $endTag = "</blockquote>";
             break;
     }
     /**
      * @see \Conjoon_Text_Transformer_Mail_EmailAddressToHtmlTransformer
      */
     require_once 'Conjoon/Text/Transformer/Mail/EmailAddressToHtmlTransformer.php';
     $transformer = new \Conjoon_Text_Transformer_Mail_EmailAddressToHtmlTransformer();
     /**
      * @see \Conjoon_Filter_UrlToATag
      */
     require_once 'Conjoon/Filter/UrlToATag.php';
     $urlFilter = new \Conjoon_Filter_UrlToATag(array('target' => '_blank'));
     /**
      * @see \Conjoon\Text\Transformer\Html\SanitizeOpeningBracketForLinkTransformer
      */
     require_once 'Conjoon/Text/Transformer/Html/SanitizeOpeningBracketForLinkTransformer.php';
     $openingBracketForLinkTransformer = new \Conjoon\Text\Transformer\Html\SanitizeOpeningBracketForLinkTransformer();
     $data['contentTextPlain'] = $startTag . $openingBracketForLinkTransformer->transform($transformer->transform($plainToHtmlFilter->filter($quoteFilter->filter($urlFilter->filter($data['contentTextPlain']))))) . $endTag;
     return $data;
 }
Exemple #3
0
 public function getProcessedData()
 {
     $data = parent::getProcessedData();
     if ($this->_context == self::CONTEXT_DELETE || $this->_context == self::CONTEXT_MOVE) {
         return $data;
     }
     $recs = array($data['to'], $data['cc'], $data['bcc']);
     /**
      * @see Conjoon_Filter_EmailRecipients
      */
     require_once 'Conjoon/Filter/EmailRecipients.php';
     /**
      * @see Conjoon_Filter_EmailRecipientsToString
      */
     require_once 'Conjoon/Filter/EmailRecipientsToString.php';
     $emailRecipientsFilter = new Conjoon_Filter_EmailRecipients();
     $emailSenderFilter = new Conjoon_Filter_EmailRecipients(false, false);
     $emailRecipientsToStringFilter = new Conjoon_Filter_EmailRecipientsToString();
     $emailSenderToStringFilter = new Conjoon_Filter_EmailRecipientsToString(false);
     $data['recipients'] = $emailRecipientsToStringFilter->filter($emailRecipientsFilter->filter($recs));
     // it should be safe to store the sender without additional slashes
     $data['sender'] = $emailSenderToStringFilter->filter($emailSenderFilter->filter($data['from']));
     return $data;
 }