/** * @dataProvider providerTestSendEmail */ public function testSendEmail($sendData, $expectedResult) { if (empty($sendData)) { $this->markTestSkipped('No $sendData from data provider.'); } if (!self::imapIsEnabled()) { $this->markTestSkipped('IMAP is not loaded'); return; } $emailINI = eZINI::instance('test_ezmail_plain.ini'); $mboxString = $emailINI->variable('TestAccounts', 'MBoxString'); $recipients = array_merge((array) $sendData['to'], (array) $sendData['cc'], (array) $sendData['bcc']); if (isset($sendData['Transport']) and $sendData['Transport'] == 'SMTP') { ezpINIHelper::setINISetting('site.ini', 'MailSettings', 'Transport', 'SMTP'); $mailINI = eZINI::instance('test_ezmail_plain.ini'); $mailSetting = $mailINI->group('MailSettings'); ezpINIHelper::setINISetting('site.ini', 'MailSettings', 'TransportServer', $mailSetting['TransportServer']); ezpINIHelper::setINISetting('site.ini', 'MailSettings', 'TransportPort', $mailSetting['TransportPort']); ezpINIHelper::setINISetting('site.ini', 'MailSettings', 'TransportUser', $mailSetting['TransportUser']); ezpINIHelper::setINISetting('site.ini', 'MailSettings', 'TransportPassword', $mailSetting['TransportPassword']); } if (isset($sendData['DebugSending']) and $sendData['DebugSending'] == true) { ezpINIHelper::setINISetting('site.ini', 'MailSettings', 'DebugSending', 'enabled'); $users = self::getTestAccounts(); $recipients[] = $users['01']; } else { ezpINIHelper::setINISetting('site.ini', 'MailSettings', 'DebugSending', 'disabled'); } foreach ($recipients as $recipient) { // Accept only testing accounts as recipients if (preg_match('/^ezp-unittests-\\d\\d\\@mail\\.ez\\.no$/', $recipient['email']) != 1) { $this->markTestSkipped('Refusing to use other than testing accounts'); return; } // Open mailbox and delete all existing emails in the account $mbox = @imap_open($mboxString, $recipient['username'], $recipient['password']); if (!$mbox) { $this->markTestSkipped('Cannot open mailbox for ' . $recipient['username'] . ': ' . imap_last_error()); return; } $status = imap_status($mbox, $mboxString, SA_MESSAGES); for ($i = 1; $i <= $status->messages; $i++) { imap_delete($mbox, $i); } imap_expunge($mbox); imap_close($mbox); } // Create and send email $mail = new eZMail(); if (count($sendData['to']) == 1) { $mail->setReceiver($sendData['to'][0]['email'], $sendData['to'][0]['name']); } else { $mail->setReceiverElements($sendData['to']); } if ($sendData['replyTo']) { $mail->setReplyTo($sendData['replyTo']['email'], $sendData['replyTo']['name']); } $mail->setSender($sendData['sender']['email'], $sendData['sender']['name']); if ($sendData['cc']) { if (count($sendData['cc']) == 1) { $mail->addCc($sendData['cc'][0]['email'], $sendData['cc'][0]['name']); } else { $mail->setCcElements($sendData['cc']); } } if ($sendData['bcc']) { if (count($sendData['bcc']) == 1) { $mail->addBcc($sendData['bcc'][0]['email'], $sendData['bcc'][0]['name']); } else { $mail->setBccElements($sendData['bcc']); } } $mail->setSubject($sendData['subject']); $mail->setBody($sendData['body']); $sendResult = eZMailTransport::send($mail); $this->assertEquals(true, $sendResult); // Wait for it... sleep(2); // Read emails foreach ($recipients as $recipient) { $mbox = @imap_open($mboxString, $recipient['username'], $recipient['password']); if (!$mbox) { $this->markTestSkipped('Cannot open mailbox for ' . $recipient['username'] . ': ' . imap_last_error()); return; } // Check message count before we try to open anything, in case nothing is there $status = imap_status($mbox, $mboxString, SA_MESSAGES); $this->assertEquals($expectedResult[$recipient['email']]['messageCount'], $status->messages); // Build actual result array, and check against the expected result $actualResult = array('messageCount' => $status->messages); for ($i = 1; $i <= $status->messages; $i++) { $headers = imap_headerinfo($mbox, $i); $actualResult['headers'] = array(); $actualResult['headers']['to'] = array(); foreach ($headers->to as $item) { $actualResult['headers']['to'][] = array('email' => $item->mailbox . '@' . $item->host); } $actualResult['headers']['replyTo'] = array(); foreach ($headers->reply_to as $item) { $actualResult['headers']['replyTo'][] = array('email' => $item->mailbox . '@' . $item->host, 'name' => $item->personal); } $actualResult['headers']['from'] = array(); foreach ($headers->from as $item) { $actualResult['headers']['from'][] = array('email' => $item->mailbox . '@' . $item->host, 'name' => $item->personal); } if (isset($headers->cc)) { $actualResult['headers']['cc'] = array(); foreach ($headers->cc as $item) { $actualResult['headers']['cc'][] = array('email' => $item->mailbox . '@' . $item->host, 'name' => $item->personal); } } $actualResult['headers']['subject'] = $headers->subject; $body = imap_body($mbox, $i); $actualResult['body'] = $body; $this->assertEquals($expectedResult[$recipient['email']], $actualResult); } imap_close($mbox); } }
/** * Remplace le destinataire du mail par le "faut" destinataire, * supprime tous les cc et bcc et les rajoute en entête du corp du message * * @param eZMail $mail L'objet mail à traiter */ private function doFakeRecepient (eZMail $mail) { $fakeHead = array(); $fakeHead[]='To: ' . $mail->receiverText(); foreach ($mail->ccReceiverTextList() as $aCcReceiver) { $fakeHead[] = 'Cc: ' . $aCcReceiver; } foreach ($mail->bccReceiverTextList() as $aBccReceiver) { $fakeHead[] = 'Bcc: ' . $aBccReceiver; } $mail->setReceiver($this->fakeReceiver); $mail->setCcElements(array()); $mail->setBccElements(array()); $origBody = $mail->body(); $newBody = '------' . __CLASS__ . '------' . "\n"; $newBody .= ':: Original parameters ::' . "\n\n"; $newBody .= implode("\n", $fakeHead) . "\n"; $newBody .= '------' . __CLASS__ . '------' . "\n\n"; $newBody .= $origBody; $mail->setBody($newBody); }