如何使用Dovecot设置Postfix邮件服务器:动态Maildirs和LMTP

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

前言


本教程基于《如何使用Dovecot设置Postfix电子邮件服务器》,并在第一部分结束的地方继续进行。

请先阅读那篇教程。

在本文中,我们将使用dovecot的LMTP服务器作为传递机制,将邮箱与系统帐户分离,并使用postgresql来保存用户记录。

不再将邮件传递到标准的Linux邮箱中。

与第一篇指南一样,本教程基于Debian 7 wheezy,Postfix 2.9和dovecot 2.1(+Postgresql 9.1)。

软件包


安装postgresql:

# aptitude install postgresql postfix-pgsql

dovecot 2.1版本应该已经启用了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警告:确保在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 (
    '[email protected]',
    '{SHA512}.............................................................==',
    'foo/'
);

管理界面(可选)


如果您不想使用命令行界面来维护邮件数据库,您可以设置一个管理界面。让我们首先添加一个只允许编辑邮件数据库的数据库用户。返回到/etc/postgresql/9.1/main/pg_hba.conf,在您之前添加的peer认证行下面添加以下行:

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设置


我们需要将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,并且chmod为600。

现在打开/etc/dovecot/dovecot.conf并编辑passdbuserdb设置如下:

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=[email protected]
    hostname=mail.yourdomain.com
}

mail_location段现在是多余的,可以删除。

Postfix


现在我们需要告诉 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

然后你就设置完成了!像在第一篇文章之后一样测试你的设置,并确保发送到 [email protected] 的邮件能够准确投递到一个已关注的邮箱中!

提交者:Lukas Erlacher。

猜你喜欢

转载自blog.csdn.net/rubys007/article/details/143496550