Имитация sendmail с помощью фиктивного скрипта - PullRequest
2 голосов
/ 14 сентября 2010

Я создал небольшой сценарий оболочки, который записывает все входные данные в файл журнала, и я подумал, что смогу заменить двоичный файл sendmail и, таким образом, найти простой способ имитировать доставку электронной почты без фактической настройки работающего sendmail..

Однако это не удалось.По причинам, которые я не могу понять.

Я посмотрел на исходный текст PHP mail.c и, насколько я понимаю (учтите, я не очень разбираюсь в C), PHP выполняет и общается напрямую сдвоичный файл (устанавливается в sendmail_path).Но файлы журнала не создаются, когда я заменяю двоичный файл sendmail своим сценарием, и сценарий, заменяющий sendmail, всегда будет создавать файл журнала при его выполнении, независимо от того, присутствует вход или нет.

Сам сценарий работаетхорошо.Его коды возврата должны соответствовать кодам отправки.С той разницей, что мой скрипт всегда возвращает 0, независимо от ввода, так как я не очень заинтересован в проверке правильности ввода - просто, что я получаю некоторые.

Возможно ли добиться чего?Я хочу, т.е. используя симулятор sendmail?

Источник сценария указан ниже:

#!/bin/bash

LOGDIR=/tmp/sendmail-sim
NOW=$(date +%Y%m%dT%H%M)
CNT=1
FILENAME="$LOGDIR/$NOW.$CNT.log"

while [ -f $FILENAME ]; do
    CNT=$(($CNT + 1))
    FILENAME="$LOGDIR/$NOW.$CNT.log"
done

echo "$0 $*" > $FILENAME

while read BUF
do
    echo $BUF >> $FILENAME
done

exit 0

PS.Мой текущий sendmail (или фактически postfix) действительно получает электронную почту от PHP, но я не хочу на самом деле отправлять какие-либо электронные письма или мне нужно копаться в его 'очереди почты в процессе разработки.

Ответы [ 4 ]

2 голосов
/ 30 июня 2011

Я использовал Fakemail для этой цели в прошлом. Он принимает SMTP-подключения, но записывает всю почту в файлы, а не отправляет их как электронную почту. Существуют как реализации на python, так и на perl.

http://www.lastcraft.com/fakemail.php

Мы настроили apache для обслуживания каталога, в который Fakemail писал. Это был быстрый и простой способ для сотрудников просматривать сообщения, которые Fakemail получал, и проверять их содержимое, место назначения и т. Д. Форматирование электронных писем в формате HTML было несколько странным по разным причинам, поэтому оно не было таким полезным для проверки форматирования электронных писем в формате HTML .

1 голос
/ 30 июня 2011

Примечание. Если вы просто хотите захватить стандартный ввод и записать его в файл, вам не нужно зацикливать по одной строке за раз: вы можете написать

cat - >> $FILENAME
1 голос
/ 03 марта 2011

Если вам нужно проверить способность вашего PHP-приложения правильно форматировать и отправлять электронную почту, не отправляя ее, я предлагаю вам использовать пакет Pear Mail. Возиться с вашей системой не очень хорошая идея.

Если вы используете Mail от Pear, вы можете переключиться с sendmail на smtp на фиктивную реализацию почтового интерфейса, изменив драйвер с sendmail или smtp на mock.

http://pear.php.net/package/Mail/docs/latest/Mail/Mail.html

http://pear.php.net/package/Mail/docs/latest/Mail/Mail_mock.html

Если ваш код выглядит так:

mail('me@example.com', 'My Subject', $message);

Затем измените его для тестирования с помощью PEAR Mail:

include('Mail.php');
function sendEmail($recipient, $subject, $body, $driver = 'mail') {
    $m = Mail::factory("mail");
    $headers = array(
        "From"=>"me@example.com",
        "To" => $recipient,
        "Subject"=> $subject);
    $m->send($recipient, $headers, $body);
    return $m;
}

// In Production:
sendEmail('me@example.com', 'My Subject', $message);

// During testing:
$m = sendEmail('me@example.com', 'My Subject', $message, 'mock');
var_dump($m->sentMessages);

Это очень грубо, так как вы должны использовать PHPUnit или SimpleTest, но это тема для другого времени и места:)

0 голосов
/ 30 июня 2011

Проблема была в User Error, как обычно.Итак, мальчики и девочки, не забудьте проверить права на запись во всех соответствующих папках.

...