procmailrc 和 php

procmailrc 和 php

这是行不通的。它应该给我发电子邮件。(作为测试;我们真正想要 php 文件做的是插入到 mySQL 数据库表中)

输入是来自PayPal的付款通知消息。

(类似的食谱找到描述行并将其邮寄给我们两个人)

procmailrc:

VERBOSE=off
MAILDIR=/usr/home/our/mail
LOGFILE=/usr/home/our/paypal.log
EXITCODE = 99

:0b
|base64 -d|grep -i Description|php tp129.php

php 文件:

$rawmessage = "";
$fd = fopen("php://stdin", "r");
while(!feof($fd)) {
$rawmessage .= fread($fd, 1024);
}
fclose($fd);

$msg129 = 'raw is ' .$rawmessage;

mail('[email protected]','msg129',$msg129 );

答案1

我发现您可能想要修复一些问题:

  1. 检查你的$HOME/.forward文件。我认为它必须有 644 个权限,并且包含一行:"| /usr/bin/procmail"procmail您的电子邮件进行操作。检查实际路径procmail- 它可能是/bin/procmail您系统上的路径或其他路径。据说您必须拥有procmailin的完全限定路径.forward
  2. 放在<?php文件的第一行tp129.php此外,您的管道可能需要具有php解释器的完整路径/usr/bin/php或其他路径。
  3. 仔细检查 中的参数.procmailrcMAILDIR=/usr/home/our/mail和中的文件名LOGFILE=/usr/home/our/paypal.log看起来很可疑。也就是说,/usr/home/是一个奇怪的目录。用户 ID 的“主”目录通常位于/home或中/u,很少出现在/usr以下目录中。
  4. 单独运行 PHP 代码:php tp129.php,然后在任意文本中键入一些文本,然后按 ctrl-D。这是否会将电子邮件发送到所需的地址?如果没有,请解决导致该问题的任何原因。

答案2

PHPmail()函数需要包含完整标头的有效电子邮件消息。看起来您的代码只生成邮件正文(除非解码的 base64 内容包含标头;但即使如此,在它们前面添加任意字符串也会破坏该消息)。

EXITCODE如果不是因为它包含语法错误,您的显式分配将终止 Procmail 并显示错误消息。在 shell 脚本中,以及在 Procmail 中,不允许在赋值中的等号周围有空格。无论如何,目前尚不清楚您希望实现什么目标EXITCODE;我的建议就是把它省略掉。

鉴于您的最终目标是将消息导入 MySQL,我会提出一个更简单的测试:打开第二个文件进行附加,并将输出写入其中。这应该会告诉您 PHP 代码是否按您的预期工作。 (也许添加一个时间戳,这样您就可以看到结果何时写入,这样您就不会最终检查旧结果。也许只要您正在测试,您实际上会想要覆盖而不是追加;但日期标记仍然是有道理的。)如果 PHP 是您选择的工具,请随意坚持使用它,尽管我怀疑这作为一个小型 shell 脚本会简单得多,您可以将其内联到您的.procmailrc.根据您的数据库架构,类似

:0b
| base64 -d | \
  sed -n '/Description/s/.*/insert into table (field1,field2,field3) values (&);/p' \
  | mysql -uyou -pxyzzy -s db

与此同时,以下是我将如何解决您眼前的问题。

整个 PHP 程序可以用单个 sed 脚本替换:sed '1s/^/raw is /'尽管为了避免无用的使用grep我也会考虑搜索Description.

:0bfw   # Can be simplified if your sed supports a case-insensitive flag
| base64 -d | \
  sed -n '/[Dd][Ee][Ss][Cc][Rr][Ii][Pp][Tt][Ii][Oo][Nn]/s/^/raw is /p'
:0
! [email protected]

转发操作将保留原始标头。如果这不是您想要的,也许可以提取您想要保留的内容,例如使用formail;或使用 . 创建全新的标头printf。您可以用更复杂的操作来替换简单的第二个配方,如下所示:! [email protected]

:0fhw
| ( formail -XSubject:; \
    printf "From: %s\nTo: %s\n" "[email protected]" "[email protected]" )
:0
! -t

sendmail -t意味着获取消息标题中的任何内容,并将消息发送到那里。)

为了进行调试,您的配方文件不应包含显式VERBOSE=off.这是默认值,覆盖它没有意义;但是对其进行硬编码使得无法VERBOSE=yes在 Procmail 命令行上调试您的食谱。

相关内容