/** * @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]); }
/** * Performs a synchronization of emails for the given email origin. * * @param EmailOrigin $origin */ public function process(EmailOrigin $origin) { // make sure that the entity builder is empty $this->emailEntityBuilder->clear(); // get a list of emails belong to any object, for example an user or a contacts $emailAddressBatches = $this->getKnownEmailAddressBatches($origin->getSynchronizedAt()); // iterate through all folders and do a synchronization of emails for each one $folders = $this->getFolders($origin); foreach ($folders as $folder) { // register the current folder in the entity builder $this->emailEntityBuilder->setFolder($folder); // ask an email server to select the current folder $folderName = $folder->getFullName(); $this->manager->selectFolder($folderName); // check that a state of the current folder is valid $imapFolder = $this->getImapFolder($folder); if ($imapFolder->getUidValidity() !== $this->manager->getUidValidity()) { $imapFolder->setUidValidity($this->manager->getUidValidity()); $this->em->persist($imapFolder); $this->em->flush(); } $this->log->notice(sprintf('Loading emails from "%s" folder ...', $folderName)); foreach ($emailAddressBatches as $emailAddressBatch) { // build a search query $sqb = $this->manager->getSearchQueryBuilder(); if ($origin->getSynchronizedAt() && $folder->getSynchronizedAt() && !$emailAddressBatch['needFullSync']) { $sqb->sent($folder->getSynchronizedAt()); } $sqb->openParenthesis(); $sqb->openParenthesis(); $this->addEmailAddressesToSearchQueryBuilder($sqb, 'from', $emailAddressBatch['items']); $sqb->closeParenthesis(); $sqb->openParenthesis(); $this->addEmailAddressesToSearchQueryBuilder($sqb, 'to', $emailAddressBatch['items']); $sqb->orOperator(); $this->addEmailAddressesToSearchQueryBuilder($sqb, 'cc', $emailAddressBatch['items']); // not all IMAP servers support search by BCC, for example imap-mail.outlook.com does not //$sqb->orOperator(); //$this->addEmailAddressesToSearchQueryBuilder($sqb, 'bcc', $emailAddressBatch['items']); $sqb->closeParenthesis(); $sqb->closeParenthesis(); // load emails using this search query $this->loadEmails($folder, $sqb->get()); } } }
/** * {@inheritdoc} */ public function loadEmailBody(EmailFolder $folder, Email $email, EntityManager $em) { /** @var UserEmailOrigin $origin */ $origin = $folder->getOrigin(); $config = new ImapConfig($origin->getImapHost(), $origin->getImapPort(), $origin->getImapEncryption(), $origin->getUser(), $this->encryptor->decryptData($origin->getPassword()), $this->imapEmailGoogleOauth2Manager->getAccessTokenWithCheckingExpiration($origin)); $manager = new ImapEmailManager($this->connectorFactory->createImapConnector($config)); $manager->selectFolder($folder->getFullName()); $repo = $em->getRepository('OroImapBundle:ImapEmail'); $query = $repo->createQueryBuilder('e')->select('e.uid')->innerJoin('e.imapFolder', 'if')->where('e.email = ?1 AND if.folder = ?2')->setParameter(1, $email)->setParameter(2, $folder)->getQuery(); $loadedEmail = $manager->findEmail($query->getSingleScalarResult()); if (null === $loadedEmail) { throw new EmailBodyNotFoundException($email); } $builder = new EmailBodyBuilder(); $builder->setEmailBody($loadedEmail->getBody()->getContent(), $loadedEmail->getBody()->getBodyIsText()); foreach ($loadedEmail->getAttachments() as $attachment) { $builder->addEmailAttachment($attachment->getFileName(), $attachment->getContent(), $attachment->getContentType(), $attachment->getContentTransferEncoding(), $attachment->getContentId()); } return $builder->getEmailBody(); }
/** * {@inheritdoc} */ public function loadEmailBody(Email $email, EntityManager $em) { /** @var ImapEmailOrigin $origin */ $origin = $email->getFolder()->getOrigin(); $config = new ImapConfig($origin->getHost(), $origin->getPort(), $origin->getSsl(), $origin->getUser(), $this->encryptor->decryptData($origin->getPassword())); $manager = new ImapEmailManager($this->connectorFactory->createImapConnector($config)); $manager->selectFolder($email->getFolder()->getFullName()); $repo = $em->getRepository('OroImapBundle:ImapEmail'); $query = $repo->createQueryBuilder('e')->select('e.uid')->where('e.email = ?1')->setParameter(1, $email)->getQuery(); /** @var ImapEmail $imapEmail */ $imapEmail = $query->getSingleResult(); $loadedEmail = $manager->findEmail($imapEmail['uid']); if ($loadedEmail === null) { throw new \RuntimeException(sprintf('Cannot find a body for "%s" email.', $email->getSubject())); } $builder = new EmailBodyBuilder(); $builder->setEmailBody($loadedEmail->getBody()->getContent(), $loadedEmail->getBody()->getBodyIsText()); foreach ($loadedEmail->getAttachments() as $attachment) { $builder->addEmailAttachment($attachment->getFileName(), $attachment->getContent(), $attachment->getContentType(), $attachment->getContentTransferEncoding()); } return $builder->getEmailBody(); }
/** * Gets UIDVALIDITY of the given folder * * @param Folder $folder * * @return int */ protected function getUidValidity(Folder $folder) { $this->manager->selectFolder($folder->getGlobalName()); return $this->manager->getUidValidity(); }
/** * @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]); }