如何使用Dovecot设置Postfix电子邮件服务器:动态Maildirs和LMTP
前言
本教程基于 How To Set Up a Postfix E-Mail Server with Dovecot 并从第一部分结束的地方开始。
请先阅读该教程。
在本文中,我们将使用 dovecot 的 LMTP 服务器作为投递机制将邮箱与系统帐户分离,并使用 postgresql 保存用户记录。
不再有邮件被投递到标准的 linux 邮箱。
与第一个指南一样,本教程基于 Debian 7 wheezy、Postfix 2.9 和 dovecot 2.1(+ Postgresql 9.1)。
套餐
安装postgresql:
# aptitude install postgresql postfix-pgsql
2.1 版中的 dovecot 应该已经启用了 pgsql。 如果您使用的是 dovecot 模块化的系统,请运行
# aptitude install dovecot-lmtpd dovecot-pgsql
安装所需的模块。
Postgres 数据库设置
如果您已经运行了 postgres 设置,请根据您的需要进行调整! 但是从一个新的 postgres 安装开始,让我们设置身份验证,以便我们可以让 dovecot 访问数据库。 将以下内容添加到 /etc/postgresql/9.1/main/pg_ident.conf
:
mailmap dovecot mailreader mailmap postfix mailreader mailmap root mailreader
以下是 /etc/postgresql/9.1/main/pg_hba.conf
(Warning: 确保将其添加到 Put your actual configuration here
注释块之后! 否则,其中一个默认条目可能会首先捕获,并且数据库身份验证将失败。 )
local mail all peer map=mailmap
然后重新加载 postgresql (service postgresql reload
)。 现在设置数据库:
# sudo -u postgres psql postgres=# CREATE USER mailreader; postgres=# REVOKE CREATE ON SCHEMA public FROM PUBLIC; postgres=# REVOKE USAGE ON SCHEMA public FROM PUBLIC; postgres=# GRANT CREATE ON SCHEMA public TO postgres; postgres=# GRANT USAGE ON SCHEMA public TO postgres; postgres=# CREATE DATABASE mail WITH OWNER mailreader; postgres=# \q # sudo psql -U mailreader -d mail postgres=# \c mail mail=# CREATE TABLE aliases ( alias text NOT NULL, email text NOT NULL ); mail=# CREATE TABLE users ( email text NOT NULL, password text NOT NULL, maildir text NOT NULL, created timestamp with time zone DEFAULT now() ); mail=# ALTER TABLE aliases OWNER TO mailreader; mail=# ALTER TABLE users OWNER TO mailreader; mail=# \q
然后,您可以像这样添加虚拟邮箱,从 rootshell 开始:
# doveadm pw -s sha512 -r 100 Enter new password: ... Retype new password: ... {SHA512}.............................................................== # psql -U mailreader -d mail mail=# INSERT INTO users ( email, password, maildir ) VALUES ( 'foo@yourdomain.tld', '{SHA512}.............................................................==', 'foo/' );
管理界面(可选)
如果您不想使用命令行界面来维护邮件数据库,您可以设置一个管理界面。 我们首先添加一个只允许编辑邮件数据库的数据库用户。 返回 /etc/postgresql/9.1/main/pg_hba.conf
并在您之前添加的对等身份验证行下方添加此行:
host pgadmin mail 127.0.0.1/32 md5
这将允许端口 5432 上的本地套接字连接。 (postgres 的默认端口)
添加数据库用户:
# sudo -u postgres psql postgres=# CREATE USER pgadmin WITH PASSWORD 'new password'; postgres=# \q
授予用户编辑邮件数据库的权限:
# sudo psql -U mailreader -d mail mail=> GRANT SELECT, UPDATE, INSERT, DELETE ON users TO pgadmin; mail=> GRANT SELECT, UPDATE, INSERT, DELETE ON aliases TO pgadmin; mail=> \q
您现在可以使用能够使用 SSH 隧道直接连接到数据库的 pgAdmin 之类的管理界面,或者您可以设置 phpPgAdmin 之类的东西。
鸽舍设置
我们需要将 dovecot 连接到数据库并设置 LMTP 服务器。 首先设置一个新用户(dovecot 将拒绝在没有系统用户设置的情况下处理邮件)和 maildirs 目录:(您可以使用 /var/mail,但传统上使用 mbox 格式,而我们将使用高级 maildir 格式)。
# adduser --system --no-create-home --uid 500 --group --disabled-password --disabled-login --gecos 'dovecot virtual mail user' vmail # mkdir /home/mailboxes # chown vmail:vmail /home/mailboxes # chmod 700 /home/mailboxes
现在将以下配置保存为 /etc/dovecot/dovecot-sql.conf
:
driver = pgsql connect = host=/var/run/postgresql/ dbname=mail user=mailreader default_pass_scheme = SHA512 password_query = SELECT email as user, password FROM users WHERE email = '%u' user_query = SELECT email as user, 'maildir:/home/mailboxes/maildir/'||maildir as mail, '/home/mailboxes/home/'||maildir as home, 500 as uid, 500 as gid FROM users WHERE email = '%u'
确保它由 root 拥有并 chmodded 600。
现在打开 /etc/dovecot/dovecot.conf
并编辑 passdb
和 userdb
设置,如下所示:
userdb { driver = prefetch } passdb { args = /etc/dovecot/dovecot-sql.conf driver = sql }
将 protocols 节更改为
protocols = imap lmtp
并添加 lmtp 服务套接字和一些 lmtp 协议设置:
service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0600 user = postfix } } protocol lmtp { postmaster_address=postmaster@yourdomain.com hostname=mail.yourdomain.com }
mail_location 节现在是多余的,可以删除。
后缀
我们现在需要告诉 postfix 将邮件直接发送到 dovecot。 打开 /etc/postfix/main.cf
并添加
mailbox_transport = lmtp:unix:private/dovecot-lmtp
到最后。 现在我们需要为 postfix 设置数据库配置。
创建文件 /etc/postfix/pgsql-aliases.cf
并输入:
user=mailreader dbname=mail table=aliases select_field=alias where_field=email hosts=unix:/var/run/postgresql
然后创建文件 /etc/postfix/pgsql-boxes.cf
并输入:
user=mailreader dbname=mail table=users select_field=email where_field=email hosts=unix:/var/run/postgresql/
现在将 main.cf 中的 alias_maps 行修改为
alias_maps = hash:/etc/aliases proxy:pgsql:/etc/postfix/pgsql-aliases.cf
和要读取的 local_recipient_maps 行
local_recipient_maps = proxy:pgsql:/etc/postfix/pgsql-boxes.cf $alias_maps
总的来说,您的 main.cf 应该类似于以下内容:
myhostname = mail.mydomain.com myorigin = mydomain.com mydestination = mydomain.com, mail.mydomain.com, localhost, localhost.localdomain relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all alias_maps = hash:/etc/aliases proxy:pgsql:/etc/postfix/pgsql-aliases.cf local_recipient_maps = proxy:pgsql:/etc/postfix/pgsql-boxes.cf $alias_maps mailbox_transport = lmtp:unix:private/dovecot-lmtp smtpd_tls_cert_file=/etc/ssl/certs/mailcert.pem smtpd_tls_key_file=/etc/ssl/private/mail.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_tls_security_level=may smtpd_tls_protocols = !SSLv2, !SSLv3
整理起来
现在只需重新加载:
# postfix reload
# service dovecot restart
你准备好了! 像在第一篇文章之后那样测试您的设置,并确保发往 postmaster@yourdomain.com
的邮件可以进入有人值守的邮箱!
提交人:Lukas Erlacher。