本教程基于如何使用 Dovecot 设置 Postfix 电子邮件服务器并从第一部分结束的地方开始。
请先阅读该教程。
在本文中,我们将使用 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 中,让我们设置身份验证,以便我们可以授予 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
您现在可以使用像 pgAdmin 这样的管理界面,它能够使用 SSH 隧道直接连接到数据库,或者您可以设置像 phpPgAdmin 这样的东西。
我们需要将 dovecot 连接到数据库并设置 LMTP 服务器。首先设置一个新用户(如果没有系统用户设置,dovecot 将拒绝处理邮件)和 maildirs 目录:(您可以使用/var/邮件,但传统上使用 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
and userdb
设置看起来像这样:
userdb {
driver = prefetch
}
passdb {
args = /etc/dovecot/dovecot-sql.conf
driver = sql
}
改变协议节到
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
}
The 邮件位置节现在是多余的,可以删除。
现在我们需要告诉 postfix 将邮件直接发送到 dovecot。打开/etc/postfix/main.cf
and add
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/
现在修改alias_maps行main.cf to read
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
找到进入有人值守的邮箱的方式!
由...所提交:卢卡斯·埃拉赫.