代码之家  ›  专栏  ›  技术社区  ›  nikc.org

用伪脚本模拟sendmail

  •  2
  • nikc.org  · 技术社区  · 15 年前

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

    我看过PHP mail.c源代码,据我所知(请注意,我对c不是很有经验),PHP直接执行并与二进制文件(设置在 sendmail_path

    剧本本身也很好。它的返回码应该和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
    

    4 回复  |  直到 15 年前
        1
  •  2
  •   Jason Stevens    15 年前

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

    我们设置了apache来为Fakemail所写的目录提供服务。对于员工来说,这是一种快速而简单的方式来查看Fakemail接收到的消息,并检查其内容、目的地等。由于各种原因,HTML电子邮件的格式有点古怪,因此它对于检查HTML电子邮件的格式并不是很有用。

        2
  •  1
  •   Dan Vatca    15 年前

    如果您使用来自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邮件将其更改为可测试:

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

        3
  •  1
  •   nikc.org    15 年前

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

        4
  •  1
  •   glenn jackman    15 年前

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

    cat - >> $FILENAME