CentOS Linux邮件系统搭建 - 轻松哥

时间:2024-03-03 07:38:31

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