예제 #1
0
 /**
  * @dataProvider getEmailsProvider
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 public function testGetEmails($strDate)
 {
     $toAddress = $this->getMock('Zend\\Mail\\Address\\AddressInterface');
     $toAddress->expects($this->once())->method('toString')->will($this->returnValue('toEmail'));
     $toAddressList = $this->getMockForAbstractClass('Zend\\Mail\\Header\\AbstractAddressList', [], '', false, false, true, ['getAddressList']);
     $toAddressList->expects($this->once())->method('getAddressList')->will($this->returnValue([$toAddress]));
     $ccAddress = $this->getMock('Zend\\Mail\\Address\\AddressInterface');
     $ccAddress->expects($this->once())->method('toString')->will($this->returnValue('ccEmail'));
     $ccAddressList = $this->getMockForAbstractClass('Zend\\Mail\\Header\\AbstractAddressList', [], '', false, false, true, ['getAddressList']);
     $ccAddressList->expects($this->once())->method('getAddressList')->will($this->returnValue([$ccAddress]));
     $bccAddress = $this->getMock('Zend\\Mail\\Address\\AddressInterface');
     $bccAddress->expects($this->once())->method('toString')->will($this->returnValue('bccEmail'));
     $bccAddressList = $this->getMockForAbstractClass('Zend\\Mail\\Header\\AbstractAddressList', [], '', false, false, true, ['getAddressList']);
     $bccAddressList->expects($this->once())->method('getAddressList')->will($this->returnValue([$bccAddress]));
     $this->connector->expects($this->once())->method('getUidValidity')->will($this->returnValue(456));
     $msg = $this->getMockBuilder('Oro\\Bundle\\ImapBundle\\Mail\\Storage\\Message')->disableOriginalConstructor()->getMock();
     $headers = $this->getMockBuilder('Zend\\Mail\\Headers')->disableOriginalConstructor()->getMock();
     $msg->expects($this->once())->method('getHeaders')->will($this->returnValue($headers));
     $msg->expects($this->exactly(2))->method('getFlags')->will($this->returnValue(['test1', 'test2']));
     $headers->expects($this->any())->method('get')->will($this->returnValueMap([['UID', $this->getHeader('123')], ['Subject', $this->getHeader('Subject')], ['From', $this->getHeader('fromEmail')], ['Date', $this->getHeader($strDate)], ['Received', $this->getHeader('by server to email; ' . str_replace('59:', '58:', $strDate))], ['InternalDate', $this->getHeader(str_replace('59:', '57:', $strDate))], ['Importance', false], ['Message-ID', $this->getHeader('MessageId')], ['X-GM-MSG-ID', $this->getHeader('XMsgId')], ['X-GM-THR-ID', $this->getHeader('XThrId')], ['X-GM-LABELS', false], ['To', $toAddressList], ['Cc', $ccAddressList], ['Bcc', $bccAddressList], ['References', $this->getHeader('References')]]));
     $query = $this->getMockBuilder('Oro\\Bundle\\ImapBundle\\Connector\\Search\\SearchQuery')->disableOriginalConstructor()->getMock();
     $imap = $this->getMockBuilder('Oro\\Bundle\\ImapBundle\\Mail\\Storage\\Imap')->disableOriginalConstructor()->getMock();
     $imap->expects($this->any())->method('getMessage')->will($this->returnValue($msg));
     $messageIterator = new ImapMessageIterator($imap, [1]);
     $this->connector->expects($this->once())->method('findItems')->with($this->identicalTo($query))->will($this->returnValue($messageIterator));
     $this->manager->selectFolder('Test Folder');
     $emails = $this->manager->getEmails($query);
     $this->assertCount(1, $emails);
     $emails->rewind();
     $this->assertTrue($emails->valid());
     $email = $emails->current();
     $this->assertEquals(123, $email->getId()->getUid());
     $this->assertEquals(456, $email->getId()->getUidValidity());
     $this->assertEquals('Subject', $email->getSubject());
     $this->assertEquals('fromEmail', $email->getFrom());
     $this->assertEquals(new \DateTime('2011-06-30 23:59:59', new \DateTimeZone('UTC')), $email->getSentAt());
     $this->assertEquals(new \DateTime('2011-06-30 23:58:59', new \DateTimeZone('UTC')), $email->getReceivedAt());
     $this->assertEquals(new \DateTime('2011-06-30 23:57:59', new \DateTimeZone('UTC')), $email->getInternalDate());
     $this->assertEquals(0, $email->getImportance());
     $this->assertEquals('MessageId', $email->getMessageId());
     $this->assertEquals('References', $email->getRefs());
     $this->assertEquals(false, $email->hasFlag('test'));
     $this->assertEquals(true, $email->hasFlag('test1'));
     $this->assertEquals('XMsgId', $email->getXMessageId());
     $this->assertEquals('XThrId', $email->getXThreadId());
     $toRecipients = $email->getToRecipients();
     $this->assertEquals('toEmail', $toRecipients[0]);
     $ccRecipients = $email->getCcRecipients();
     $this->assertEquals('ccEmail', $ccRecipients[0]);
     $bccRecipients = $email->getBccRecipients();
     $this->assertEquals('bccEmail', $bccRecipients[0]);
 }
 /**
  * Loads emails from an email server and save them into the database
  *
  * @param EmailFolder $folder
  * @param SearchQuery $searchQuery
  */
 protected function loadEmails(EmailFolder $folder, SearchQuery $searchQuery)
 {
     $this->log->notice(sprintf('Query: "%s".', $searchQuery->convertToSearchString()));
     $folder->setSynchronizedAt(new \DateTime('now', new \DateTimeZone('UTC')));
     $emails = $this->manager->getEmails($searchQuery);
     $needFolderFlush = true;
     $count = 0;
     $batch = array();
     foreach ($emails as $email) {
         $count++;
         $batch[] = $email;
         if ($count === self::DB_BATCH_SIZE) {
             $this->saveEmails($batch, $folder);
             $needFolderFlush = false;
             $count = 0;
             $batch = array();
         }
     }
     if ($count > 0) {
         $this->saveEmails($batch, $folder);
         $needFolderFlush = false;
     }
     if ($needFolderFlush) {
         $this->em->flush();
     }
 }
 /**
  * Performs synchronization of emails retrieved by the given search query in the given folder
  *
  * @param ImapEmailFolder $imapFolder
  * @param SearchQuery     $searchQuery
  *
  * @return \DateTime The max sent date
  */
 protected function syncEmails(ImapEmailFolder $imapFolder, SearchQuery $searchQuery)
 {
     $folder = $imapFolder->getFolder();
     $folderType = $folder->getType();
     $lastSynchronizedAt = $folder->getSynchronizedAt();
     $this->logger->notice(sprintf('Loading emails from "%s" folder ...', $folder->getFullName()));
     $this->logger->notice(sprintf('Query: "%s".', $searchQuery->convertToSearchString()));
     $count = $processed = $invalid = $totalInvalid = 0;
     $emails = $this->manager->getEmails($searchQuery);
     $emails->setBatchSize(self::READ_BATCH_SIZE);
     $emails->setBatchCallback(function ($batch) {
         $this->registerEmailsInKnownEmailAddressChecker($batch);
     });
     $emails->setConvertErrorCallback(function (\Exception $e) use(&$invalid) {
         $invalid++;
         $this->logger->error(sprintf('Error occurred while trying to process email: %s', $e->getMessage()), ['exception' => $e]);
     });
     $this->logger->notice(sprintf('Found %d email(s).', $emails->count()));
     $batch = [];
     /** @var Email $email */
     foreach ($emails as $email) {
         $processed++;
         if ($processed % self::READ_HINT_COUNT === 0) {
             $this->logger->notice(sprintf('Processed %d of %d emails.%s', $processed, $emails->count(), $invalid === 0 ? '' : sprintf(' Detected %d invalid email(s).', $invalid)));
             $totalInvalid += $invalid;
             $invalid = 0;
         }
         if (!$this->isApplicableEmail($email, $folderType, (int) $this->currentUser->getId(), $this->currentOrganization)) {
             continue;
         }
         if ($email->getSentAt() > $lastSynchronizedAt) {
             $lastSynchronizedAt = $email->getSentAt();
         }
         $count++;
         $batch[] = $email;
         if ($count === self::DB_BATCH_SIZE) {
             $this->saveEmails($batch, $imapFolder, $this->currentUser, $this->currentOrganization);
             $count = 0;
             $batch = [];
         }
     }
     if ($count > 0) {
         $this->saveEmails($batch, $imapFolder, $this->currentUser, $this->currentOrganization);
     }
     $totalInvalid += $invalid;
     if ($totalInvalid > 0) {
         $this->logger->warning(sprintf('Detected %d invalid email(s) in "%s" folder.', $totalInvalid, $folder->getFullName()));
     }
     return $lastSynchronizedAt;
 }
 /**
  * Performs synchronization of emails retrieved by the given search query in the given folder
  *
  * @param ImapEmailFolder $imapFolder
  * @param SearchQuery     $searchQuery
  *
  * @return \DateTime The max sent date
  */
 protected function syncEmails(ImapEmailFolder $imapFolder, SearchQuery $searchQuery)
 {
     $folder = $imapFolder->getFolder();
     $folderType = $folder->getType();
     $lastSynchronizedAt = $folder->getSynchronizedAt();
     $this->log->notice(sprintf('Loading emails from "%s" folder ...', $folder->getFullName()));
     $this->log->notice(sprintf('Query: "%s".', $searchQuery->convertToSearchString()));
     $emails = $this->manager->getEmails($searchQuery);
     $emails->setBatchSize(self::READ_BATCH_SIZE);
     $emails->setBatchCallback(function ($batch) use($folderType) {
         $this->registerEmailsInKnownEmailAddressChecker($batch, $folderType);
     });
     $this->log->notice(sprintf('Found %d email(s).', $emails->count()));
     $count = 0;
     $processed = 0;
     $batch = [];
     /** @var Email $email */
     foreach ($emails as $email) {
         $processed++;
         if ($processed % self::READ_HINT_COUNT === 0) {
             $this->log->notice(sprintf('Processed %d of %d emails ...', $processed, $emails->count()));
         }
         if (!$this->isApplicableEmail($email, $folderType)) {
             continue;
         }
         if ($email->getSentAt() > $lastSynchronizedAt) {
             $lastSynchronizedAt = $email->getSentAt();
         }
         $count++;
         $batch[] = $email;
         if ($count === self::DB_BATCH_SIZE) {
             $this->saveEmails($batch, $imapFolder);
             $count = 0;
             $batch = array();
         }
     }
     if ($count > 0) {
         $this->saveEmails($batch, $imapFolder);
     }
     return $lastSynchronizedAt;
 }
 /**
  * Get email ids and create iterator
  *
  * @param EmailOrigin $origin
  * @param ImapEmailFolder $imapFolder
  * @param EmailFolder $folder
  *
  * @return ImapEmailIterator
  */
 protected function getEmailIterator(EmailOrigin $origin, ImapEmailFolder $imapFolder, EmailFolder $folder)
 {
     if ($origin->getMailbox()) {
         // build search query for emails sync
         $sqb = $this->manager->getSearchQueryBuilder();
         if ($origin->getSynchronizedAt() && $folder->getSynchronizedAt()) {
             if ($folder->getType() === FolderType::SENT) {
                 $sqb->sent($folder->getSynchronizedAt());
             } else {
                 $sqb->received($folder->getSynchronizedAt());
             }
         }
         $searchQuery = $sqb->get();
         $this->logger->info(sprintf('Loading emails from "%s" folder ...', $folder->getFullName()));
         $this->logger->info(sprintf('Query: "%s".', $searchQuery->convertToSearchString()));
         $emails = $this->manager->getEmails($searchQuery);
     } else {
         $lastUid = $this->em->getRepository('OroImapBundle:ImapEmail')->findLastUidByFolder($imapFolder);
         $this->logger->info(sprintf('Previous max email UID "%s"', $lastUid));
         $emails = $this->manager->getEmailsUidBased(sprintf('%s:*', ++$lastUid));
     }
     return $emails;
 }
