예제 #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]);
 }
 /**
  * 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());
         }
     }
 }
예제 #3
0
 /**
  * {@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();
 }
예제 #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]);
 }