1

我正在使用 postfix 接收电子邮件并通过 php 文件发送它们以进行过滤。

在 de postfix master.cf 我使用:

`smtp inet n - - - - smtpd -o content_filter=PHPFilter:dummy`  

或者

`pickup fifo n - - 60 1 pickup -o content_filter=PHPFilter:dummy`

但问题是:如果电子邮件通过 php 文件传递​​而没有满足条件怎么办?有没有办法 让后缀恢复breakexit

例如地址:info@domain.net是一个别名后缀应该处理它。
但任何数字电子邮件12345@domain.net都应该由 php 过滤器处理。
但是如果有人通过电子邮件发送到不存在的电子邮件,例如spam@domain.net

原样:当使用 smtp 时(在排队之前)执行 php 过滤器,但当它不是数字后缀时,不执行或至少不与别名 db 比较。
在发送数字电子邮件时,使用取件(排队后)后缀会引发 550 错误(收件人地址被拒绝:虚拟邮箱表中的用户未知),因为它在别名 db 中不存在。

4

2 回答 2

1

好吧想通了。这是像我这样无法弄清楚的其他人的描述。它仍然不漂亮(没有原始数据,而是将新邮件插入到后缀中。)首先如上面在 master.cf (后缀)放置/替换中提到的:

smtp inet n - - - - smtpd -o content_filter=PHPFilter:dummy

PHPFilter unix  -   n   n   -   10  pipe
  flags=F user=www-data null_sender=
  argv=/var/secure/postfix.php -f ${sender} -- ${recipient}

接受数字电子邮件地址,我创建了一个 virtual_mailbox_maps 来检查数据库是否该数字有效/存在。

到目前为止的后缀。现在是 postfix.php 过滤器文件。首先阅读收到的电子邮件:

    if($fd = @fopen("php://stdin", "r")) {
        while (!feof($fd)) {
            $this->email .= fread($fd, 1024);
        }
        fclose($fd);
        return true;
    }

这可以使用 PEAR::Mail_mimedecode 进行解码,以获得所有需要的变量,这些变量可以根据需要进行处理(过滤)和操作。如果 postfix.php 过滤器满足过滤器所需的参数,它应该返回 exit(0) 以让 postfix 知道所有内容都已处理,无需进一步操作。

如果电子邮件不符合要求,或者它是本地邮箱,则应使用本地端口将电子邮件重新插入后缀(因此不要使用 PEAR::mail->send('smtp')),而应使用 PEAR: :Mail->send('sendmail') 将其插入后缀。这需要您从头开始构建新的电子邮件。使用 PEAR::Mail_mimedecode 提供的变量。

$headers = array(
    'From' => $this->headers['from'],
    'To' => $this->headers['to'],
    'Subject' => $this->headers['subject'],
    'Date' => $this->headers['date']
    );

希望这对任何人都有帮助。我在这里提供过程。当然,为了安全起见,它需要根据您的喜好进行改进。
如果有人对此过程有任何意见,请提供。我很想听听是否有任何安全问题或更好的方法来做到这一点。

于 2013-02-25T13:06:39.327 回答
1

除了 PHP 脚本本身之外,您已经成功地完成了所有工作。这是我的做法:

#!/usr/bin/php
<?php

$content = stream_get_contents(STDIN);

//Here you decide if you want to let the email pass through or not
$pass_through = true;
$sendmail_return_value = 69;

if ($pass_through) {
    unset($argv[0]);
    $sendmail = '/usr/sbin/sendmail -G -i ' . implode(' ', $argv);
    $handle = popen($sendmail, 'w');
    fwrite($handle, $content);
    $sendmail_return_value = pclose($handle);
}

exit($sendmail_return_value);
于 2013-04-27T12:29:39.937 回答