如何将虚拟用户名从 postfix 传递到 procmail?

如何将虚拟用户名从 postfix 传递到 procmail?

我正在尝试使用 procmailrc 文件自动将垃圾邮件移至垃圾文件夹。现在,我已使用 virtualmail 运行 postfix,并将邮箱设置等存储在 mysql 中:

virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual-aliases.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual-domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual-mailboxes.cf
virtual_minimum_uid = 1111
virtual_uid_maps = static:1111
virtual_gid_maps = static:1111
virtual_mailbox_base = /home/vmail

我还启用了 procmail 作为虚拟传输:

virtual_transport = procmail
procmail_destination_recipient_limit = 1

主文件:

procmail unix - n n - - pipe flags=DRXhuq user=vmail
  argv=/usr/bin/procmail -m E_SENDER=$sender E_RECIPIENT=$recipient ER_USER=$user ER_DOMAIN=$domain ER_DETAIL=$extension NEXTHOP=$nexthop /etc/procmail.d/default.rc

现在/etc/procmail.d/default.rc我想将邮件路由到/home/vmail/[DOMAIN]/[USERNAME],其中 USERNAME 不是$recipient$user值,而是存储在我的数据库中的另一个值。有什么方法可以将该名称从数据库获取到 procmail,以便它可以正确路由邮件?

+----------+--------------+------+-----+---------------------------------------------------------------------+-------+
| Field    | Type         | Null | Key | Default                                                             | Extra |
+----------+--------------+------+-----+---------------------------------------------------------------------+-------+
| domain   | varchar(255) | NO   | PRI | NULL                                                                |       |
| email    | varchar(255) | NO   | PRI | NULL                                                                |       |
| user     | varchar(255) | NO   |     | NULL                                                                |       |
| password | varchar(255) | NO   |     | {CRYPT}$2y$05$M93Wk.20E31Let6AsWvjx.5eEfsw3ZM1jpha/XkPq6O5PPaiDgc/6 |       |
| location | varchar(255) | NO   |     | NULL                                                                |       |
| quota    | bigint       | NO   |     | 10000000000                                                         |       |
| enabled  | tinyint      | NO   |     | 0                                                                   |       |
+----------+--------------+------+-----+---------------------------------------------------------------------+-------+

邮件被发送到/home/vmail/DOMAIN/user用户自定义用户名的地方,该用户名不需要与电子邮件相同。

SELECT * FROM [table] WHERE user = 'xyz';

+-----------+----------------------+------+---------------------------------------------------------------------+----------------+-------------+---------+
| domain    | email                | user | password | location       | quota       | enabled |
+-----------+----------------------+------+---------------------------------------------------------------------+----------------+-------------+---------+
| exam.ple  | mymail               | xyz  | password | exam.ple/xyz/  | 50000000000 |       1 |

答案1

如果我能正确猜测出您要询问的内容,则需要对每封收到的电子邮件运行 SQL 查询。这听起来很繁琐,但做起来并不难。

在中/etc/procmailrc,类似这样的事情(我显然必须猜测一下你的各个部分是如何组合在一起的,并且伪代码化查询你的 SQL 数据库的实际命令):

loc=`sql "select concat(domain, '/', user) from [table] where email = '$ER_USER';"`
DEFAULT=/home/vmail/$loc

将其编译成单独的 Postfix 映射(每次数据库更改时更新)可能是一种更具可扩展性的解决方案。

相关内容