如何设置 postfix 将电子邮件存储在文件中而不是转发它?

Gom*_*moX 11 php email-server postfix

我想在本地环境中运行生产服务器的临时副本。该系统运行一个 PHP 应用程序,该应用程序在各种情况下向客户发送电子邮件,我想确保永远不会从临时环境发送电子邮件。

我可以调整代码,使其使用虚拟电子邮件发件人,但我想运行与生产环境完全相同的代码。我可以使用不同的 MTA(Postfix 正是我们在生产中使用的),但我想要在 Debian/Ubuntu 下易于设置的东西:)

因此,我想设置本地 Postfix 安装以将所有电子邮件存储在(一个或多个)文件中,而不是中继它。实际上,我并不真正关心它是如何存储的,只要可以检查发送的电子邮件即可。即使是告诉 postfix 将电子邮件保留在邮件队列中的设置选项也可以工作(当我使用生产副本重新加载临时服务器时,我可以清除队列)。

我知道这是可能的,我只是没有在网上找到任何好的解决方案来满足似乎相当普遍的需求。

谢谢!

Gom*_*moX 15

我使用管道命令创建了一个新传输,该命令将电子邮件写入文件。

基本上:

  1. 创建将拥有电子邮件(或使用现有电子邮件)的用户。我叫我的email
  2. mkdir /home/email/bin
  3. 将以下脚本放入/home/email/bin/mail_eater(这里使用 PHP,但您可以用您喜欢的任何语言编写自己的版本,它只是将 stdin 附加到文件中):

    #!/usr/bin/php
    <?php
    $fd = fopen("php://stdin", "r");
    $email = "";
    while (!feof($fd)) {
        $email .= fread($fd, 1024);
    }
    fclose($fd);
    $fh = fopen('/home/email/email.txt','a');
    fwrite($fh, $email."\n-------------------------------------------------------\n\n");
    fclose($fh);
    
    Run Code Online (Sandbox Code Playgroud)
  4. chmod a+x /home/email/bin/mail_eater
  5. touch /home/email/email.txt
  6. chmod a+r /home/email/email.txt
  7. 通过在 中附加以下行,使用此文件创建新传输master.cf

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
    Run Code Online (Sandbox Code Playgroud)
  8. 使用它作为默认传输main.cf

    default_transport = file_route
    
    Run Code Online (Sandbox Code Playgroud)

那里 :)