我已经在我的 Ubuntu 服务器上设置了 Postfix 和 Dovecot。我的目标是创建 27 个可以接收和发送邮件到任何地方的邮件帐户。我希望我的邮件不会在 Gmail、Yahoo 和 Outlook 中显示为垃圾邮件。我使用 Rainloop 发送电子邮件,一切都很顺利。除了;
系统不应该有这么多用户。在我写这篇文章的时候,除了我的个人 sudo 用户和 root 用户之外,这个系统上有 6 个用户。我通过为人们创建 Linux 用户并向他们提供凭据来授予他们接收和发送电子邮件的权限。
我无法想象像雅虎这样的大型电子邮件服务拥有超过一千万的系统用户,必须有一个解决方案让我将 Postfix/Dovecot 连接到一个存储所有电子邮件用户的数据库(可能是 MySQL?),而不是创建那么多的 Linux 用户。
所以基本上,我该如何设置我在上一段中写的内容而不丢失现有数据?我在服务器上没有太多收到的电子邮件,但丢失数据是一种不好的做法,防止它总是好的。
谢谢!
答案1
诚实的建议是,使用普通用户帐户并让您的 Linux 系统验证用户身份。这易于管理且非常安全。我不想说其他系统不安全,但在存储和验证密码方面,我相信我的 Linux 系统。我使用这些命令手动创建用户。这样他们就不会对我的系统造成任何损害。
useradd -d /home/username -g 515 -u 603 -s /sbin/nologin username
echo 12345678 | passwd user --stdin
-g 515 is your groupid for mail users
-u 603 needs to be incremeted by one for each user you create
这将删除该用户
userdel -f username
然后将你的用户附加到文件 /etc/postfix/virtual 中
[email protected] username
这是我在 master.cf 中使用的部分
submission inet n - n - - smtpd
-o smtpd_helo_required=no
-o smtpd_tls_wrappermode=no
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
添加或删除用户后运行以下命令
postmap /etc/postfix/virtual
service postfix restart
(最后一个命令在非 RHEL 克隆版本上可能会有所不同,例如 Ubuntu。不确定,不要使用它。)并在 /etc/postfix/main.cf 中进行以下设置
virtual_alias_maps = hash:/etc/postfix/virtual
不要忘记在 dovecot 中增加 mail_max_userip_connections 变量,请参阅Dovecot 忽略 IMAP 连接的最大数量。
答案2
有几种方法可以做到这一点。然而,最简单的方法是只让一个软件进行身份验证 - 在您的例子中,这将是 Dovecot,因为可以配置 postfix 以使用 Dovecot SASL 进行身份验证。只有一个软件管理电子邮件目录也很方便,所以我建议使用 Dovecot 作为 LDA(本地传送代理,又称“将文件放入目录中的软件”),而不是让 postfix 自己做这件事。
下面我将向您展示我的配置的相关部分,但请记住,这些配置绝不是完整的、可用的配置。不过,发布我的完整邮件堆栈配置毫无意义,因为您的确切需求可能与我的不同。
我使用 PostgreSQL 作为数据库,但是 MySQL 也应该可以很好地工作 - 只要确保更改驱动程序,并且如果您的 dovecot 没有附带驱动程序,还要安装匹配的驱动程序。
来自 postfix/main.cf
virtual_mailbox_domains = $mydomain, pgsql:/etc/postfix/pgsql_domains.cf
virtual_alias_maps = pgsql:/etc/postfix/pgsql_aliases.cf
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql_mailboxes.cf
######################
### Authentication ###
######################
# Basic
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
# Allowed Methods
smtpd_tls_auth_only = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = noanonymous
########################
### Mailbox Settings ###
########################
mail_spool_directory = /srv/mail/localhost/
virtual_mailbox_base = /srv/mail/
mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a
"$RECIPIENT" -d "$USER"
virtual_transport = dovecot
确保还设置了客户端限制,以包括permit_sasl_authenticated
但排除其他发件人发送外发电子邮件,以免创建开放中继。
/etc/postfix/pgsql_domains.cf 的内容
hosts = /var/run/postgresql
user = mail
dbname = mail
query = SELECT DISTINCT 1 FROM users WHERE domain='%s';
/etc/postfix/pgsql_aliases.cf 的内容
hosts = /var/run/postgresql
user = mail
dbname = mail
query = SELECT email||'@'||domain AS alias FROM users WHERE '%u'='users' AND domain='%d';
/etc/postfix/pgsql_mailboxes.cf 的内容
hosts = /var/run/postgresql
user = mail
dbname = mail
query = SELECT 1 FROM email WHERE email='%u' AND domain='%d';
来自 postfix/master.cf
dovecot unix - n n - - pipe
flags=DRhu user=mail:mail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -a ${recipient} -d ${user}@${nexthop}
从 dovecot 配置(无论将其放在某处包含的文件中还是直接放在主配置中都没有关系):
service auth {
#-- Default Socket
unix_listener auth-userdb {
mode = 0666
user = mail
group = mail
}
#-- Socket for Postfix
unix_listener /var/spool/postfix/private/dovecot-auth {
mode = 0660
user = postfix
group = postfix
}
}
######################
### Authentication ###
######################
passdb {
driver = sql
args = /etc/dovecot/conf.d/sql-login.conf.ext
}
userdb {
driver = sql
args = /etc/dovecot/conf.d/sql-login.conf.ext
}
#########################
### Location Settings ###
#########################
# %u - username
# %n - user part in user@domain, same as %u if there's no domain
# %d - domain part in user@domain, empty if there's no domain
# %h - home directory
mail_home = /srv/mail/%d/%n
mail_location = maildir:~/mai
将 /var/spool/postfix 调整到你的 postfix chrooted 的位置(如果是的话,但应该是)
上面引用的 /etc/dovecot/conf.d/sql-login.conf.ext 的内容:
driver = pgsql
connect = host=/var/run/postgresql/ dbname=mail user=mail
default_pass_scheme = SHA512
password_query = SELECT email as username, domain, password FROM users WHERE email = '%n' AND domain = '%d';
user_query = SELECT email as username, domain FROM users WHERE email = '%n' AND domain = '%d';
iterate_query = SELECT email as username, domain FROM users;
(确保根据数据库主机、数据库名称、用户以及可能的密码调整连接字符串)
我的数据库布局:
Table "mail.users"
Column | Type | Modifiers
---------------+---------+---------------
email | text | not null
domain | text | not null
password | text |
Indexes:
"users_pkey" PRIMARY KEY, btree (email, domain)
请记住,这些内容直接取自我的邮件配置,可能需要进行调整并集成到您当前的配置中。对于 dovecot 来说尤其如此,您的发行版可能已经或可能还没有将某些设置包含在分散在配置目录中的文件中 - dovecot 发行版通常会使用大量包含文件。
还要确保已创建用户的收件箱文件夹(上面的配置将它们放在 /srv/mail 中),并且 dovecot-lda 可以写入和访问所有文件夹。上面的配置还将本地电子邮件用户的电子邮件发送到 /srv/mail/localhost 以保持一致性,但这完全是可选的,您可以将它们发送到您已有的任何地方。
完成上述设置后,您可以做更多事情 - 配置可以以任何人身份登录的主用户、配置暂时禁用的帐户的黑名单、配置别名电子邮件等等。但以上内容应该足以针对数据库进行身份验证并将电子邮件发送到虚拟用户帐户。
[编辑]:我刚刚意识到 Postfix 确实需要一些电子邮件中继查找,特别是针对虚拟域、虚拟别名和虚拟邮箱配置。我添加了相关部分。
答案3
你的问题的答案是详细内容在这里。
您无需在 Linux 上创建帐户然后删除它。您只需虚拟创建它即可。我不会重复 Ubuntu 官方链接中写的内容,因为重复它没有意义,所以只需点击链接阅读即可。