» Главная
eXcode.ru » Статьи » PHP » Трюки
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 10





TDD: Добавляем отправку письма при создании нового сообщения




Добавляем отправку письма при создании нового сообщения

Тестирование отправки почты при помощи FakeMail

Как было указано в новых требованиях, приложение должно оповещать администратора при появлении нового сообщения. Сделать это несложно, вопрос лишь в том, как можно это правильно протестировать? Дело в том, проверить обычными средствами отсылку письма довольно-таки сложная задача. На помощь нам придет пакет FakeMail(http://sourceforge.net/projects/fakemail), находящийся в разработке.

FakeMail эмулирует работу почтового сервера и складывает всю приходящую почту в заданное пользователем место. Таким образом, можно проконтролировать из теста все обращения к почтовому серверу. Центральной частью FakeMail является perl скрипт, запускаемый в режиме демона на определенном порту. Также в состав пакета входит класс FakeMailDaemon, удобным образом инкапсулирующий работу с perl сервером.

Чтобы запустить FakeMailDaemon в Windows, требуется наличие библиотеки cygwin, а именно интерпретатора perl, входящего в состав cygwin. Внимание: ActiveState Perl не работает с FakeMail.

Предположим для простоты, что вся уведомляющая почта доставляется на ящик admin@feedback.com. Изменим наши фукциональные тесты немного, заменим метод testOfSimpleSubmitFeedback на testOfSimpleSubmitFeedbackWithEmailNotification:

<?php
class AcceptanceTestOfFeedbackProject extends WebTestCase {
    function setUp() {
        DBC :: execute('DELETE FROM feedback');
        $this->_switchToWebTestingConfig();
        $this->fakemail = new FakeMailDaemon();
        $this->fakemail->start();
    }
 
    function tearDown() {
        $this->_switchToProductionConfig();
        $this->fakemail->stop();
        $this->fakemail->removeRecipientMail('admin@feedback.com');
    }
 
    function testOfSimpleSubmitFeedbackWithEmailNotification() {
        $this->_addFeedback($name = 'Bobby',
                            $email = 'email@dot.com',
                            $message = "This a message");
 
        $this->assertWantedPattern('/' . preg_quote($email) . '.*' .
                                         $name . '.*' .
                                         $message . '/s');
 
        $mails = $this->fakemail->getRecipientMailContents('admin@feedback.com');
        $this->assertTrue(sizeof($mails) == 1);
 
        $this->assertTrue(preg_match('~' . preg_quote($email) . '.*' .
                                           $name . '.*' .
                                           $message . '~s',
                                     $mails[0]));
    }
[...]
}
?>

Отметим, что нам также пришлось изменить фикстуру, теперь в ее обязанности также входит запуск/остановка FakeMailDaemon и очистка пришедшей почты.

Нам также пришлось добавить следующую строку в /tests/setup.php:

<?php
define('FAKE_MAIL_DUMP_PATH', dirname(__FILE__) . '/mail/'); 
?>

С помощью нее мы указали FakeMailDaemon сохранять всю временную почту в директории /tests/mail.

Как всегда, тест не сработал... теперь приступаем к реализации.

Отправка почты при помощи PHPMailer

Для отправки писем воспользуемся замечательным пакетом PHPMailer. Создадим небольшую глобально доступную фабричную функцию CreateMail() в файле mail.inc.php, которая будет скрывать детали инициализации phpmailer:

<?php
 
@define('USE_PHPMAIL', false);
@define('SMTP_PORT', '25');
@define('SMTP_HOST', 'localhost');
@define('SMTP_AUTH', false);
@define('SMTP_USER', '');
@define('SMTP_PASSWORD', '');
 
function & CreateMail()
{
  include_once(dirname(__FILE__) . '/external/phpmailer/class.phpmailer.php');
  $mail = new PHPMailer();
  $mail->LE = "\r\n";
  if(USE_PHPMAIL)
    return $mail;
 
  $mail->IsSMTP();
  $mail->Host = SMTP_HOST;
  $mail->Port = SMTP_PORT;
  if(SMTP_AUTH == true)
  {
    $mail->SMTPAuth = true;
    $mail->Username = SMTP_USER;
    $mail->Password = SMTP_PASSWORD;
  }
 
  return $mail;
}
?>

Теперь можно перейти к реализации в index.php:

<?php
ob_start();
 
require_once(dirname(__FILE__) . '/external/wact/framework/common.inc.php');
require_once(WACT_ROOT . '/template/template.inc.php');
require_once(dirname(__FILE__) . '/feedback.inc.php');
require_once(dirname(__FILE__) . '/mail.inc.php');
 
if(isset($_POST['submit'])) {
    $feedback = new Feedback($_POST['name'], $_POST['email'], $_POST['message'], $time = time());
    $feedback->save();
 
    $mail =& CreateMail();
    $mail->IsHTML(false);
    $mail->CharSet = 'windows-1251';
    $mail->AddAddress('admin@feedback.com');
    $mail->From = $_SERVER['SERVER_ADMIN'];
    $mail->FromName = $_SERVER['HTTP_HOST'];
    $mail->Subject = 'New feedback!!!';
    $mail->Body    = $_POST['email'] . "\n" . $_POST['name'] . "\n" . $_POST['message'];
    $mail->Send();
}
 
$page = new Template('/feedback.html');
$pager =& $page->getChild('pager');
 
$feedback =& $page->findChild('feedback');
$feedback->registerDataSet(Feedback :: getList($pager));
 
$page->display();
 
ob_end_flush();
?>

Вот теперь, пожалуй, все. Не так уж и плохо для первого раза.

К началу статьи





Добавил: PIXELДата публикации: 2008-03-05 09:11:04
Рейтинг статьи:1.33 [Голосов 9]Кол-во просмотров: 30042

Комментарии читателей

Всего комментариев: 5545

2018-04-21 22:40:13
#gennick
Партнерская программа http://got.by/2g5ai6
Вы получаете 75% от нашего профита за приведенного пользователя
в первые 30 дней после его регистрации и до 80% в последующие пожизненно
http://got.by/2g5ai6



2018-04-18 14:56:35
#gennick
Партнерская программа http://got.by/2g5ai6
Вы получаете 75% от нашего профита за приведенного пользователя
в первые 30 дней после его регистрации и до 80% в последующие пожизненно
http://got.by/2g5ai6



2018-04-18 14:56:34
#gennick
Партнерская программа http://got.by/2g5ai6
Вы получаете 75% от нашего профита за приведенного пользователя
в первые 30 дней после его регистрации и до 80% в последующие пожизненно
http://got.by/2g5ai6



2018-04-18 14:56:33
#gennick
Партнерская программа http://got.by/2g5ai6
Вы получаете 75% от нашего профита за приведенного пользователя
в первые 30 дней после его регистрации и до 80% в последующие пожизненно
http://got.by/2g5ai6



2018-04-18 14:56:32
#gennick
Партнерская программа http://got.by/2g5ai6
Вы получаете 75% от нашего профита за приведенного пользователя
в первые 30 дней после его регистрации и до 80% в последующие пожизненно
http://got.by/2g5ai6



2018-04-18 14:56:31
#gennick
Партнерская программа http://got.by/2g5ai6
Вы получаете 75% от нашего профита за приведенного пользователя
в первые 30 дней после его регистрации и до 80% в последующие пожизненно
http://got.by/2g5ai6



2018-04-18 14:56:28
#gennick
Партнерская программа http://got.by/2g5ai6
Вы получаете 75% от нашего профита за приведенного пользователя
в первые 30 дней после его регистрации и до 80% в последующие пожизненно
http://got.by/2g5ai6



2018-04-18 14:56:28
#gennick
Партнерская программа http://got.by/2g5ai6
Вы получаете 75% от нашего профита за приведенного пользователя
в первые 30 дней после его регистрации и до 80% в последующие пожизненно
http://got.by/2g5ai6



2018-04-17 15:52:46
#gennick
Партнерская программа http://got.by/2fjxy3
Вы получаете 1,5 $ за каждую подтвержденную привлеченную
регистрацию в Cashback + процент с рефералов и товары со скидкой http://got.by/2fjxy3
а также много площадок и партнерских программ от интернет магазинов.

2018-04-01 23:42:35
grummion
посмотрел и разочаровался..........

---
Прошу прощения, что вмешался... Мне знакома эта ситуация. Можно обсудить. Пишите здесь или в PM. скачать фифу 15 на пк пиратка, скачать fifa 15 на пк бесплатно и <a href="http://15fifa.ru/">официальный сайт игры fifa</a> fifa 15 2016 2017 скачать торрент
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Какую БД предпочитаете?
MSSQL
20% (38)
BDE
1% (1)
MySQL
35% (68)
Access
6% (11)
InterBase
11% (21)
Paradox
3% (5)
Oracle
10% (19)
PostgreSQL
0% (0)
Другой
3% (6)
Не использую БД!
12% (23)

Проголосовало: 192
- Как баги размножаются?
- Hу программисты с ними по ночам тр@хаются.
Рейтинг: 8.3/10 (3)
Посмотреть все анекдоты