搭建企业邮箱之postfix
一:简介
电子邮件系统(Electronic mail system,简称E-mail)类似于传统的邮局,邮递员就是电子邮件中的用户代理MUA(Mail User Agent),邮件传输代理MTA(Mail Transfer Agent)就类似于传统的邮局,邮件投递代理MDA(Mail Delivery Agent)类似于传统邮局的分拣送件,所以电子邮件的主要组成部分为MUA,MTA,MDA。工作原理是用户通过MUA发送一封邮件,然后邮件会被MTA解析分析,之后MTA会根据邮件里的收件方的地址通过N多MTA将邮件通过MDA投递给目标用户的邮箱里。
电子邮件是互联网的应用,遵循互联网的相关协议,现在常用的电子邮件主要是由邮件传输协议SMTP,接收邮件的邮局协议POP3和邮件访问协议IMAP4组成,这些协议都遵循TCP/IP协议。它们分别使用TCP端口的25,110,143端口,这些端口也是可以自己设置的。下面具体介绍下SMTP,POP和IMAP协议。
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一种基于文件传输的规范,通过这种规范来完成邮件从发件用户到收件用户的传输。遵循SMTP协议,可以让邮件通过特定的中转方式进行中转传输。
POP邮件协议主要的功能就是从个人计算机上登陆到邮件服务器,然后查找有没有自己的邮件,如果有自己的邮件可以查看下载到本地客户端,也可以从邮件服务器上删除自己的邮件。也可以什么都不做。 POP邮局协议负责从邮件服务器中检索电子邮件也就是负责电子邮件的接收的协议。POP协议支持多用户互联网邮件扩展,任何格式的内容都可以发送。
折叠IMAP协议互联网信息访问协议(IMAP)的诞生是为了代替POP协议,克服POP协议的缺点的协议。IMAP不仅有POP的功能,更能在服务器上操作,进行可以DIY的选择从邮件服务器上接收自己邮件的方式,并且imap可以在服务器上创建自己的相关信息,这些操作都是在服务端的服务器上进行的,通俗的理解IMAP相当于oneline编辑。
二:搭建架构
本次实验采用postfix搭建企业邮箱
三:搭建
1.环境准备
[root@gtj]# iptables –F 清空防火墙规则 [root@gtj]# service iptables save 清空之后,保存防火墙规则。 [root@gtj]# /usr/sbin/sestatus -V 查看selinux当前的状态。 [root@gtj]# setenforce 0 设置selinux的状态为permissive模式。
2.安装依赖包
yum install -y autoconf,automake,libtool,rpm-build,mariadb-server,php-xml,php-pdoperl-DBD-MySQL,libtool-ltdl,expect,php-gd,libdbi,ruby,ruby-libs,php,gd,perl-Time-HiRes,xorg-x11-fonts-Type1,perl-CGI,perl-ExtUtils-MakeMaker,gamin,perl-GD,perl-DB_Filegcc gcc-c++ krb5-devel openssl-develpam-devel mariadb-devel postgresql-devel zlib-devel openldap-devel 然后下载下面相关: groff-1.22.2-8.el7.x86_64.rpm libmcrypt-2.5.8-13.el7.x86_64.rpm mhash-0.9.9.9-10.el7.x86_64.rpm perl-BSD-Resource-1.29.07-1.el7.x86_64.rpm perl-Crypt-PasswdMD5-1.3-0.16.el7.noarch.rpm perl-File-Tail-0.99.3-21.el7.noarch.rpm perl-Linux-Pid-0.04-18.el7.x86_64.rpm perl-Unix-Syslog-1.1-17.el7.x86_64.rpm php-mcrypt-5.4.16-3.el7.x86_64.rpm rrdtool-perl-1.4.8-8.el7.x86_64.rpm rrdtool-ruby-1.4.8-8.el7.x86_64.rpm
3.启动mysql
systemctl start mariadb [root@servergtj mail]# mysqladmin -urootpassword 'gtj123456'
4.搭建DNS服务
[root@servergtj ~]# yum -y install bind bind-chroot [root@servergtj ~]# service named start 开启DNS服务 vim/etc/named.conf,然后在末尾增加一下内容,vim/etc/named.conf options { listen-on port 53 { any; }; //any的意思是允许任何IP地址进行查询。 listen-on-v6 port 53 { ::1;}; allow-query { any; }; //这里同上一个注释 recursion yes; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; include"/etc/named.rfc1912.zones"; 区域文件定义 vi named.rfc1912.zones设置一个正向的域和一个反向的域(一个正向域必须有一个反向域)在配置文件的最后添加zone "mydream123.com" IN { type master; file "mydream123.com.zone"; allow-update { none; }; }; zone "0.168.192.in-addr.arpa" IN { type master; file "0.25.172.in-appr.zone"; allow-update { none; }; }; [root@servergtj named]# cp named.localhost mydream123.com.zone 然后修改配置文件/var/named/mydream123.com.zone。 vi /var/named/mydream123.com.zone 每一个域名后面必须有点(.) @ IN SOA mydream123.com. Admin NS mydream123.com. 后面的.是不能少的。 MX 5 mail.mydream123.com. 先解析到这个地址。mail A 192.168.10.103 配置好正向解析域之后,配置反向解析域。操作如下: [root@servergtj named]# cp named.loopback 192.168.0.in-appr.zone 然后修改配置文件 /var/named/192.168.0.in-appr.zone。 vi 192.168.0.in-appr.zone NS mydream123.com. 103 PTR mail.mydream123.com. 设置好正向解析域和反向解析域之后,重启DNS服务让配置生效。 /etc/init.d/named restart 把DNS解析指向192.168.10.103。 192.168.10.103 mail.mydream123.com 可以用nslookup测试能不能解析到正确的地址
5.创建相关数据库
tar zxf extman-1.1.tar.gz cd extman-1.1/docs sed -i 's/ TYPE=MyISAM.*;/;/' extmail.sql mysql -uroot -pgtj123456 < extmail.sql 向数据库里导入相关表。 mysql -uroot -pgtj123456< init.sql 初始化数据库 chkconfig mysqld on 让数据库开机自启
6.安装courier-authlib
rpm -ivh courier-authlib-0.66.3-1.el7.x86_64.rpm cd /etc/authlib vim authdaemonrc 修改如下三个选项 authmodulelist="authmysql" authmodulelistorig="authmysql" DEBUG_LOGIN=2 修改的前两个内容代表调用mysql认证,最后一行的意思是显示调用courier-authlib时产生的日志,以便方便之后发生错误时排错。 修改 authmysqlrc vim authmysqlrc MYSQL_SERVER localhost MYSQL_USERNAME extmail MYSQL_PASSWORD extmail MYSQL_PORT 3306 //数据库服务的端口 MYSQL_UID_FIELD ‘2000’ MYSQL_GID_FIELD ‘2000’ MYSQL_USER_TABLE mailbox MYSQL_SOCKET /var/lib/mysql/mysql.sock MYSQL_DATABASE extmail MYSQL_SELECT_CLAUSE SELECT username,password,"",uidnumber,gidnumber,CONCAT('/home/data/domains/',homedir), CONCAT('/home/data/domains/',maildir),quota,name FROM mailbox WHERE username= '$(local_part)@$(domain)' MYSQL_SELECT_CLAUSE 参数必须为一行内容。不然启动中间件courier-authlib会报错,导致启动不了。 chmod 755 /var/spool/authdaemon/ 这个必须添加的权限,不然的话无法启用courier-authlib认证服务。 systemctl start courier-authlib chkconfig couier-authlib 启动开机自启程序 然后我们通过ps -ef |grep courier-authlib 这个指令检查有没有启动成功。
7.POP与IMAP支持
yum localinstall courier-imap-4.16.2-1.x86_64.rpm courier-unicode-1.3-1.el7.x86_64.rpm 安装完成之后就可以正常启动 courier-imap了。指令如下: systemctl start courier-imap chkconfig courier-imap 加入开机自启服务 然后通过ps -ef |grep courier-imap 验证是否启动成功。如图3.8说明courier-imap启动成功。
8.sasl认证
rpm -ivh cyrus-sasl-2.1.26-17.el7.src.rpm cd ~/rpmbuild/SPECS/ vi cyrus-sasl.spec 在配置文件242行的地方加入如下语句 --with-authdaemond=/var/spool/authdaemon/socket \ 通过rpmbuild -ba cyrus-sasl.spec检测配置,软件有没有错误,如果没有错误才可以继续执行以下 行如下的操作。 for i in $(rpm -qa | grep sasl | awk -F"-2.1.26" '{ print $1 }') ; do rpm -e $i --nodeps >/dev/null ; done rpm -ivh ../RPMS/x86_64/cyrus-sasl-* 生成sasl的相关配置文件 ,Postfix 会调用smtp.conf配置文件,手工创建该文件,并且在这个配置文件中声名使用authlib来认证。操作如下: cat > /etc/sasl2/smtpd.conf << ENDF pwcheck_method:authdaemond log_level:3 mech_list:PLAIN LOGIN authdaemond_path:/var/spool/authdaemon/socket ENDF
然后通过postconf –a 检测postfix是不是支持sasl认证
9.配置postfix
因为rhel系统默认自带sendmail程序,sendmail程序和postfix会发生冲突,所以我们在安装postfix之前先把sendmail卸载了,然后再安装postfix。操作如下:
通过rpm –qa来查看有没有安装sendmail。
[root@servergtj named]# rpm -qa |grep sendmail 查看到的结果是存在sendmail相关的软件的。然后我们用rpm –e来卸载和sendmail相关的软件,然后检测还有没有,如果没有的话再安装postfix软件。 [root@servergtj named]# rpm -e sendmail sendmail-cf sendmail-doc –nodeps 卸载sendmail相关软件。 [root@servergtj named]# kilall -9 sendmail 强制删除sendmail进程 然后通过提前准备好的postfix的安装包通过yum的方式安装postfix。命令如下: [root@servergtj named]# yum install postfix 安装好postfix之后,接下来要对postfix进行配置了。这些配置是实验的重中之中,所以一定要小心配置,不然会出很多自己很难解决和发现的错误。因为配置还是很复杂的,所以实验中修改了多次的配置文件。首先修改postfix主配置文件,修改一些基本配置项,比如主机名,监听地址等等。 vim /etc/postfix/main.cf myhostname = mail.mydream123.com mydomain = mydream123.com myorigin=$mydomain //发件者的域名 inet_interfaces = postfix //监听的网络接口 mynetworks=127.0.0.0/8 192.168.0.0/24 //信任的客户端 mydestination = $myhostname, localhost.$mydomain, localhost //收件人使用的域名 通过cat /etc/sysconfig/network 查看myhostname,mydomain。 实验中postfix需要支持虚拟域,在配置文件后面加入虚拟域支持相关的参数。操作如下: message_size_limit = 14680064 //该项限制了postfix队列文件的大小。 virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_base = /home/data/domains virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_limit_maps.cf virtual_transport = maildrop //用maildrop进行邮件的投递 maildrop_destination_recipient_limit = 1 smtpd_recipient_restrictions = //进行地址过滤 permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname, # SMTP sender login matching config smtpd_sender_restrictions = permit_mynetworks, reject_sender_login_mismatch, reject_authenticated_sender_login_mismatch, reject_unauthenticated_sender_login_mismatch smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_maps.cf # SMTP AUTH config here broken_sasl_auth_clients = yes //启用smtp关于sasl的认证 smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $myhostname smtpd_sasl_security_options = noanonymous sasl //认证拒绝匿名用户 cp extman-1.1/docs/mysql_virtual_* /etc/postfix systemctl start postfix chkconfig postfix on
10.MDA的安装
邮件投递代理MDA用的是maildrop,安装maildrop用来扩展邮件投递功能, maildrop是一个非常优秀的MDA ,在投递邮件时让postfix使用 maildrop来投递邮件。操作如下:
rpm -ivh maildrop-2.8.3-2.x86_64.rpm groupadd -g 1000 vgroup useradd -g 1000 -u 1000 -s /sbin/nologin -d /dev/null vuser 如果 uid 1000 已经被占用,则可以更换 uid ,如下所示: groupadd -g 2000 vgroup useradd -g 2000 -u 2000 -s /sbin/nologin -d /dev/null vuser bash id-sql.sh -u 2000 -g 2000 -n root -p uplooking 配置/etc/postfix/master.cf 文件 ,让 postfix 可以调用 maildrop 。 vi /etc/postfix/master.cf 在最后面加入下面内容 : maildrop unix - n n - - pipe flags=DRhu user=vuser argv=/usr/bin/maildrop -d ${user}@${nexthop} ${recipient} ${user} ${extension} ${nexthop}//这个可以不是一行内容。 创建邮件存储目录 并建个测试域。操作如下: mkdir -p /home/data/domains/extmail.org/postmaster maildirmake /home/data/domains/extmail.org/postmaster/Maildir chown -R vuser:vgroup /home/data/domains/ service postfix restart 测试 maildrop是否能够正常工作。操作如下: echo "test" | maildrop -V 10 -d postmaster@extmail.org maildrop: authlib: groupid=1000 maildrop: authlib: userid=1000 maildrop: authlib: logname=postmaster@extmail.org, home=/home/data/domains/extmail.org/postmaster, mail=/home/data/domains/extmail.org/postmaster/Maildir/ maildrop: Changing to /home/data/domains/extmail.org/postmaster Message start at 0 bytes, envelope sender=postmaster@extmail.org maildrop: Attempting .mailfilter maildrop: Delivery complete.
出现上以信息就证明了authlib和maildrop 是正常工作的。如图下图说明我们配置的是正确的。
11.Webmail安装
vim /etc/httpd/conf/httpd.conf 修改下面两项就可以了 User vuser Group vgroup [root@gtj~]# chgrp vgroup /usr/sbin/suexec [root@gtj ~]# cd /etc/httpd/conf.d/ [root@gtj conf.d]# vim extmail.conf Alias /extman/cgi/ /var/www/extsuite/extman/cgi/ Alias /extman /var/www/extsuite/extman/html/ <Location "/extman/cgi"> SetHandler cgi-script Options +ExecCGI </Location> # config for ExtMail Alias /extmail/cgi/ /var/www/extsuite/extmail/cgi/ Alias /extmail /var/www/extsuite/extmail/html/ <Location "/extmail/cgi"> SetHandler cgi-script Options +ExecCGI </Location>
这样就完成了apache的相关配置,然后安装extmail和extman
找到开始准备好的extmail和extman的安装包,首先我们找到并解压extman 和 extmail,然后cp 到 apache的网站根目录下。然后cd到 /var/www/extsuite/extmail 目录下,配置extman和extmail。生成主配置文件,并在主配置文件中修改相应选项。做如下操作:
mkdir /var/www/extsuite cp -r extmail-1.2 /var/www/extsuite/extmail cp -r extman-1.1 /var/www/extsuite/extman cp webmail.cf.default webmail.cf 修改 webmail.cf 下面的选项 SYS_MAILDIR_BASE = /home/data/domains SYS_MYSQL_USER = extmail SYS_MYSQL_PASS = extmail cd到 /var/www/extsuite/extman 目录下 cp webman.cf.default webman.cf 修改 webman.cf 下面的选项为邮件目录 : SYS_MAILDIR_BASE = /home/data/domains SYS_SESS_DIR = /tmp 以下参数选配 SYS_DEFAULT_UID = 2000 SYS_DEFAULT_GID = 2000 SYS_CAPTCHA_ON = 0 extman为我们提供了一个友好的图形化日志分析工具,可以对其进行简单的配置并启用这个后台日志分析工具。操作如下: cd /var/www/extsuite/extman/addon/ cp -r mailgraph_ext /usr/local/ 然后我们启动这个日志分析工具。 /usr/local/mailgraph_ext/mailgraph-init start echo '/usr/local/mailgraph_ext/mailgraph-init start' >> /etc/rc.local 通过几次的实验发现extman与extmail的perl代码中有些小问题,为保证稳定运行,要修改一下,操作如下: tar xf Encode-IMAPUTF7-1.05.tar.gz cd Encode-IMAPUTF7-1.05 perl Makefile.PL cp lib/Encode/IMAPUTF7.pm /var/www/extsuite/extman/libs/Encode/IMAPUTF7.pm vi /var/www/extsuite/extmail/cgi/index.cgi #!/usr/bin/perl -wT 修改成 #!/usr/bin/perl -w 重启一下服务,测试一下: systemctl restart httpd systemctl restart postfix chown -R vuser:vgroup /var/lib/php/session/
12.访问测试
打开浏览器 , 输入 http://mail.mydream123.xyz/extman
用户为:root@extmail.org 密码 为 : extmail*123* 进入webmail的后台管理界面。然后可以看到很多选项。
13.关于垃圾邮件过滤
可以通过spamassassin进行垃圾邮件过滤。
嗨、骚年、快来消灭0回复。