当邮件到达邮件服务器时如何运行脚本?(Debian)

当邮件到达邮件服务器时如何运行脚本?(Debian)

我想解析并插入刚到达关键任务应用程序邮件服务器的邮件中的一些信息。

我有什么方法可以配置我的邮件服务器,以便它在邮件到达时运行脚本。

虽然我有一个 debian 系统,但是任何通用解决方案(Linux)都可以。

答案1

好像其他人已经回答了这个问题,但我想为你提供一个具体的答案。

我将使用 procmail 并在您的 .procmailrc 中使用类似于此的配方:

#turn this off when you're finished testing :)
VERBOSE=on
LOGFILE=/home/user/procmail.log

:0 c #the c means continue on after this recipe is parsed
| /path/to/your/script

您还需要在底部使用默认配方将邮件直接发送到您的邮件目录。

答案2

您可以使用 /etc/aliases 将电子邮件直接传送到要处理的程序,因此如果您想运行脚本来处理所有电子邮件[电子邮件保护]你可以将此行放入 /etc/aliases (适用于 postfix、sendmail 等):

test:              "|/usr/local/bin/processtestemail.php"

然后运行“newaliases”来更新数据库。

然后确保在 /usr/local/bin 中有一个名为 processtestemail.php 的工作程序。

它可以用 php、bash、perl、python 或任何你想要的语言编写,以及任何你为解释器准备的语言。你甚至可以启动用 c/c++ 等编写的编译二进制文件。

上面有使用 procmail 的建议,它是一款很棒的产品,但老实说,我所提出的是最快和最简单的解决方案,并且它在更多版本的 *NIX 中运行,并且比任何其他解决方案都具有更多的邮件程序。

同样,其他答案都没有真正告诉您如何处理入站消息,因此您可以在脚本中从标准“输入”(stdin)读取输入,然后使用任何可能需要的算法解析该数据,以便正确处理它,如下所示:

<?php

$fd = fopen('php://stdin','r');
if ($fd) then
    {
    $email = '';                         // initialize buffer
    while (!feof ($fd))                  // read as long as message
        {
        $rawemail .= fread($fd,1024);    // read up to 1K at a time
        ProcessTheMessageChunk($rawEmail);
        }
    fclose($fd);                         // done so close file handle
    $fd=NULL;                            // clear file handle
    }
else
    {
    print("ERROR:  Could could open stdin...");
    };

/* 
** Now write your code to fill in the function ProcessMessageChunk()
** and then process the data you have collected altogether using
** that function/subroutine.
*/

?>

答案3

这是一个很好的接收邮件处理指南最简单的做法是使用.forward上述机制,通过脚本传输消息。在用户主目录中创建一个模式为 600 的 .forward 文件,并将管道放入其中的脚本中:

"|$HOME/bin/your.program -and some arguments" 

但是,您应该考虑使用 procmail,正如该指南中详细说明的那样。Procmail 为您提供了许多优势,例如更复杂的日志记录和邮件处理。这是一个简单的 .procmailrc 示例(同样来自同一指南):

:0
* !^FROM_DAEMON
* !^FROM_MAILER
* !^X-Loop: [email protected]
| $HOME/bin/my.script 

它具有一些不错的功能,例如检测和停止邮件循环的能力。

答案4

如果您的服务器使用 Dovecot,您可以执行以下操作:

  1. 在目录中创建脚本(即mail_processor.py/usr/lib/dovecot/sieve-execute/

    #!/usr/bin/python3
    from sys import stdin
    with open('/var/log/mail_processor.log', 'a') as logfile:
        for line in stdin:
            print(line.rstrip(), file=logfile)
    
    • 确保您的脚本和目标文件具有正确的权限:

      $ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py
      $ chmod 0777 /var/log/mail_processor.log
      
  2. 启用sieve_extprograms插件:

    • 修改 的\etc\dovecot\conf.d\90-sieve.conf插件部分,内容如下:

      sieve_extensions = +vnd.dovecot.execute
      sieve_plugins = sieve_extprograms
      sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
      
    • 重新加载 dovecot:

      $ service dovecot restart
      
  3. 创建筛选过滤器(例如在 Roundcube 中转到settings-> filters-> actions-> edit filter set):

    require ["vnd.dovecot.execute"];
    # rule:[mail processing]
    if true
    {
        execute :pipe "mail_processor.py";
    }
    

现在,所有通过此筛选过滤器投递到邮箱的邮件都将通过管道进行处理mail_processor.py

Pigeonhole Sieve:Extprograms 插件参考文献

相关内容