【问题标题】:Using procmail to call a php script使用 procmail 调用 php 脚本
【发布时间】:2011-09-16 14:27:22
【问题描述】:

我正在尝试进行一些自定义电子邮件转发。 #1 我在一个共享服务器上,它使用 qmail 和可选的 procmail。

我想要完成的是根据时间表对一个地址进行一些自定义电子邮件转发。例如,我有一个每个工作日工作的员工时间表,我有一个 php 脚本,它可以选择一个随机员工的电子邮件地址,该地址在今天工作。

所以我试图在 procmail 中调用该脚本,并在转发行输出结果(这是单个电子邮件地址):

例子:

#Something
LOGFILE=/usr/home/myname/procmail-log
VERBOSE=yes
EXITCODE=99
MAILDIR=/usr/boxes/myname
DEFAULT=/usr/boxes/myname/mybox
SHELL=/bin/sh
MYVAR=$(php -q /usr/home/myname/testemail/emailtester.php)

:0
! $MYVAR

这不起作用。完全没有。我也试过:

MYVAR=`php /usr/home/myname/testemail/emailtester.php`

以及将其管道到前线:

:0
! |php /usr/home/myname/testemail/emailtester.php

我在这里完全脱离了我的元素...... 我什至尝试不使用 procmail,我只是将整个电子邮件从 qmail 传送到一个 php 脚本。我需要标题保持完整,就像正常的转发一样,这对 PHP 来说很困难,而且有点超出我的范围。(我设法创建了一个无限的电子邮件循环)所以,我不想再试一次了。

我可以尝试在 perl 中编写脚本,但我从未使用过,但我需要可以从 Web 界面管理时间表,或者至少以用户友好的方式。

任何帮助或建议将不胜感激,谢谢

编辑:

好吧,由于我无法将代码放在评论中,所以我将在此处进行编辑。

现在在我的日志中得到这个:

Folder: /usr/local/bin/php /usr/home/idnani/testemail/emailtester.ph     1679
"rocmail: Executing "/usr/local/bin/php,/usr/home/idnani/testemail/emailtester.php
Could not open input file: /usr/home/idnani/testemail/emailtester.php

当我使用 :0fw 时,我得到:

"rocmail: Executing "/usr/local/bin/php,/usr/home/idnani/testemail/emailtester.php
Could not open input file: /usr/home/idnani/testemail/emailtester.php
procmail: [69907] Thu Jun 16 14:04:17 2011
procmail: Program failure (1) of "/usr/local/bin/php"
procmail: Rescue of unfiltered data succeeded

编辑:想通了!

经过多次尝试和错误,找到了正确的方法。

根本不要使用管道,你确实需要!前向符号:

最终规则:

:0
! `/usr/local/bin/php -f $HOME/emailtest/emailtester.php`

如此简单...我有点生气,我花了几个小时才弄明白,感谢大家帮助我指出正确的方向!

【问题讨论】:

  • php在procmail继承的路径中吗?试试| /the/full/path/to/php ?

标签: php bash procmail


【解决方案1】:

你是如此接近......你需要通过管道没有!转发:

:0
|/usr/bin/php /usr/home/myname/testemail/emailtester.php

编辑 我输入了 PHP 的完整路径,以防 procmail 的 $PATH 不完整。将其更改为您的实际 php 路径。

【讨论】:

  • 嗯...关闭!它告诉我它无法打开 php 文件: 文件夹:/usr/local/bin/php -q /usr/home/idnani/testemail /emailtester 1677 "rocmail: Executing "/usr/local/bin/php,- q,/usr/home/idnani/testemail/emailtester.php 无法打开输入文件:/usr/home/idnani/testemail/emailtester.php
  • @Ben 我不确定 procmail 的运行权限是谁的,但它可能没有读取权限来读取我看来像您的主目录的内容。
  • 需要查看 procmail 以什么用户身份运行,和/或 php 是否有任何限制(就 openbasedir 或 suphp 等内容而言,因为您说它是共享主机)跨度>
  • 嗯....我不确定如何准确地查看它以哪个用户身份运行,试图查找它。但是,它可以很好地写入日志文件,该文件也在主目录中。我可以从 qmail 规则文件中运行一个管道 php 脚本
  • 好的,我认为 procmail 正在使用正确的用户 ID 运行。如果我在 procmail 中将变量设置为 id -u,它会显示为与我在 ssh 中执行 id -u 时相同的 uid。我还测试了在 ssh 中执行 php 脚本,效果很好。我没有其他可以尝试的东西了
【解决方案2】:

为了避免电子邮件循环,我做了这样的事情:

PATH=/usr/local/bin:/bin:/usr/bin
MAILDIR=$HOME/Mail
DEFAULT=$HOME/Mail/inbox
LOGFILE=$HOME/procmail.`date +%Y-%m`.log
SHELL=/usr/bin/ksh

MY_XLOOP='X-Loop: emailtester.php'

:0
* ! ^$MY_XLOOP
{
    # add a header
    # 'f' = filter: continue processing results of program
    # 'w' = wait for program to return
    # 'h' = pass message headers to program
    :0fwh
    | formail -A "$MY_XLOOP"

    # then forward the message
    # 'c' = send a copy to recipient and continue processing
    :0c
    | php /usr/home/myname/testemail/emailtester.php
}

# if we get here, then the message has an X-Loop header.
# let it fall into $DEFAULT

【讨论】:

    【解决方案3】:

    经过多次尝试和错误,找到了正确的方法。

    根本不要使用管道,你确实需要!前向符号:

    这条规则所做的只是向 php 脚本询问一封电子邮件,然后转发到该电子邮件。 最终规则:

    :0
    ! `/usr/local/bin/php -f $HOME/emailtest/emailtester.php`
    

    如此简单...我有点生气,我花了几个小时才弄明白,感谢大家帮助我指出正确的方向!

    迈克尔的回答看起来应该有效,也许它在不同的情况下有效?我无法理解,这就是我自己回答这个问题的原因..

    新编辑:

    注意:您仍然可以通过 STDIN 在 php 中检索整个电子邮件

    注意:您可以像这样将 /usr/local/bin/php 放入脚本本身 在第一行:

    #!/usr/local/bin/php
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      相关资源
      最近更新 更多