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


9

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

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

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

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

谢谢!

Answers:


12

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

基本上:

  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
    

那里 :)


3

您可以将这些域放入$mydestinationmain.cf,因此后缀将在本地提供。

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

对于所有域:

mydestination = pcre:/etc/postfix/mydestinations

并且/etc/postfix/mydestinations应包含

/.*/    ACCEPT

我现在无法测试,但应该可以。


我不知道目标域是什么样的(它们来自真实的客户数据库)。我将检查链接。
GomoX 2012年

感谢您进行更新,我发布了针对该问题的解决方案,因为它看起来“更干净”,但您的解决方案似乎也可以正常工作。
GomoX 2012年

为了按预期工作,这也需要进行设置local_recipient_maps = 。您提供的链接中对此进行了说明,但我认为答案中也应提及它。
jojman

2

尝试(在main.cf中):

defer_transports = smtp

然后,您可以查看队列postqueue -p并观看内容postcat


0

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

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


0

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

您甚至不必将Postfix配置为充当nullmailer。Postfix附带了一个名为的整洁工具smtp-sink,可以完成此操作。smtp-sink主要用于充当需要使用服务器的SMTP客户端的测试工具。因此,您可以将其配置为记录整个对话,甚至将每个收到的邮件转储到文件中。空邮件程序需要后者。

没有配置文件来配置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中存在。介于两者之间的某个地方。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.