/** * @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; }
/** * @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]); }