我有与PostgreSQL 9.4运行的Postfix 3.0.3。 我的main.cf在这里:
broken_sasl_auth_clients = yes inet_protocols = ipv4 local_recipient_maps = $virtual_mailbox_maps mail_owner = postfix mailbox_command = /usr/local/libexec/dovecot/deliver mydestination = localhost mynetworks = 192.0.0.0/8 127.0.0.0/8 mynetworks_style = subnet relay_domains = pgsql:/usr/local/etc/postfix/pgsql/pgsql_relay_domains.cf relay_recipient_maps = pgsql:/usr/local/etc/postfix/pgsql/pgsql_virtual_mailbox_maps.cf setgid_group = maildrop smtp_tls_note_starttls_offer = yes smtp_use_tls = yes smtpd_delay_reject = yes smtpd_helo_required = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_auth_enable = yes smtpd_sasl_path = /var/run/dovecot/auth-client smtpd_sasl_security_options = noanonymous smtpd_sasl_type = dovecot smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks smtpd_tls_CAfile = /usr/local/etc/postfix/ssl/smtpd.pem smtpd_tls_cert_file = /usr/local/etc/postfix/ssl/smtpd.pem smtpd_tls_key_file = /usr/local/etc/postfix/ssl/smtpd.pem smtpd_tls_loglevel = 3 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s smtpd_use_tls = no tls_random_source = dev:/dev/urandom unknown_local_recipient_reject_code = 550 virtual_alias_domains = pgsql:/usr/local/etc/postfix/pgsql/pgsql_virtual_mailbox_domains.cf virtual_alias_maps = pgsql:/usr/local/etc/postfix/pgsql/pgsql_virtual_alias_maps.cf virtual_gid_maps = static:1001 virtual_mailbox_base = /home/vmail virtual_mailbox_domains = example.com virtual_mailbox_maps = pgsql:/usr/local/etc/postfix/pgsql/pgsql_virtual_mailbox_maps.cf virtual_minimum_uid = 1001 virtual_transport = dovecot virtual_uid_maps = static:1001
请注意, virtual_mailbox_domains被设置为example.com 。 一旦我将其设置为virtual_mailbox_domains = pgsql:/usr/local/etc/postfix/pgsql/pgsql_virtual_mailbox_domains.cf ,我不断收到此错误消息
Dec 25 01:56:51 postfix/smtpd[11184]: NOQUEUE: reject: RCPT from mail-lb0-f174.google.com[209.85.217.174]: 454 4.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<mail-lb0-f174.google.com>
但是,无论何时运行postmap -q [email protected] pgsql:/usr/local/etc/postfix/pgsql/pgsql_virtual_mailbox_domains.cf ,我都会得到example.com
pgsql_virtual_mailbox_domains.cf看起来像这样:
user = vmail password = qwerty hosts = /tmp dbname = vmail query = SELECT split_part(username,'@',2) FROM users WHERE username = '%s'
我究竟做错了什么?
你能试一下吗
SELECT split_part(username,'@',2) FROM users WHERE split_part(username,'@',2) = '%s'?
因为在查询virtual_mailbox_domains时,postfix应该发送域名而不是电子邮件地址。
而不是在每个查询中执行两次split_part ,您可以创build一个域名列和索引列以获得更好的性能。
希望这可以帮助。
在virtual_mailbox_domains情况下,Postfix需要一个域列表,它不查询地图(特别是不使用完整的电子邮件地址)。 我对Postgres数据库知之甚less,但是我想在你的情况下查询应该是这样的:
SELECT DISTINCT split_part(username, '@', 2) FROM users;
为了获得最佳性能,请考虑将另一个表中的域与用户分开。