2010-09-14 71 views
2

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

但是,这失败了。原因我不明白。我已经看了PHP的mail.c源码,并且据我所知(介意你,我在C中不是很有经验),PHP执行并直接与二进制文件进行通信(在sendmail_path中设置)。但是,当我使用脚本替换sendmail二进制文件时,没有创建日志文件,并且脚本替换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的电子邮件,但我不想实际发送任何电子邮件或需要在其开发中的邮件队列中进行挖掘。

+0

确认 - 您的sendmail脚本在从命令行调用时起作用,但不能从PHP中调用?我不知道PHP运行时如何工作,但我想知道它是否试图链接邮件二进制对象,而不是托管到Unix环境? – JulesLt 2010-09-14 16:36:14

+0

是的,它的工作原理。我还没有尝试过使用邮件命令。 (现在在电车上,但会很快测试。) – 2010-09-14 16:47:16

+0

@Jules:我现在使用'mail'命令测试了我的脚本,并且可以确认它的工作原理。现在我修改了脚本,它甚至可以正常工作。 (第一个版本,即使它工作了,只读'stdin',直到一个空行,这导致消息部分被省略。) – 2010-09-14 17:31:37

回答

0

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

1

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

如果您使用邮件从梨,您可以通过将驱动程序从'sendmail'或'smtp'更改为'模拟'从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('[email protected]', 'My Subject', $message); 

然后改变其使用是可检验的PEAR邮件:

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

// In Production: 
sendEmail('[email protected]', 'My Subject', $message); 

// During testing: 
$m = sendEmail('[email protected]', 'My Subject', $message, 'mock'); 
var_dump($m->sentMessages); 

这是非常粗糙的,既然你应该使用PHPUnit或SimpleTest,但这是另一个时间和地点的主题:)

+0

我很欣赏这个输入,但我需要一个不管技术如何,都可以工作的解决方案,而不仅仅是PHP脚本。当然PHP是写这个的最初原因,但是后来发现它有用,例如, shell脚本。干运行在其模拟中可以有一个较少的抽象层。 – 2011-03-04 05:35:58

+0

即使我的例子是针对PHP的,我认为您必须使用其他语言的类似方法,而不是替换系统二进制文件。如果你更换它们,你会遇到问题。 1.在更换二进制文件之前,您的软件将在另一台机器上运行不同。 2.在同一台机器上运行的其他软件的行为方式与预期不同。 – 2011-03-04 12:12:48

1

的说明,如果你只是想抓住标准输入,并将其写入到一个文件,你不需要一条线路在同一时间:你可以写

cat - >> $FILENAME 
2

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

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

我们配置Apache来服务于Fakemail被写入该目录。这对于员工来说是一种快速简便的方式,可以查看Fakemail收到的内容和目的地等信息。由于各种原因,HTML电子邮件的格式有些不稳定,所以它对于审查HTML电子邮件的格式不是很有用。