这是行不通的。它应该给我发电子邮件。(作为测试;我们真正想要 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
我发现您可能想要修复一些问题:
- 检查你的
$HOME/.forward
文件。我认为它必须有 644 个权限,并且包含一行:"| /usr/bin/procmail"
对procmail
您的电子邮件进行操作。检查实际路径procmail
- 它可能是/bin/procmail
您系统上的路径或其他路径。据说您必须拥有procmail
in的完全限定路径.forward
。 - 放在
<?php
文件的第一行tp129.php
此外,您的管道可能需要具有php
解释器的完整路径/usr/bin/php
或其他路径。 - 仔细检查 中的参数
.procmailrc
。MAILDIR=/usr/home/our/mail
和中的文件名LOGFILE=/usr/home/our/paypal.log
看起来很可疑。也就是说,/usr/home/
是一个奇怪的目录。用户 ID 的“主”目录通常位于/home
或中/u
,很少出现在/usr
以下目录中。 - 单独运行 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 命令行上调试您的食谱。