我一直试图将收到的电子邮件通过管道传输到 perl 脚本,以便监控通过电子邮件发送的发票的潜在问题,但运气不佳。在 Red Hat Linux 2.6.32-696-6.3.el6.x86_64、cPanel 56.0(内部版本 51)和 Exim 4.87 上工作
使用 cPanel,我转发了[电子邮件保护]至|/home/myuser/emailtest.pl
。我从不同的搜索中拼凑起来的脚本如下所示(脚本权限设置为 755):
#!/usr/bin/perl
# This is a test!
use strict;
use warnings;
use File::Touch;
use File::stat;
use Time::localtime;
my $file_list = ('/home/myuser/testfile');
touch $file_list;
my $timestamp = ctime(stat($file_list)->mtime);
#print $timestamp;
#print "\n";
我最初收到的是反弹错误,经过一番阅读后,我发现这可能是因为我正在打印时间戳。我实际上不需要打印时间戳,我只是在自己运行脚本时这样做,以验证我是否可以“触摸”文件并读取日期。注释掉打印命令后,不再有反弹。从 shell 运行时脚本仍然有效,我可以从“ls”验证时间戳,但当我向测试帐户发送电子邮件时仍然没有运气。
不过,当电子邮件到达时,脚本似乎没有成功触及文件。我没有收到退回邮件,但除非我从 shell 手动运行脚本,否则“testfile”永远不会改变。我也尝试将脚本移动到 /home/myuser/public_html,但结果相同。
我希望最终能够在收到电子邮件时“触摸”文件,然后使用每日 cron 作业检查文件的时间戳。如果 4 天过去了而文件没有更改,我希望它向我发送电子邮件并让我知道可能存在问题。如果文件已经是当前日期,我想在其中添加一个检查,以免打扰触摸文件,但所有这些都取决于是否能够根据收到的电子邮件首先“触摸”文件,而这正是我陷入困境的地方。
有人能看出这里的问题是什么吗?如果 PHP (或其他解决方案) 更适合这个问题,或者我忽略了其他问题,我不会致力于使用 Perl 来解决这个问题。
答案1
您可以使用exim 的 ~/.forward 文件的扩展语法在某些条件下将传入的消息通过管道传输到 perl 脚本中。另请参阅exim 中的转发和过滤。
答案2
您可以用它procmail
来进行投递。它非常可编程,可以进行多次投递。您需要.procmailrc
在用户的主目录中创建一个文件,以便过滤消息。
有许多用例的示例。我猜想您想要过滤符合某些条件的邮件,然后发送它。过滤语言允许您提供多个选择条件并过滤标题、正文或两者。
procmail
应该可以作为 YUM 包使用。通常,它会在 Exim 配置中启用,这样如果文件存在,它将被用作 MDA .procmailrc
。如果您想先阅读文档,它应该可以在线轻松获取。