我能够向使用 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 的房间被冻结了,所以我开设了一个新房间。您可以在这里加入。
答案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 水平还不足以修复它。