Заглушка для функции mail()

13.02.2017

При тестировании отправки e-mail писем с локального сервера мне потребовалась заглушка на функцию mail(). Мне не нужно было что то отправлять по сети, а нужно чтобы отправленное письмо просто где то сохранялось в виде файла. Оказалось что это сделать совсем несложно. Дело в том что сама функция mail() не занимается передачей данных по сети. Она всего лишь готовит информационный поток, заголовки писем, кодирует содержимое письма, а затем запускает программу sendmail.exe и передает её этот информационный поток. Программа sendmail уже осуществляет подключение к smtp серверу с соблюдением протоколов и передает письмо по сети.

Чтобы установить заглушку мне потребовалось прописать в php.ini программу, которая будет перехватывать поток и записывать его в файл. В качестве программы заглушки стал php.exe, выполняющий простейший скрипт. Итак, я создал папку для скрипта, и в ней папку для писем.

D:\_hosts\sendmail D:\_hosts\sendmail\emails

Вот сам скрипт sendmail.php

<?php // получаем поток $contents = file_get_contents('php://stdin'); // делаем имя папки для писем $mailDir = dirname(__FILE__).'/emails/'; // делаем имя файла письма (дата и время отправки) $fileName = date('d.m.Y-H.i.s').'['.round(microtime(),3).'].eml'; // пишем в файл file_put_contents($mailDir.$fileName, $contents); ?>

Осталось только прописать это все в php.ini

sendmail_path = "php.exe -f D:\_hosts\sendmail\sendmail.php"

После этого все отправленные письма попадают в emails примерно в таком виде 02.11.2014-10.37.37[0.373].eml, и их можно подробно изучать открыв в notepad++ . Добившись правильного формирования писем можно проверять уже их отправку по сети. Для этого вам потребуется найти в интернете программу sendmail.exe, поместить её в эту же папку, и подправить php.ini

sendmail_path = "D:\_hosts\sendmail\sendmail.exe"

Пока всё.