使用虚拟脚本模拟sendmail

时间:2010-09-14 16:25:27

标签: macos bash sendmail

我创建了一个小的shell脚本,它将所有输入记录到日志文件中,我以为我可以用它替换sendmail二进制文件,从而实现一种模拟电子邮件传递的简单方法,而无需实际设置有效的sendmail

然而,这失败了。由于我无法理解的原因。

我查看了PHP mail.c源代码,据我所知(请注意,我在C方面不是很有经验),PHP执行并直接与二进制对话(在{{1}中设置) })。但是当我用我的脚本替换sendmail二进制文件时,没有创建日志文件,并且替换sendmail的脚本将在执行时始终创建一个日志文件,无论是否存在输入。

脚本本身工作正常。它的'返回码应该与sendmail的码相符。不同之处在于我的脚本总是返回0,不管输入是什么,因为我真的不想检查输入是否有效 - 只是我得到了一些。

是否有可能实现我想要的,即使用sendmail模拟器?

脚本源提供如下:

sendmail_path

PS。我当前的sendmail(或实际上是postfix)确实收到来自PHP的电子邮件,但我不想实际发送任何电子邮件或者需要在开发中的邮件队列中挖掘。

4 个答案:

答案 0 :(得分:2)

我过去曾为此目的使用过Fakemail。它接受SMTP连接,但将所有邮件写入文件,而不是将它们作为电子邮件发送。有python和perl实现。

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

我们设置apache来提供Fakemail写入的目录。对于员工来说,这是一种快速简便的方法,可以查看Fakemail收到的内容,目的地等所收到的邮件。由于各种原因,格式化HTML电子邮件有点令人讨厌,因此对于审核HTML电子邮件的格式化并不是那么有用

答案 1 :(得分:1)

如果你需要测试PHP应用程序正确格式化和发送电子邮件而不实际发送它们的能力,我建议你使用Pear Mail包。摆弄你的系统并不是一个好主意。

如果您使用来自Pear的邮件,您可以通过将驱动程序从“sendmail”或“smtp”更改为“mock”来从sendmail切换到smtp到模拟的邮件界面实现。

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,但这是另一个时间和地点的主题:)

答案 2 :(得分:1)

注意,如果您只想抓取stdin并将其写入文件,则不需要一次循环一行:您可以编写

cat - >> $FILENAME

答案 3 :(得分:0)

通常是问题是用户错误。所以,男孩和女孩,不要忘记检查所有相关文件夹的写权限。