Macos 使用虚拟脚本模拟sendmail

Macos 使用虚拟脚本模拟sendmail,macos,bash,sendmail,Macos,Bash,Sendmail,我创建了一个小的shell脚本,将它的所有输入记录到一个日志文件中,我原以为用它可以替换sendmail二进制文件,从而实现一种简单的方法来模拟电子邮件传递,而无需实际设置工作的sendmail 然而,这失败了。因为我无法理解的原因 我看过PHP mail.c源代码,据我所知(请注意,我对c不是很有经验),PHP直接执行二进制文件并与之对话(设置在sendmail\u path)。但是,当我用脚本替换sendmail二进制文件时,不会创建任何日志文件,而替换sendmail的脚本在执行时始终会创

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

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

我看过PHP mail.c源代码,据我所知(请注意,我对c不是很有经验),PHP直接执行二进制文件并与之对话(设置在
sendmail\u 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

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

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

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

如果您的代码如下所示:

mail('me@example.com', 'My Subject', $message);
然后使用PEAR邮件将其更改为可测试:

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

问题是用户错误,通常是这样的。所以,孩子们,别忘了检查所有相关文件夹的写入权限。

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

cat - >> $FILENAME

我以前也用过假邮件。它接受SMTP连接,但将所有邮件写入文件,而不是作为电子邮件发送。有python和perl两种实现


我们将apache设置为Fakemail正在写入的目录提供服务。这是工作人员查看Fakemail接收的邮件并查看其内容、目的地等的一种快速简便的方式。由于各种原因,HTML电子邮件的格式有点古怪,因此它对检查HTML电子邮件的格式没有多大用处。

确认一下-从命令行调用sendmail脚本时,您的sendmail脚本可以正常工作,但不是来自PHP?我不知道PHP运行时是如何工作的,但我想知道它是否在尝试链接邮件二进制对象,而不是托管到Unix环境中??是的,它可以工作。不过,我还没有尝试使用mail命令。(现在在有轨电车上,但不久将进行测试。)@Jules:我现在已经使用
mail
命令测试了我的脚本,可以确认它是否有效。现在我修改了脚本,它甚至可以正常工作。(第一版,即使有效,也只能读
stdin
,直到出现一条空行,导致信息部分被省略。)您应该将此标记为已回答。@nikc:FYI回答您自己的问题并接受它是可以的。这个问题对我很有用,因为我正在尝试根据内容有条件地丢弃消息或将消息传递给sendmail。我感谢您的输入,但我需要一个无论技术如何都能工作的解决方案,而不仅仅是PHP脚本。PHP当然是编写本文的最初原因,但后来发现它在shell脚本中很有用。干运行可以在模拟中少一层抽象。尽管我的例子是针对PHP的,但我认为您必须对其他语言使用类似的方法,而不是替换系统二进制文件。如果你更换了它们,你会有问题的。1.在替换二进制文件之前,您的软件将在另一台计算机上以不同方式运行。2.在同一台机器上运行的其他软件将以不同于预期的方式运行。现在这还不够!大多数发行版现在都配置了Apache以使用自己的/tmp,请参阅:。所以,如果/tmp/sendmail-sim中没有写入任何内容,请不要感到惊讶。我不会再使用这个了。改用类似Mailcatcher的东西