【发布时间】:2011-04-12 06:30:14
【问题描述】:
我创建了一个小的 shell 脚本,它将所有的输入记录到一个日志文件中,我认为我可以用它来替换 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
附言。我当前的 sendmail(或者实际上是 postfix)确实收到了来自 PHP 的电子邮件,但我不想实际发送任何电子邮件或需要在开发中挖掘它的邮件队列。
【问题讨论】:
-
确认 - 您的 sendmail 脚本在从命令行调用时有效,而不是从 PHP 调用?我不知道 PHP 运行时是如何工作的,但我想知道它是否正在尝试链接邮件二进制对象,而不是托管到 Unix 环境??
-
是的,它有效。我还没有尝试过使用邮件命令。 (现在在电车上,但很快就会测试。)
-
@Jules:我现在已经使用
mail命令测试了我的脚本,并且可以确认它可以工作。现在我修改了脚本,它甚至可以正常工作。 (第一个版本虽然有效,但只读取stdin直到出现空行,这导致消息部分被省略。) -
您应该将其标记为已回答。
-
@nikc:仅供参考,可以回答您自己的问题并接受它。这个问题对我很有用,因为我试图根据内容有条件地丢弃或将消息传递给 sendmail。