在linux搭建mail服務器,目前好的方案是postfix+dovecot+roundcube。
較其它服務,還是頗費周章。記錄此過程,此備參考。
一、 編譯安裝postfix,使用sqlite3數據庫(參考來源):
make makefiles 'CCARGS=-DHAS_SQLITE -I/usr/include/sasl/ -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -DUSE_TLS' -I/usr/local/include 'AUXLIBS=-L/usr/local/lib -lsqlite3 -lz -lm -lssl -lcrypto -lsasl2' # 使用sqlite3
make
make install
echo "postfix:x:89:89::/var/spool/postfix:/sbin/nologin" >> /etc/passwd
echo "postdrop:x:90:90::/var/spool/postfix:/sbin/nologin" >> /etc/passwd
echo "postfix:x:89:" >> /etc/group
echo "postdrop:x:90:" >> /etc/group
ln -s /usr/lib/sasl2/ /usr/local/lib/sasl2
Building the SQLite Database
In order to use the SQLite function, you need a SQLite database. First using SQLite3 run
sqlite3 /etc/postfix/postfix.sqlite
To create the database, then you can copy and past the following scheme into the new database.
CREATE TABLE alias (
address varchar(255) NOT NULL,
goto text NOT NULL,
domain varchar(255) NOT NULL,
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1');
CREATE TABLE domain (
domain varchar(255) NOT NULL,
description varchar(255) NOT NULL,
aliases int(10) NOT NULL default '0',
mailboxes int(10) NOT NULL default '0',
maxquota bigint(20) NOT NULL default '0',
quota bigint(20) NOT NULL default '0',
transport varchar(255) NOT NULL,
backupmx tinyint(1) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1' );
CREATE TABLE mailbox (
username varchar(255) NOT NULL,
password varchar(255) NOT NULL,
name varchar(255) NOT NULL,
maildir varchar(255) NOT NULL,
quota bigint(20) NOT NULL default '0',
domain varchar(255) NOT NULL,
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
local_part varchar(255) NOT NULL );
Configuring Postfix
Now add the maps to you config.
/etc/postfix/main.cf
relay_domains = sqlite:/etc/postfix/sqlite_relay_domains_maps.cf
relay_recipient_maps = sqlite:/etc/postfix/sqlite_relay_recipient_maps.cf
virtual_alias_maps = sqlite:/etc/postfix/sqlite_virtual_alias_maps.cf
virtual_mailbox_domains = sqlite:/etc/postfix/sqlite_virtual_domains_maps.cf
virtual_mailbox_maps = sqlite:/etc/postfix/sqlite_virtual_mailbox_maps.cf
virtual_mailbox_base = /var/spool/virtualmailboxes
virtual_minimum_uid= 1000
virtual_uid_maps = static:1000
virtual_gid_maps = static:1000
sqlite_relay_domains_maps.cf
dbpath = /etc/postfix/postfix.sqlite
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '1' AND active = '1'
sqlite_relay_recipient_maps.cf
dbpath = /etc/postfix/postfix.sqlite
query = SELECT goto FROM alias WHERE address='%s' AND active = 1
sqlite_virtual_alias_maps.cf
dbpath = /etc/postfix/postfix.sqlite
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
sqlite_virtual_domains_maps.cf
dbpath = /etc/postfix/postfix.sqlite
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
sqlite_virtual_mailbox_maps.cf
dbpath = /etc/postfix/postfix.sqlite
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
Setting up a fresh install of Postfix
mkdir /var/spool/virtualmailboxes/
echo "virtualmail:x:1000:1000::/var/spool/virtualmailboxes:/sbin/nologin" >> /etc/passwd
echo "virtualmail:x:1000:" >> /etc/group
chmod 700 /var/spool/virtualmailboxes/
chown -R virtualmail:virtualmail /var/spool/virtualmailboxes/
rm -f /usr/lib/sendmail
ln -s /usr/sbin/sendmail /usr/lib/sendmail
Adding SQLite entry’s
First add a Domain
echo "INSERT INTO domain ( domain, description, transport )
VALUES ( 'laptop.mattrude.com', 'laptops domain', 'virtual' );" |sqlite3 /etc/postfix/postfix.sqlite
Then add a user
echo "INSERT INTO mailbox ( username, password, name, maildir, domain, local_part )
VALUES ( '[email protected]', 'password', 'Matt', 'laptop.mattrude.com/[email protected]/', 'laptop.mattrude.com', 'matt' );" |sqlite3 /etc/postfix/postfix.sqlite
Last we need to add the mailboxes alias
echo "INSERT INTO alias ( address, goto, domain )
VALUES ( '[email protected]', '[email protected]', 'laptop.mattrude.com' );" |sqlite3 /etc/postfix/postfix.sqlite
三、 安裝dovecot ,使用sqlite3(參考來源):
./configure --with-sqlite
make
make install
四、 配置dovecot(參考來源):
rotocols = pop3 imap
# 开启pop3 imap listen = *
default_login_user=postfix
default_internal_user=postfix
# 使用postfix 用户
disable_plaintext_auth = no
log_path = /var/log/dovecot.log
# 日志路径
#info_log_path = /var/log/dovecot.info
log_timestamp = “%Y-%m-%d %H:%M:%S ”
ssl = no mail_location = maildir:/var/vmail/%d/%u
# 邮件存储路径
mail_privileged_group = mail
first_valid_uid = 502
# postfix 用户UID
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
auth_mechanisms = plain login
passdb {
driver=sql
args = /etc/dovecot/dovecot-mysql.conf
}
userdb {
driver=sql
args = /etc/dovecot/dovecot-mysql.conf
}
# 用于SMTP验证
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
user = postfix
mode = 0660
}
}
After you have created the main Dovecot config file, you will need to add the SQLite config file (below).
### /etc/dovecot-sqlite.conf ###
driver = sqlite
connect = /etc/postfix/postfix.sqlite
password_query = SELECT password, username AS user
FROM mailbox WHERE username = '%u' AND domain = '%d'
user_query = SELECT maildir, 1000 AS uid, 1000 AS gid FROM mailbox WHERE
username = '%u' AND domain = '%d' AND active = '1'
After the config files have been created, we need to create the database file, here is where you will need SQLite installed on the system.
五、 安裝roundcube(參考來源)。
配置DKIM請參考這裏。