Postfix(管理员)、Dovecot、MySQL:别名不起作用

Postfix(管理员)、Dovecot、MySQL:别名不起作用

我能够向使用 postfixadmin 设置的邮箱发送邮件。一切正常,我可以通过它们发送和传递邮件。但现在我需要别名才能正常工作。我使用了教程来设置列出的内容这里。但不知何故,postfix 一直尝试将邮件发送到别名的邮箱。

主要电子邮箱:[email protected]

别名电子邮件:[email protected]

数据库中的记录已正确设置,当我运行此命令时:

postmap -q [email protected] mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf

我正在检索正确的电子邮件地址:[email protected]其中包含一个邮箱。我做错了什么?

日志没有提供任何有用的信息。当我向我的别名发送邮件时,日志如下所示:

Jun 10 10:38:13 localhost postfix/smtpd[3061]: C27DC614DD: client=mail-wm0-f41.google.com[74.125.82.41]
Jun 10 10:38:13 localhost postfix/cleanup[3072]: C27DC614DD: message-id=<CAGUk6whj3Drb-c=5N55TU80UoKR6sC2r4k+3jtxj9pBO5Gp5Pg@mail.gmail.com>
Jun 10 10:38:13 localhost postfix/qmgr[30229]: C27DC614DD: from=<[email protected]>, size=2011, nrcpt=1 (queue active)
Jun 10 10:38:13 localhost postfix/smtpd[3061]: disconnect from mail-wm0-f41.google.com[74.125.82.41]
Jun 10 10:38:14 localhost postfix/smtp[3074]: C27DC614DD: to=<[email protected]>, orig_to=<[email protected]>, relay=gmail-smtp-in.l.google.com[74.125.136.27]:25, delay=0.32, delays=0.07/0.01/0.15/0.1, dsn=2.0.0, status=sent (250 2.0.0 OK 1465547906 q2si2091788wme.1 - gsmtp)
Jun 10 10:38:14 localhost postfix/qmgr[30229]: C27DC614DD: removed

但它没有进入邮箱[email protected]

我的/etc/postfix/main.cf

smtpd_banner = $myhostname ESMTP
biff = no
append_dot_mydomain = no
readme_directory = no

smtpd_tls_cert_file=/etc/letsencrypt/live/domain.nl/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/domain.nl/privkey.pem
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_auth_only = yes

smtpd_tls_mandatory_protocols=!SSLv2
smtpd_tls_ciphers = high
smtpd_tls_loglevel = 1
smtpd_tls_ask_ccert=yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

smtpd_recipient_restrictions =
    permit_sasl_authenticated
    permit_mynetworks
    reject_unauth_destination
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
myhostname = mail.domain.nl

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = $myhostname

mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 192.168.0.0/24
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

disable_vrfy_command = yes
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_base = /var/mail

virtual_mailbox_maps = mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf

virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

virtual_alias_maps = mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf

virtual_mailbox_domains = mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf

header_checks = regexp:/etc/postfix/header_checks

我的/etc/dovecot/dovecot-sql.conf.ext样子是这样的:

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=spieard123
default_pass_scheme = MD5-CRYPT
password_query = SELECT username as user, password, '/var/mail/%d/%n' as userdb_home, 'maildir:/var/mail/%d/%n' as userdb_mail, 5000 as userdb_uid, 5000 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'

我的/etc/dovecot/conf.d/auth-sql.conf.ext样子是这样的:

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/%d/%n
}

与 NickW 聊天。

由于 NickW 的房间被冻结了,所以我开设了一个新房间。您可以在这里加入。

Postfixadmin 设置: Postfix 管理员

答案1

我认为问题在于您从邮箱而不是从虚拟用户表中选择端点,因此 postfix 知道它应该去哪里,但不知道 dovecot。

改变 :

SELECT username as user, password, '/var/mail/%d/%n' as userdb_home, 'maildir:/var/mail/%d/%n' as userdb_mail, 5000 as userdb_uid, 5000 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'

到:

password_query = SELECT email as user, password, '/var/mail/%d/%n' as userdb_home, 'maildir:/var/mail/%d/%n' as userdb_mail, 5000 as userdb_uid, 5000 as userdb_gid FROM virtual_users WHERE email=(SELECT destination FROM virtual_aliases WHERE source = '%u');