예제 #6
0
 /**
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 public function testGetEmails()
 {
     $uid = $this->getMock('Zend\\Mail\\Header\\HeaderInterface');
     $uid->expects($this->once())->method('getFieldValue')->will($this->returnValue('123'));
     $subject = $this->getMock('Zend\\Mail\\Header\\HeaderInterface');
     $subject->expects($this->once())->method('getFieldValue')->will($this->returnValue('Subject'));
     $fromEmail = $this->getMock('Zend\\Mail\\Header\\HeaderInterface');
     $fromEmail->expects($this->once())->method('getFieldValue')->will($this->returnValue('fromEmail'));
     $date = $this->getMock('Zend\\Mail\\Header\\HeaderInterface');
     $date->expects($this->once())->method('getFieldValue')->will($this->returnValue('2011-06-30 23:59:59 +0'));
     $received = $this->getMock('Zend\\Mail\\Header\\HeaderInterface');
     $received->expects($this->once())->method('getFieldValue')->will($this->returnValue('by server to email; 2012-06-30 23:59:59 +0'));
     $intDate = $this->getMock('Zend\\Mail\\Header\\HeaderInterface');
     $intDate->expects($this->once())->method('getFieldValue')->will($this->returnValue('2013-06-30 23:59:59 +0'));
     $messageId = $this->getMock('Zend\\Mail\\Header\\HeaderInterface');
     $messageId->expects($this->once())->method('getFieldValue')->will($this->returnValue('MessageId'));
     $xMsgId = $this->getMock('Zend\\Mail\\Header\\HeaderInterface');
     $xMsgId->expects($this->once())->method('getFieldValue')->will($this->returnValue('XMsgId'));
     $xThrId = $this->getMock('Zend\\Mail\\Header\\HeaderInterface');
     $xThrId->expects($this->once())->method('getFieldValue')->will($this->returnValue('XThrId'));
     $toAddress = $this->getMock('Zend\\Mail\\Address\\AddressInterface');
     $toAddress->expects($this->once())->method('toString')->will($this->returnValue('toEmail'));
     $toAddressList = $this->getMockForAbstractClass('Zend\\Mail\\Header\\AbstractAddressList', array(), '', false, false, true, array('getAddressList'));
     $toAddressList->expects($this->once())->method('getAddressList')->will($this->returnValue(array($toAddress)));
     $ccAddress = $this->getMock('Zend\\Mail\\Address\\AddressInterface');
     $ccAddress->expects($this->once())->method('toString')->will($this->returnValue('ccEmail'));
     $ccAddressList = $this->getMockForAbstractClass('Zend\\Mail\\Header\\AbstractAddressList', array(), '', false, false, true, array('getAddressList'));
     $ccAddressList->expects($this->once())->method('getAddressList')->will($this->returnValue(array($ccAddress)));
     $bccAddress = $this->getMock('Zend\\Mail\\Address\\AddressInterface');
     $bccAddress->expects($this->once())->method('toString')->will($this->returnValue('bccEmail'));
     $bccAddressList = $this->getMockForAbstractClass('Zend\\Mail\\Header\\AbstractAddressList', array(), '', false, false, true, array('getAddressList'));
     $bccAddressList->expects($this->once())->method('getAddressList')->will($this->returnValue(array($bccAddress)));
     $this->connector->expects($this->once())->method('getUidValidity')->will($this->returnValue(456));
     $msg = $this->getMockBuilder('Oro\\Bundle\\ImapBundle\\Mail\\Storage\\Message')->disableOriginalConstructor()->getMock();
     $headers = $this->getMockBuilder('Zend\\Mail\\Headers')->disableOriginalConstructor()->getMock();
     $msg->expects($this->once())->method('getHeaders')->will($this->returnValue($headers));
     $headers->expects($this->any())->method('get')->will($this->returnValueMap(array(array('UID', $uid), array('Subject', $subject), array('From', $fromEmail), array('Date', $date), array('Received', $received), array('InternalDate', $intDate), array('Importance', false), array('Message-ID', $messageId), array('X-GM-MSG-ID', $xMsgId), array('X-GM-THR-ID', $xThrId), array('X-GM-LABELS', false), array('To', $toAddressList), array('Cc', $ccAddressList), array('Bcc', $bccAddressList))));
     $query = $this->getMockBuilder('Oro\\Bundle\\ImapBundle\\Connector\\Search\\SearchQuery')->disableOriginalConstructor()->getMock();
     $imap = $this->getMockBuilder('Oro\\Bundle\\ImapBundle\\Mail\\Storage\\Imap')->disableOriginalConstructor()->getMock();
     $imap->expects($this->any())->method('getMessage')->will($this->returnValue($msg));
     $messageIterator = new ImapMessageIterator($imap, array(1));
     $this->connector->expects($this->once())->method('findItems')->with($this->identicalTo($query))->will($this->returnValue($messageIterator));
     $this->manager->selectFolder('Test Folder');
     $emails = $this->manager->getEmails($query);
     $this->assertCount(1, $emails);
     $emails->rewind();
     $email = $emails->current();
     $this->assertEquals(123, $email->getId()->getUid());
     $this->assertEquals(456, $email->getId()->getUidValidity());
     $this->assertEquals('Subject', $email->getSubject());
     $this->assertEquals('fromEmail', $email->getFrom());
     $this->assertEquals(new \DateTime('2011-06-30 23:59:59', new \DateTimeZone('UTC')), $email->getSentAt());
     $this->assertEquals(new \DateTime('2012-06-30 23:59:59', new \DateTimeZone('UTC')), $email->getReceivedAt());
     $this->assertEquals(new \DateTime('2013-06-30 23:59:59', new \DateTimeZone('UTC')), $email->getInternalDate());
     $this->assertEquals(0, $email->getImportance());
     $this->assertEquals('MessageId', $email->getMessageId());
     $this->assertEquals('XMsgId', $email->getXMessageId());
     $this->assertEquals('XThrId', $email->getXThreadId());
     $toRecipients = $email->getToRecipients();
     $this->assertEquals('toEmail', $toRecipients[0]);
     $ccRecipients = $email->getCcRecipients();
     $this->assertEquals('ccEmail', $ccRecipients[0]);
     $bccRecipients = $email->getBccRecipients();
     $this->assertEquals('bccEmail', $bccRecipients[0]);
 }