如何设置 Postfix 将电子邮件存储在文件中而不是中继它?

如何设置 Postfix 将电子邮件存储在文件中而不是中继它?

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

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

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

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

谢谢!

答案1

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

基本上:

  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);
    
  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
    
  8. 使用它作为默认传输main.cf

    default_transport = file_route
    

那里 :)

答案2

您可以将这些域名放入$mydestination其中main.cf,这样 Postfix 就会在本地进行传送。

您可以根据需要设置不同的本地用户,也可以设置本地的万能地址以将电子邮件发送到一个帐户,更多详细信息请参见:http://www.postfix.org/ADDRESS_REWRITING_README.html#luser_relay

对于所有域:

mydestination = pcre:/etc/postfix/mydestinations

/etc/postfix/mydestinations应包含

/.*/    ACCEPT

我现在无法测试但它应该可以工作。

答案3

这是从我的博客复制并稍加修改的http://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html

您甚至不必将 Postfix 配置为 nullmailer。Postfix 附带了一个简洁的工具,称为,smtp-sink它可以完成这个任务。smtp-sink 主要用作需要服务器来使用的 SMTP 客户端的测试工具。因此,您可以将其配置为记录整个对话,甚至将每封收到的邮件转储到文件中。后者是 nullmailer 所必需的。

没有配置文件来配置 smtp-sink。一切都通过命令行选项完成。

smtp-sink -c -d "%Y%m%d%H/%M." -f . -u postfix -R /tmp/ -B "550 5.3.0 The recipient does not like your mail. Don't try again." -h spamtrap.example.com 25 1024

让我们仔细看看每个参数。

-u postfix
Runs the program under the user "postfix"
-R /tmp/
Sets the output directory to /tmp/. In this directory the mails will be stored. If you have a high spam volume (hundreds of Spam per minute) it is recommended to write the mails to a ramdisk
-d "%Y%m%d%H/%M."
Writes the mail to a directory of the format "YearMonthDayHour" and in this directory the files are name "Month.RandomID". Note that the dates are in UTC
-c
Write statistics about connection counts and message counts to stdout while running
-f .
Reject the mail after END-OF-DATA. But the mail will be saved. Cool, isn't it?!
-B "550 5.3.0 The recipient does not like your mail. Don't try again"
This is the rejection message after END-OF-DATA.
-h spamtrap.example.com
Announce the hostname spamtrap.example.com
25
The port to listen on. Can be prepended with an IP or host if you want to bind on a special interface.
1024
The backlog count of connections that can wait in the TCP/IP stack before they get a free slot for sending mail.

您可以在 smtp-sink 的手册页中找到更多信息,但这些是运行全能垃圾邮件陷阱的重要信息。在此配置中,程序接受来自任何发件人的任何大小的任何邮件,收件人使用 IPv4 和 IPv6。唯一的限制是,最多只能同时进行 256 个连接,排队连接为 1024 个,并且该程序被标记为实验性的。因此,请勿在生产环境中使用 smtp-sink。

-B 选项仅在 Postfix 的较新版本中有效。2.7.1 中没有该选项。2.8.2 中有该选项。它是在两者之间的某个版本中引入的。

答案4

根据您的发行版,您可以查看“nullmailer”。这是一个中继 MTA,它会中继到您网络或远程的另一个 SMTP。这很可能是一个无效的 SMTP,在这种情况下,它可能只会将其放入计算机上文件夹的队列中。

在 debian 和 ubuntu 上,这可以作为系统的替代 MTA。

相关内容