public function testSendMessagePopulatesEmailAccountSettings()
 {
     $jane = User::getByUsername('jane');
     Yii::app()->user->userModel = $jane;
     $emailHelper = new EmailHelper();
     EmailMessageTestHelper::createEmailAccount($jane);
     $emailAccount = EmailAccount::getByUserAndName($jane);
     $emailAccount->useCustomOutboundSettings = EmailMessageUtil::OUTBOUND_PERSONAL_SMTP_SETTINGS;
     $emailAccount->outboundType = 'abc';
     $emailAccount->outboundPort = 11;
     $emailAccount->outboundHost = 'dumb.domain';
     $emailAccount->outboundUsername = '******';
     $emailAccount->outboundPassword = '******';
     $emailAccount->outboundSecurity = 'ssl';
     $emailAccount->save();
     $emailMessage = EmailMessageTestHelper::createOutboxEmail($jane, 'Test email', 'Raw content', 'Html content', 'Zurmo', Yii::app()->emailHelper->outboundUsername, 'John Doe', Yii::app()->params['emailTestAccounts']['userImapSettings']['imapUsername']);
     $emailMessage->account = $emailAccount;
     $emailMessage->save();
     $this->assertEquals(1, Yii::app()->emailHelper->getQueuedCount());
     $this->assertEquals(0, Yii::app()->emailHelper->getSentCount());
     Yii::app()->emailHelper->sendQueued();
     $job = new ProcessOutboundEmailJob();
     $this->assertTrue($job->run());
     //Since user email account has invalid settings message is not sent
     $this->assertContains('Connection could not be established with host dumb.domain', strval($emailMessage->error));
     $this->assertEquals(1, Yii::app()->emailHelper->getQueuedCount());
     $this->assertEquals(0, Yii::app()->emailHelper->getSentCount());
 }
 /**
  * @depends testSend
  */
 public function testSendRealEmail()
 {
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     Yii::app()->emailHelper->sendEmailThroughTransport = true;
     Yii::app()->imap->imapHost = Yii::app()->params['emailTestAccounts']['userImapSettings']['imapHost'];
     Yii::app()->imap->imapUsername = Yii::app()->params['emailTestAccounts']['userImapSettings']['imapUsername'];
     Yii::app()->imap->imapPassword = Yii::app()->params['emailTestAccounts']['userImapSettings']['imapPassword'];
     Yii::app()->imap->imapPort = Yii::app()->params['emailTestAccounts']['userImapSettings']['imapPort'];
     Yii::app()->imap->imapSSL = Yii::app()->params['emailTestAccounts']['userImapSettings']['imapSSL'];
     Yii::app()->imap->imapFolder = Yii::app()->params['emailTestAccounts']['userImapSettings']['imapFolder'];
     Yii::app()->imap->setInboundSettings();
     Yii::app()->imap->init();
     Yii::app()->emailHelper->outboundHost = Yii::app()->params['emailTestAccounts']['smtpSettings']['outboundHost'];
     Yii::app()->emailHelper->outboundPort = Yii::app()->params['emailTestAccounts']['smtpSettings']['outboundPort'];
     Yii::app()->emailHelper->outboundUsername = Yii::app()->params['emailTestAccounts']['smtpSettings']['outboundUsername'];
     Yii::app()->emailHelper->outboundPassword = Yii::app()->params['emailTestAccounts']['smtpSettings']['outboundPassword'];
     Yii::app()->emailHelper->outboundSecurity = Yii::app()->params['emailTestAccounts']['smtpSettings']['outboundSecurity'];
     Yii::app()->emailHelper->sendEmailThroughTransport = true;
     Yii::app()->emailHelper->setOutboundSettings();
     Yii::app()->emailHelper->init();
     $steve = UserTestHelper::createBasicUser('steve');
     EmailMessageTestHelper::createEmailAccount($steve);
     if (EmailMessageTestHelper::isSetEmailAccountsTestConfiguration()) {
         $user = User::getByUsername('steve');
         $user->primaryEmail->emailAddress = Yii::app()->params['emailTestAccounts']['userImapSettings']['imapUsername'];
         $this->assertTrue($user->save());
         Yii::app()->imap->connect();
         Yii::app()->imap->deleteMessages(true);
         $imapStats = Yii::app()->imap->getMessageBoxStatsDetailed();
         $this->assertEquals(0, $imapStats->Nmsgs);
         $emailMessage = EmailMessageTestHelper::createOutboxEmail($super, 'Test email', 'Raw content', ',b>html content</b>end.', 'Zurmo', Yii::app()->emailHelper->outboundUsername, 'Ivica', Yii::app()->params['emailTestAccounts']['userImapSettings']['imapUsername']);
         Yii::app()->imap->connect();
         $imapStats = Yii::app()->imap->getMessageBoxStatsDetailed();
         $this->assertEquals(0, $imapStats->Nmsgs);
         $this->assertEquals(1, Yii::app()->emailHelper->getQueuedCount());
         $this->assertEquals(3, Yii::app()->emailHelper->getSentCount());
         Yii::app()->emailHelper->sendQueued($emailMessage);
         $job = new ProcessOutboundEmailJob();
         $this->assertTrue($job->run());
         $this->assertEquals(0, Yii::app()->emailHelper->getQueuedCount());
         $this->assertEquals(4, Yii::app()->emailHelper->getSentCount());
         sleep(30);
         Yii::app()->imap->connect();
         $imapStats = Yii::app()->imap->getMessageBoxStatsDetailed();
         $this->assertEquals(1, $imapStats->Nmsgs);
     }
     Yii::app()->emailHelper->sendEmailThroughTransport = false;
 }
 /**
  * For testing only
  * @param string $subject
  * @param string $from
  * @param mixed(string || array) $to
  * @param string $textContent
  * @param string $htmlContent
  * @param mixed(string || array) $cc
  * @param mixed(string || array) $bcc
  * @param array $attachments
  * @param array $settings
  * @param array $headers
  * @param array $parts
  */
 public function sendRawEmail($subject, $from, $to, $textContent = '', $htmlContent = '', $cc = null, $bcc = null, $attachments = null, $settings = null, $headers = array(), $parts = array())
 {
     assert('is_string($subject) && $subject != ""');
     assert('is_string($from)    && $from != ""');
     assert('(is_array($to) && !empty($to)) || is_string($to) || !isset($to)');
     assert('is_string($textContent) || $textContent == null');
     assert('is_string($htmlContent) || $htmlContent == null');
     assert('(is_array($cc) && !empty($cc)) || is_string($cc) || !isset($cc)');
     assert('(is_array($bcc) && !empty($bcc)) || is_string($bcc) || !isset($bcc)');
     assert('isset($to) || isset($cc) || isset($bcc)');
     assert('is_array($attachments) || !isset($attachments)');
     assert('is_array($parts) || !isset($parts)');
     $toName = null;
     $toAddress = null;
     if (is_string($to)) {
         $toAddress = $to;
     } elseif (is_array($to)) {
         foreach ($to as $key => $value) {
             $toName = $key;
             $toAddress = $value;
         }
     }
     $emailMessage = EmailMessageTestHelper::createOutboxEmail(Yii::app()->user->userModel, $subject, $htmlContent, $textContent, null, $from, $toName, $toAddress, $cc, $bcc);
     $mailer = new ZurmoSwiftMailer($emailMessage, null);
     if (!empty($parts)) {
         $mailer->parts = $parts;
     }
     $mailer->From = $from;
     if (is_array($to) && !empty($to)) {
         foreach ($to as $recipientEmail) {
             $mailer->addAddressByType($recipientEmail, '', EmailMessageRecipient::TYPE_TO);
         }
     } elseif (is_string($to)) {
         $mailer->addAddressByType($to, '', EmailMessageRecipient::TYPE_TO);
     }
     if (is_array($cc) && !empty($cc)) {
         foreach ($cc as $recipientEmail) {
             $mailer->addAddressByType($recipientEmail, '', EmailMessageRecipient::TYPE_CC);
         }
     } elseif (is_string($cc)) {
         $mailer->addAddressByType($cc, '', EmailMessageRecipient::TYPE_CC);
     }
     if (is_array($bcc) && !empty($bcc)) {
         foreach ($bcc as $recipientEmail) {
             $mailer->addAddressByType($recipientEmail, '', EmailMessageRecipient::TYPE_BCC);
         }
     } elseif (is_string($bcc)) {
         $mailer->addAddressByType($bcc, '', EmailMessageRecipient::TYPE_BCC);
     }
     if (isset($attachments) && !empty($attachments)) {
         foreach ($attachments as $file) {
             $mailer->attachFromPath($file);
         }
     }
     $mailer->headers = $headers;
     $acceptedRecipients = $mailer->send();
     if ($acceptedRecipients > 0) {
         // Do nothing
     } else {
         // To-Do: make exception or something else
         echo "There was error while sending email";
     }
 }
 /**
  * @depends testRequiredAttributes
  */
 public function testDeleteCampaign()
 {
     $campaigns = Campaign::getAll();
     $this->assertEquals(4, count($campaigns));
     CampaignItemTestHelper::createCampaignItem(0, $campaigns[0]);
     $campaignItems = CampaignItem::getAll();
     $this->assertCount(1, $campaignItems);
     $campaignItemActivity = new CampaignItemActivity();
     $campaignItemActivity->type = CampaignItemActivity::TYPE_CLICK;
     $campaignItemActivity->quantity = 1;
     $campaignItemActivity->campaignItem = $campaignItems[0];
     $campaignItemActivity->latestSourceIP = '121.212.122.112';
     $this->assertTrue($campaignItemActivity->save());
     $emailMessage = EmailMessageTestHelper::createOutboxEmail(Yii::app()->user->userModel, 'subject', 'html', 'text', 'from', '*****@*****.**', 'to', '*****@*****.**');
     $campaignItems[0]->emailMessage = $emailMessage;
     $this->assertTrue($campaignItems[0]->unrestrictedSave());
     $this->assertEquals(1, CampaignItemActivity::getCount());
     $this->assertEquals(1, EmailMessage::getCount());
     $campaigns[0]->delete();
     $this->assertEquals(3, Campaign::getCount());
     $this->assertEquals(0, CampaignItem::getCount());
     $this->assertEquals(0, CampaignItemActivity::getCount());
     $this->assertEquals(1, EmailMessage::getCount());
 }
 public function testSavePurgesUnsetCampaignItemsForPausedToActiveStatusChangeIfNeeded()
 {
     $campaign = CampaignTestHelper::createCampaign('afterSaveDeleteUnsetCampaignItemsTest', 'subject', 'text');
     // 3 items, 1 unprocessed, 1 processed with email in outbox, 1 processed with email in sent.
     $campaignItem = CampaignItemTestHelper::createCampaignItem(1, $campaign);
     $emailMessage = EmailMessageTestHelper::createOutboxEmail(Yii::app()->user->userModel, 'subject', 'html', 'text', 'from', '*****@*****.**', 'to', '*****@*****.**');
     $campaignItem->emailMessage = $emailMessage;
     $this->assertTrue($campaignItem->unrestrictedSave());
     $campaignItem2 = CampaignItemTestHelper::createCampaignItem(1, $campaign);
     $emailMessage2 = EmailMessageTestHelper::createDraftSystemEmail('subject2', Yii::app()->user->userModel);
     $box = EmailBox::resolveAndGetByName(EmailBox::NOTIFICATIONS_NAME);
     $emailMessage2->folder = EmailFolder::getByBoxAndType($box, EmailFolder::TYPE_SENT);
     $this->assertTrue($emailMessage2->save());
     $campaignItem2->emailMessage = $emailMessage2;
     $this->assertTrue($campaignItem2->unrestrictedSave());
     CampaignItemTestHelper::createCampaignItem(0, $campaign);
     $this->assertCount(2, CampaignItem::getByProcessedAndCampaignId(1, $campaign->id));
     $this->assertCount(1, CampaignItem::getByProcessedAndCampaignId(0, $campaign->id));
     $this->assertCount(1, EmailMessage::getByFolderTypeAndCampaignId(EmailFolder::TYPE_OUTBOX, $campaign->id));
     $this->assertCount(1, EmailMessage::getByFolderTypeAndCampaignId(EmailFolder::TYPE_SENT, $campaign->id));
     // set initial status
     $campaign->status = Campaign::STATUS_PAUSED;
     $this->assertTrue($campaign->save());
     $this->assertCount(2, CampaignItem::getByProcessedAndCampaignId(1, $campaign->id));
     $this->assertCount(1, CampaignItem::getByProcessedAndCampaignId(0, $campaign->id));
     $this->assertCount(1, EmailMessage::getByFolderTypeAndCampaignId(EmailFolder::TYPE_OUTBOX, $campaign->id));
     $this->assertCount(1, EmailMessage::getByFolderTypeAndCampaignId(EmailFolder::TYPE_SENT, $campaign->id));
     // change a non-dependent property, no change in campaign items
     $campaign->status = Campaign::STATUS_ACTIVE;
     $campaign->name = $campaign->name . 'modified';
     $this->assertCount(2, CampaignItem::getByProcessedAndCampaignId(1, $campaign->id));
     $this->assertCount(1, CampaignItem::getByProcessedAndCampaignId(0, $campaign->id));
     $this->assertCount(1, EmailMessage::getByFolderTypeAndCampaignId(EmailFolder::TYPE_OUTBOX, $campaign->id));
     $this->assertCount(1, EmailMessage::getByFolderTypeAndCampaignId(EmailFolder::TYPE_SENT, $campaign->id));
     // reset status
     $campaign->status = Campaign::STATUS_PAUSED;
     $this->assertTrue($campaign->save());
     // change a dependent property, unset should be deleted.
     $campaign->status = Campaign::STATUS_ACTIVE;
     $campaign->subject = $campaign->subject . 'modified';
     $this->assertTrue($campaign->save());
     // deleted: 1 processed with email in outbox, 1 unprocessed.
     $this->assertCount(1, CampaignItem::getByProcessedAndCampaignId(1, $campaign->id));
     $this->assertCount(0, CampaignItem::getByProcessedAndCampaignId(0, $campaign->id));
     $this->assertCount(0, EmailMessage::getByFolderTypeAndCampaignId(EmailFolder::TYPE_OUTBOX, $campaign->id));
     $this->assertCount(1, EmailMessage::getByFolderTypeAndCampaignId(EmailFolder::TYPE_SENT, $campaign->id));
 }