CentOS Linux邮件系统搭建
背景
操作系统版本(cat /etc/issue):CentOS release 6.5 (Final)
主机名:mail.gogo.so
域名:gogo.so
用到软件:
postfix
相关协议:
SMTP : Simple Mail Transport Protocol,它是用于传送邮件的标准协议(TCP port 25)。Postfix不处理任何POP和IMAP通信内容。
IMAP和POP3是用于收信的协议,描述如何从邮箱中取出邮件。POP3和IMAP完全没有寄信的能力,只能帮用户处理事先收到的邮件。并非所有用户都需要透过POP3/IMAP来访问邮箱。拥有Linux系统账号的用户,可能设定他们的MUA直接读取同一机器上的邮件文件。
邮件系统的组成:
一个邮件系统通常包括:MUA、MTA、MRA、MDA等。
MUA:Mail User Agent(邮件用户代理),常见的MUA有mutt,Outlook Express,Foxmail等,MUA并非直接将E-mail送到收到件人手中,而是由MTA代为传递。当你要求MUA发送一封邮件,它只是将该邮件交给一台运行MTA软件(例如Postfix)的服务器。
MTA:Mail Transfer Agent(邮件传输代理),Postfix是一种MTA。MTA的任务是:(1)接受MUA的委托,将E-mail从一个系统递送到另一个系统;(2)接收从别的MTA发送过来的邮件。
每当MTA收到MUA的寄信请求时,它会先判断是否应该受理。通常,如果邮件是来自本地系统的用户,或是本地网络上的系统,或是任何特许可以通过它转发(relay)邮件到其他目的地的网络,MTA都会受理寄信请求。另一方面,MTA也会依据“收件人”来决定是否要收下邮件。如果收件人是本地系统的用户,或是收件人位于它知道要如何转递(forward)的其他系统,MTA就会收下该邮件。
MTA收下邮件之后,有两种可能:(1)将邮件递送给自己系统上的用户;(2)将邮件交给另一个MTA来继续传递。
MDA:Message Delivery Agent(邮件投递代理)。在邮件的终点站的MTA上,在发现收件人是本地系统的用户之后,必须将邮件交给MDA存放起来。常用的MDA有lmtp和pipe。
MRA:邮件被存入邮箱后,它就待在那里,等待收件人将它收走。收件人使用MUA来收信、阅读信件。
查看postfix设置的命令:postconf
查看postfix支持哪些类型的查询表:postconf -m
列表中有mysql,表明postfix添加了对mysql的支持
参考文献
http://www.haiyun.me/archives/953.html
https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin
http://sealedabstract.com/code/nsa-proof-your-e-mail-in-2-hours/
按照上述配置好后,还要保证/etc/dovecot/dovecot.conf文件中
protocols = imap pop3 lmtp
protocols中有lmtp协议
在/etc/dovecot/conf.d/15-lda.conf文件中
设定postmaster_address,例如:
postmaster_address = postmaster@gogo.so
/etc/postfix/main.cf中,mydestination的值中不要与mysql数据库的virtual_domains表中有相同的域名:
mydestination = $myhostname, localhost
并且将local_recipient_maps的值设为空
local_recipient_maps =
====================================new================================
在aliyun上部署邮件服务器的步骤
参考网址:
http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/16/2214272.html
http://www.cnblogs.com/dudu/archive/2012/12/12/linux-postfix-mailserver.html
http://www.haiyun.me/archives/953.html
首先切换到root用户
su - root
防火墙处理,开放MySQL服务器程序的3306端口
service iptables stop #停止防火墙 /sbin/iptables -F /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT #MySQL的3306端口 /etc/rc.d/init.d/iptables save #保存 service iptables restart #重启防火墙
安装MySQL
yum install mysql yum install mysql-server yum install mysql-devel chgrp -R mysql /var/lib/mysql chmod -R 770 /var/lib/mysql service mysqld start #启动mysql服务 mysql #启动mysql客户端
#初始化MySQL的root用户的密码 mysql> SET PASSWORD FOR \'root\'@\'localhost\' = PASSWORD(\'your_password\'); #如果要自启动,则运行这个命令 chkconfig --levels 35 mysqld on
由于CentOS 6.5系统已经自带postfix,不需要再安装. 下面安装dovecot及其MySQL扩展
yum install dovecot yum install dovecot-mysql
再次以MySQL的root用户登录MySQL,创建数据库mail,新建用户mailuser(密码为mailuserpass):
CREATE DATABASE mail; GRANT SELECT ON mail.* TO \'mailuser\'@\'127.0.0.1\' IDENTIFIED BY \'mailuserpass\'; FLUSH PRIVILEGES; USE mail;
下面继续创建三个表:1.虚拟域表 2.虚拟用户表 3.虚拟别名表
--虚拟域表 CREATE TABLE `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --虚拟用户表 CREATE TABLE `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `password` varchar(106) NOT NULL, `email` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --虚拟用户别名 CREATE TABLE `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
下面添加一些测试数据,其中,新增了邮箱用户user@gogo.so,密码为12345678:
INSERT INTO `mail`.`virtual_domains`(`name`) VALUES(\'gogo.so\');
INSERT INTO `mail`.`virtual_users`(`domain_id`, `password` , `email`) VALUES (\'1\', ENCRYPT(\'12345678\', CONCAT(\'$6$\', SUBSTRING(SHA(RAND()), -16))), \'user@gogo.so\');
INSERT INTO `mail`.`virtual_aliases`(`domain_id`, `source`, `destination`) VALUES(\'1\', \'alias@gogo.so\', \'user@gogo.so\');
在/etc/postfix/main.cf中添加下列配置
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
#使用dovecot lmtp交付虚拟域邮件,省却postfix配置用户邮件目录及权限问题 virtual_transport = lmtp:unix:private/dovecot-lmtp
#使用dovecot验证,后面dovecot配置 smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
配置Postfix支持Mysql查询表
#虚拟域
新建文件/etc/postfix/mysql-virtual-mailbox-domains.cf ,并添加如下内容
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mail query = SELECT 1 FROM virtual_domains WHERE name=\'%s\'
#虚拟用户
新建文件/etc/postfix/mysql-virtual-mailbox-maps.cf ,并添加如下内容
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mail query = SELECT 1 FROM virtual_users WHERE email=\'%s\'
#虚拟别名
新建文件/etc/postfix/mysql-virtual-alias-maps.cf ,并添加如下内容
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mail query = SELECT destination FROM virtual_aliases WHERE source=\'%s\'
#修改文件/etc/postfix/main.cf ,将相应的值设为如下所示:
myhostname = mail.gogo.so mydomain = gogo.so myorigin = $mydomain inet_interfaces = all inet_protocols = ipv4 mydestination = $myhostname, localhost #local_recipient_maps设为空 local_recipient_maps = mynetworks = 127.0.0.0/8 home_mailbox = Maildir/
#重启postfix使设置生效
service postfix restart
#测试查询,看是否有数据返回
postmap -q gogo.so mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf postmap -q user@gogo.so mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf postmap -q alias@gogo.so mysql:/etc/postfix/mysql-virtual-alias-maps.cf
#Dovecot配置
修改文件/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/mail/vhosts/%d/%n
修改文件/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no #开启明文验证 auth_mechanisms = plain login #支持验证方法 #!include auth-system.conf.ext #取消默认系统验证 !include auth-sql.conf.ext #使用mysql验证
修改文件/etc/dovecot/conf.d/10-logging.conf
auth_verbose = yes # 认证详细日志
auth_debug = yes # 认证debug
修改文件/etc/dovecot/conf.d/10-ssl.conf
ssl = no
修改文件/etc/dovecot/conf.d/auth-sql.conf.ext
#用户验证 passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } #用户邮箱目录 %d为domain,%n为user userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n }
新建文件/etc/dovecot/dovecot-sql.conf.ext
driver = mysql connect = host=127.0.0.1 dbname=mail user=mailuser password=mailuserpass default_pass_scheme = SHA512-CRYPT password_query = SELECT email as user, password FROM virtual_users WHERE email=\'%u\';
修改文件/etc/dovecot/conf.d/10-master.conf
#lmtp服务,postfix通过lmtp交付邮件 service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } #验证服务,postfix也通过此验证用户 service auth { unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } unix_listener auth-userdb { mode = 0600 user = vmail #group = } user = dovecot } service auth-worker { user = vmail }
修改文件/etc/dovecot/conf.d/15-lda.conf
postmaster_address = postmaster@gogo.so
修改文件/etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp
listen = *
新建用户用以访问邮件目录数据
useradd -M -u 5000 vmail -d /var/mail -s /sbin/nologin chown -R vmail:vmail /var/mail/
重启dovecot服务
service dovecot restart
完成,一切OK