我正在尝试使用 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 映射(每次数据库更改时更新)可能是一种更具可扩展性的解决方案。