显然,数据库和表名可能会有所不同..AND active = '1'因为它不是邮箱表,所以没有必要..

答案2

为了检查你的别名是否正常工作,你可以尝试检查你的MySQL直接先。

从你的日志中我没有看到任何尝试将邮件投递到你的邮箱

从别名中选择转到

对于别名,你应该在日志中看到类似这样的内容

29 06:46:59 mail postfix/local[15339]: A8967BF907: to=<[email protected]>, orig_to=<[email protected]>, relay=local, delay=1.1, delays=1/0.02/0/0.11, dsn=2.0.0, status=sent (delivered

通过查看你的日志,它看起来像是你的 gmail 地址的别名

已编辑 我读了你的评论,并模拟了同样的场景。如果你按照你的流程,你应该会在日志中看到以下内容。

Jun 29 08:15:31 mail postfix/qmgr[9259]: D803DC04BD: from=<[email protected]>, size=741, nrcpt=2 (queue active)
Jun 29 08:15:31 mail postfix/smtpd[18918]: disconnect from micro.sg[128.199.136.21] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Jun 29 08:15:31 mail dovecot: lda([email protected]): msgid=<[email protected]>: saved mail to INBOX
Jun 29 08:15:31 mail postfix/pipe[18984]: D803DC04BD: to=<[email protected]>, orig_to=<[email protected]>, relay=dovecot, delay=0.06, delays=0.01/0.01/0/0.03, dsn=2.0.0, status=sent (delivered via dovecot service)
Jun 29 08:15:33 mail postfix/smtp[18941]: D803DC04BD: to=<[email protected]>, orig_to=<[email protected]>, relay=gmail-smtp-in.l.google.com[74.125.200.27]:25, delay=1.4, delays=0.01/0/0.87/0.49, dsn=2.0.0, status=sent (250 2.0.0 OK 1467202533 f205si352653oib.152 - gsmtp)
Jun 29 08:15:33 mail postfix/qmgr[9259]: D803DC04BD: removed

请注意,有 2 个不同的 smtp 调用和交付。请检查并确保在 postfix 管理员中检查到本地邮箱的交付情况。 请查看 postfixadmin -> 虚拟列表 -> 邮箱 -> 别名屏幕。您应该已检查是否已发送到本地收件箱

如果您已选中上述框,那么这是另一组问题。

答案3

忽略我的第一个回复(如下) - 它有效,但可能不是一个好的解决方案。

您的 Postfix main.cf 或 master.cf 中是否有可能出现 accept_override_options=no_address_mappings 的情况。

我将其设置为 -o accept_override_options=no_address_mappings,用于 SMTP 和提交端口。(对于 DSpam,我仍然使用它)。

如果删除它,Postfix 会告诉 Dovecot 应该将邮件发送给哪个用户:

userdb { 
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf
}

/etc/dovecot/dovecot-sql.conf:

user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox, domain WHERE username = '%u' AND mailbox.active = '1' AND domain.domain = '%d' AND domain.active = '1'

这样,Dovecot 可以知道哪些账户真正存在(并有邮件目录),并且 Postfix 会告诉 Dovecot 地址映射到哪个账户。


您是否尝试过在 /etc/dovecot/conf.d/auth-sql.conf.ext 中使用 allow_all_users=yes

userdb {
  driver = static
  args = uid=vmail gid=vmail allow_all_users=yes home=/var/mail/%d/%n
}

可能需要对别名用户/域进行符号链接

cd /var/mail
ln -s domain.tld alias_domain.tld
or
ln -s domain.tld/user domain2.tld/user_alias

这使得它不像 dovecot 的有效 userdb SQL 查找那样优雅......

userdb { 
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf
}

我目前得到的最好的结果是:

user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox, domain WHERE local_part = '%u' AND domain.domain = '%d';

(假设 5000:5000 = vmail:vmail)

这至少使 user_aliases 可以工作(我无法让用户别名在别名域上工作)

由于 Postfixadmin 提供了许多 SQL 查询,Postbox 可以正确拒绝未知虚拟用户,但是为 dovecot 提供的用户数据库 SQL 查找缺少别名和别名域表,而我的 SQL 水平还不足以修复它。

相关内容