标签:在lamp平台上基于postfix+mysql+dovecot+sasl+courier-authlib+extmail+extman搭建企业级邮件系统
邮件系统的简介:
一封邮件的传输流程类似如下:
发件人:MUA --发送--> MTA --> 若干个MTA... --> MTA --> MDA <--MRA <--收取<-- MUA:收件人
1,发件人调用MUA编辑要发送的邮件。
2,MUA把邮件借助STMP协议发生给发送方的邮件服务器(MTA),MUA充当STMP的客户端,而发送方的邮件服务器(MTA)充当STMP的服务器端。
3,发送方邮件服务器(MTA)接收MUA发来的邮件后,就把邮件临时存放在邮件发送缓存队列中,等待发送到接收方的邮件服务器(MTA)。
4,发送方的邮件服务器(MTA)的STMP客户端与接收方邮件服务器(MTA)的STMP服务器端建立TCP 连接,然后把邮件从缓存队列中的邮件依此发送出去。
5,运行在接收方邮件服务器(MTA)的STMP服务器端邮件投递(MDA)进程接收到邮件后,把邮件投递到收件人的用户邮箱中,等待收件人进行读取。
6,收件人在打算收信时,邮件检索代理进程(MRA)使用pop3 或imap4 协议读取发送给自己的邮件。
各个组件的简介:
1,MUA (邮件用户代理 outlook | foxmail): 邮件用户代理就是用户与电子邮件系统的接口,在大多数情况下它就是一个运行在用户pc端的一个程序,因此用户代理又称为电子邮件客户端软件;用户代理向用户提供一个很友好的接口来发送和接收邮件。编辑邮件程序。
2,MTA (邮件传输代理 sendmail | postfix):在linux发行版上用的比较多的邮件传输代理(MTA)软件是 sendmail 和postfix传统的Sendmail将所有功能都集中在同一个程序里,这种结构我们称之为“单体式设计”(monolithic).Postfix采用专职负责的策略,不同的功能分别交由不同的专门程序处理,这种结构称为“模块化设计”(modular)。这些自成一格的专门程序,我们称之为组件(component);大多数组件都是以daemon的形式存在,也就是常驻在系统内存里的连续动作的后台进程(background process);当Postfix被启动后,首先启动的是master daemon,它主导邮件的处理流程,同时也是其他组件的总管;在处理邮件的过程中,master会启动对应功能的组件来处理相关事宜,被master启动的组件,在完成交付的工作之后会自行结束;或者,如果组件的处理时间超过时限,或是工作量到达预定限度,组件也会自行结束。master daemon会常驻在系统中,当管理员启动它时,它从main.cf和master.cf这两个配置文件取得启动参数。
postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件;下面一段话摘自postfix的官方站点(http://www.postfix.org):postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试;在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真实一个让人吃惊的数字;Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性。”
MTA的整个处理流程分为三个阶段:接收邮件、将邮件放入发送队列、投递邮件。每个阶段由一组独立的Postfix组件负责;当一封邮件被收下并放入接收队列之后,队列管理器(Queue Manager)会启动适当的MDA,将邮件送到终点。
邮件有四种渠道可以进入Postfix系统:
1、Postfix可接受来自本机系统的邮件(本机用户或自主进程提交的邮件);
2、Postfix可接受网络传入的邮件(来自MUA或者其他MTA);
3、已经被Postfix收下并交给MDA的邮件,被MDA传回到Postfix(通常是为了转寄到另一个地址);
4、当Postfix无法将邮件寄到目的地时,自己会产生退信通知函;
PS:邮件有可能在进入Postfix之前就被拒绝了,或者因为暂时性的故障(网络断线、远程服务器响应暂时性的错误等),同样的邮件可能会每隔一段时间就重复进入Postfix系统一次,重新投递。
来自服务器本机的邮件:
各个Postfix组件之间的合作全靠队列(Queue)交换邮件、Postfix系统有多个队列,这些队列全部队列管理器(Queue Manager)负责控制管理;Postfix组件可将邮件交付给Queue Manager,由其代为放入适当的队列;当需要处理特定工作时,Queue Manager将队列里的邮件交付给正确的组件。
在Unix系统上,当用户要寄出邮件时(不管这封信是寄到哪里),通常是使用sendmail包内的sendmail命令;Postfix提供了一个与此命令兼容的同名工具,也称为sendmail;当用户以Postfix的sendmail寄出邮件后,sendmail(postfix的版本)会使用postdrop程序将邮件存入Postfix队列目录下的maildrop/子目录。专门注意maildrop子目录有无变化的是Pickup Daemon,每当有新的邮件进入maildrop时,Pickup Daemon便会读出新邮件,然后交给cleanup daemon进入“清理程序”。
当邮件刚进入Postfix时,不一定含有构成有效邮件的所有必要字段,而且标头里的地址也可能需要被改写成标准格式(user@domain.tld),并依据规范的或虚拟的查询表(如果有的话)将原本的地址改成其他地址;所谓的“清理程序”就是补足遗漏的标头字段,这部分工作由cleanup daemon负责;地址的处里由Trivial-Rewrite Daemon负责。
经过Cleanup Daemon处理好的邮件,会被传入收件队列(Incoming Queue);Queue Manager会不断的注意收件队列的变化,每当有新邮件进入收件队列时,便会用适当的MDA将邮件送到下一站,或直接送到最终目的地。
来自网络的邮件:
来自网络的邮件由Postfix Smtpd Daemon接收进来,然后交给Cleanup Daemon运行清理程序,随后排入收件队列,由Queue Manager选择适当的MDA将邮件送到下一站或最终目的地;Smtpd有可能收到两种邮件,第一种是外界寄给Postfix所控制的网域的邮件(Postfix系统本身是邮件的终点站或网关),另一种是要寄到其他网域的邮件。
Smtpd一定会收下第一种邮件(如果收件人存在的话),至于第二种邮件(目的地在其他网域),就要看传邮件过来的客户端是否有资格;网络收下要寄到其他网域的邮件,并代为寄送到目的地的动作称为转发(relay);在两种情况下,Postfix愿意提供转发服务:一是客户端符合配置文件限定的资格,二是收信网域是relay_domain参数所列出的网域之一。
通知函:
当用户的邮件被延时时,或是根本无法递送到目的地时,Postfix使用Defer或Bounce Daemon产生一封新的通知函。这封通知函会被交给Cleanup Daemon,由它进行例行的清理程序之后再排入收件队列,由Queue Manager接手处理。
转寄邮件:
有时候,邮件在委托给MDA之后,MDA会发现该邮件其实应该寄送到另一个系统的另一个账户;比如说,当MDA在用户个人的forward文件发现了另一个地址时,就会发现这种情况;照理说,MDA可以直接使用Smtp Client(即Smtp Daemon)送出邮件;不过,由于同一封信可能有多位收件人,为了照顾到每一位收件人,同时也为了在邮件日志上留下完整记录,MDA应该依提交新邮件的方式,让邮件重新回到Postfix系统,由Postfix按照“来自本机的邮件”的程序来处理;
3,MDA (邮件投递代理 procmail | maildrop): 当邮件到达接收方的邮件服务器时,由MDA 将邮件存放到邮筒;
4,MRA (邮件检索代理 cyrus-imap | dovecot): 从邮筒中取得邮件传送给客户端;
PS:电子邮件由信封和内容两部分组成,在电子邮件的信封上标识了收件人的地址,电子邮件的传输程序是根据邮件信封上的信息来投递邮件的。
邮件系统所用的协议:
1,smtp:简单邮件传输协议,采用 C/S 架构客户端进程为smtp( 客户端使用的是大于5000的任意端口号),服务器端进程smtpd;服务器端监听在TCP/25 端口上;smtp协议用于用户代理向邮件服务器投递邮件或在邮件服务器之间投递邮件。
2,pop3 :邮局协议第三版 (大多数使用pop3, 但是imap4功能比pop3强大);pop3 协议用于用户代理从邮件服务器上下载邮件;监听在TCP/110。
3,imap4:互联网邮件访问协议;监听在TCP/143。
4,sasl:简单认证安全层,做用户认证功能;
5,ldap:轻量级目录访问协议;
SMTP协议通信的三个阶段:
1,连接建立
发件人的邮件投递到发送方邮件服务器的发送邮件缓存后,SMTP客户端就每隔一定时间对邮件缓存扫描一次,如发现有邮件,就使用smtpd的tcp/25号端口与接收方的邮件服务器的SMTP服务器建立TCP连接;在连接建立后,接收方SMTP服务器要发出“220 Service ready”;然后SMTP客户端向SMTP服务器端发生HELO 命令,附上发送方的主机名;SMTP 服务器若有能力接收邮件,则回答: “250 ok ”,表示已准备好接受邮件;若SMTP 服务器不可用,则回答: “421 不可用”。
2,邮件发送
邮件的传送从mail 命令开始;RCPT 命令的作用就是:先弄清楚接收方邮件系统是否已做好接受邮件的准备,然后才发送邮件;这样是为了避免浪费通信资源,不至于发送了很长时间才知道地址错误。data命令 开始编辑邮件正文。
3,连接释放
邮件发送完毕后,SMTP 客户端应该发送quit 命令 ,SMTP服务器返回的221(服务关闭),表示SMTP同意释放连接;邮件的传送的全部过程结束。
测试环境:
OS:rhel-6.5 Lamp
eth0:192.168.1.107
eth1 : 192.168.10.254
安装软件列表:
bind--------- DNS服务器
mysql -------- 存储用户信息
postfix--------投递邮件
dovecot ------邮件检索
cyrus-sasl-------用户认证
courier-authlib ------- 用户认证库
extmial --------webmail
extman---------邮件后台管理程序
一,安装bind
1,以rpm包方式安装bind
# yum -y install bind
2,编辑配置文件/etc/named.conf
# vim /etc/named.conf
#listen port 53 { 127.0.0.1; };
#listen-on-v6 port 53 { ::1; };
#allow-query { localhost; };
# dnssec-enable yes;
# dnssec-validation yes;
# dnssec-lookaside auto;
# bindkeys-file "/etc/named.iscdlv.key";
###定义正向区域
zone "luolinux.com" IN {
type master;
file "luolinux.zone";
allow-update { none; };
allow-transfer { none; };
};
###定义反向区域
zone "1.168.192.in-addr.arpa" IN {
type master;
file "1.168.192.zone";
allow-update { none; };
allow-transfer { none; };
};
#include "/etc/named.root.key";
3,在/var/named/ 目录下提供正反向区域数据库文件
# cd /var/named/
# vim luolinux.zone
$TTL 600
@ IN SOA dns.luolinux.com. admin@luolinux.com. (
2016041067
7D
10M
3D
1D)
IN NS dns
dns IN A 192.168.1.107
mail IN A 192.168.1.107
www IN A 192.168.1.107
4,反向区域数据库文件
# vim 1.168.192.zone
$TTL 86400
@ IN SOA dns.luolinux.com. admin@luolinux.com. (
2016041067
7D
10M
3D
1D)
IN NS dns.luolinux.com.
136 IN PTR dns.luolinux.com.
136 IN PTR mail.luolinux.com.
136 IN PTR www.luolinux.com.
5,修改区域数据库文件属主和属组,权限
# chown root:named luolinux.zone 1.168.192.zone
# chmod 640 luolinux.zone 1.168.192.zone
6,关闭selinux
# setenforce 0
7,检测区域数据库文件是否有语法错误
# named-checkconf /etc/named.conf
# named-checkzone "luolinux.com" luolinux.zone
# named-checkzone "1.168.192.in-addr.arpa" 1.168.192.zone
8,启动named服务
# service named start
# chkconfig --add named
# chkconfig named on
9,测试
# dig -t MX luolinux.com
# dig -t A mail.luolinux.com
# dig -x 192.168.1.107
10,修改主机名为mail.luolinux.com
# vim /etc/sysconfig/network
HOSTNAME=mail.luolinux.com
# hostname mail.luolinux.com
二,编译安装postfix-3.1.0.tar.gz
1,卸载系统原有的邮件服务
# service sendmail stop
# chkconfig sendmail off
# rpm -e sendmail --nodeps
2,解压postfix源码包
# tar xf postfix-3.1.0.tar.gz
# cd postfix-3.1.0
3,建立postfix用户
# groupadd -g 2525 postfix
# useradd -g 2525 -u 2525 -s /sbin/nologin -M postfix
# groupadd -g 2526 postdrop
# useradd -g 2526 -u 2526 -s /sbin/nologin -M postdrop
4,配置编译安装
注意:mysql的安装方式不同,头文件和库文件存放位置不同;mysql 采用通用二进制包安装的选项如下:
# make makefiles ‘CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS ‘ ‘AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto‘
注意:mysql的安装方式不同,头文件和库文件存放位置不同;mysql 采用rpm包安装的选项如下:
# make makefiles ‘CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS ‘ ‘AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto‘
# make
# make install
5,为postfix提供SysV服务脚本/etc/rc.d/init.d/postfix,内容如下:
# vim /etc/rc.d/init.d/postfix
#!/bin/bash
#
# postfix Postfix Mail Transfer Agent
#
# chkconfig: 2345 80 30
# description: Postfix is a Mail Transport Agent, which is the program \
# that moves mail from one machine to another.
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ $NETWORKING = "no" ] && exit 3
[ -x /usr/sbin/postfix ] || exit 4
[ -d /etc/postfix ] || exit 5
[ -d /var/spool/postfix ] || exit 6
RETVAL=0
prog="postfix"
start() {
# Start daemons.
echo -n $"Starting postfix: "
/usr/bin/newaliases >/dev/null 2>&1
/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
echo
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down postfix: "
/usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
echo
return $RETVAL
}
reload() {
echo -n $"Reloading postfix: "
/usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"
RETVAL=$?
echo
return $RETVAL
}
abort() {
/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
return $?
}
flush() {
/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
return $?
}
check() {
/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
return $?
}
restart() {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
abort)
abort
;;
flush)
flush
;;
check)
check
;;
status)
status master
;;
condrestart)
[ -f /var/lock/subsys/postfix ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit 1
esac
exit $?
# END
6,为此脚本赋予执行权限
# chmod +x /etc/rc.d/init.d/postfix
7,将postfix服务添加至服务列表,设置其开机自动启动
# chkconfig --add postfix
# chkconfig postfix on
8,生成别名二进制文件,确保生成/etc/aliases.db文件
# newaliases
9,编辑/etc/postfix/main.cf
# vim /etc/postfix/main.cf
修改以下几项为您需要的配置:
myhostname = mail.luolinux.com
myorigin = $mydomain
mydomain = luolinux.com
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, dns.$mydomain
mynetworks = 192.168.1.0/24, 127.0.0.0/8
Description:
myorigin参数用来指明发件人所在的域名,即做发件地址伪装;
mydestination参数指定postfix接收邮件时收件人的域名,即您的postfix系统要接收到哪个域名的邮件;
myhostname 参数指定运行postfix邮件系统的主机的主机名,默认情况下,其值被设定为本地主机名;
mydomain 参数指定您的域名,默认情况下,postfix将myhostname的第一部分删除而作为mydomain的值;
mynetworks 参数指定你所在的网络的网络地址,postfix系统根据其值来区别用户是远程的还是本地的,如果是本地网络用户则允许其访问;
inet_interfaces 参数指定postfix系统监听的网络接口;
10,启动postfix服务
# service postfix start
11,如果启动failed,查看原因
# /usr/sbin/postfix check
# tail /var/log/maillog
12,安装telnet客户端
# yum -y install telnet
13,测试发邮件
# telnet mail.luolinux.com 25
# ehlo mail.luolinux.com
# mail from: root@luolinux.com
# rcpt to:hadoop@luolinux.com
# data
Subject:hello ###邮件主题
hello ###邮件内容
. ###内容结束标志
# quit ###退出
14,查看邮件是否发送成功
# tail /var/log/maillog
15,查看hadoop用户是否接收到邮件
# su - hadooop
三,安装配置dovecot (tcp/110)
1,安装dovecot
# yum install -y dovecot dovecot-mysql
2,修改配置文件
# vim /etc/dovecot/dovecot.conf
protocols = pop3
# vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain login
3,启动服务
# service dovecot start
4,添加服务至服务列表,并设置开机自动启动
# chkconfig --add dovecot
# chkconfig dovecot on
5,以hadoop用户身份接收邮件
# telnet mail.luolinux.com 110
# USER hadoop
# PASS hadoop
# LIST
# RETR
# quit
6,telnet mail.luolinux.com 110 时遇到错误解决方法
# tail /var/log/maillog
错误:
dovecot: pop3(hadoop): Error: mkdir(/home/hadoop/mail/.imap/INBOX) failed: Operation not permitted
Apr 2 16:16:44 Director dovecot: pop3(hadoop): Error: Couldn‘t open INBOX: Internal error occurred. Refer to server log for more information. [2016-04-02 16:16:44]
Apr 2 16:16:44 Director dovecot: pop3(hadoop): Couldn‘t open INBOX top=0/0, retr=0/0, del=0/0, size=0
解决方法:
# su - hadoop
# cd mail/.imap/
# mkdir INBOX
# exit
为了使新创建的用户可以自动创建这个目录,可以修改/etc/skel/.bash_profile文件如下:
# tail -4 /etc/skel/.bash_profile
if [ ! -d ~/mail/.imap/INBOX ];then
mkdir -p ~/mail/.imap/INBOX
fi
7,mutt 命令的用法(接收邮件)
# mutt -f pop://hadoop@mail.luolinux.com
四,cyrus-sasl(cyrus-sasl 服务进程为 saslauthd) 用户认证
1,编辑cyrus-sasl的配置文件
# vim /etc/sysconfig/saslauthd
MECH=shadow
2,启动服务并加入到服务列表
# service saslauthd start
# chkconfig --add saslauthd
# chkconfig saslauthd on
3,测试用户
# testsaslauthd -uhadoop -phadoop
4,提供cyruns-sasl认证配置文件
# vim /usr/lib64/sasl2/smtpd.conf
log_level: 3
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
# service saslauthd restart
5,postfix开启基于cyrus-sasl的认证功能
# vim /etc/postfix/main.cf
mynetworks = 127.0.0.0/8
添加以下内容:
############################CYRUS-SASL############################
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
# service postfix restart
五,编译安装courier-authlib (更多版本下载地址 https://sourceforge.net/projects/courier/files/authlib/ )
1、courier简介:
courier-authlib是Courier组件中的认证库,它是courier组件中一个独立的子项目,用于为Courier的其它组件提供认证服务。其认证功能通常包括验正登录时的帐号和密码、获取一个帐号相关的家目录或邮件目录等信息、改变帐号的密码等。而其认证的实现方式也包括基于PAM通过/etc/passwd和/etc/shadow进行认证,基于GDBM或DB进行认证,基于LDAP/MySQL/PostgreSQL进行认证等。因此,courier-authlib也常用来与courier之外的其它邮件组件(如postfix)整合为其提供认证服务。
2,安装ltdl(动态模块加载器)
# yum -y install libtool-ltdl libtool-ltdl-devel
3,下载courier-authlib 源码包 ( http://www.courier-mta.org/download.html#authlib )
# wget http://download.chinaunix.net/down.php?id=28869&ResourceID=1788&site=1
4,解压源码包
# tar xf courier-authlib-0.62.4.tar.bz2
# cd courier-authlib-0.62.4
5,配置编译安装
# ./configure \
--prefix=/usr/local/courier-authlib \
--sysconfdir=/etc \
--without-authpam \
--without-authshadow \
--without-authvchkpw \
--without-authpgsql \
--with-authmysql \
--with-mysql-libs=/usr/lib/mysql \
--with-mysql-includes=/usr/include/mysql \
--with-redhat \
--with-authmysqlrc=/etc/authmysqlrc \
--with-authdaemonrc=/etc/authdaemonrc \
--with-mailuser=postfix \
--with-mailgroup=postfix \
--with-ltdl-lib=/usr/lib64 \
--with-ltdl-include=/usr/include
=====================================================================
报错: configure: error: invalid ltdl library directory: `/usr/lib64/‘
解决方法:
# wget http://mirror.hust.edu.cn/gnu/libtool/libtool-2.4.6.tar.gz
# tar zxvf libtool-2.4.6.tar.gz
# cd libtool-2.4.6
# ./configure --prefix=/usr/local/libtool-2.4.6 --enable-ltdl-install
# make
# make install
# yum -y install expect
======================================================================
# ./configure \
--prefix=/usr/local/courier-authlib \
--sysconfdir=/etc \
--without-authpam \
--without-authshadow \
--without-authvchkpw \
--without-authpgsql \
--with-authmysql \
--with-mysql-libs=/usr/lib/mysql \
--with-mysql-includes=/usr/include/mysql \
--with-redhat \
--with-authmysqlrc=/etc/authmysqlrc \
--with-authdaemonrc=/etc/authdaemonrc \
--with-mailuser=postfix \
--with-mailgroup=postfix \
--with-ltdl-lib=/usr/local/libtool-2.4.6/lib \
--with-ltdl-include=/usr/local/libtool-2.4.6/include
PS: 可以使用--with-authdaemonvar=/var/spool/authdaemon 选项来指定进程套接字目录路径
# make
# make install
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6,赋予进程套接字目录权限
# chmod -R 755 /usr/local/courier-authlib/var/spool/authdaemon/
# cp /etc/authdaemonrc.dist /etc/authdaemonrc
# cp /etc/authmysqlrc.dist /etc/authmysqlrc
7,修改/etc/authdaemonrc 文件
# vim /etc/authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=10
8,配置其通过mysql进行邮件帐号认证
编辑/etc/authmysqlrc 为以下内容,其中2525,2525 为postfix 用户的UID和GID。
# vim /etc/authmysqlrc
MYSQL_SERVER localhost
MYSQL_PORT 3306 (指定你的mysql监听的端口,这里使用默认的3306)
MYSQL_USERNAME extmail (这时为后文要用的数据库的所有者的用户名)
MYSQL_PASSWORD extmail (密码)
MYSQL_SOCKET /tmp/mysql.sock
MYSQL_DATABASE extmail
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD ‘2525‘
MYSQL_GID_FIELD ‘2525‘
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD concat(‘/var/mailbox/‘,homedir)
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD concat(‘/var/mailbox/‘,maildir)
9,为courier-authlib提供服务脚本
# cp /source/courier-authlib-0.62.4/courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib
# chmod +x /etc/rc.d/init.d/courier-authlib
# chkconfig --add courier-authlib
# chkconfig --level 2345 courier-authlib on
10,输出courier-authlib的库文件至系统库文件路径/usr/lib,而后让系统重新载入系统库
# echo "/usr/local/courier-authlib/lib/courier-authlib" > /etc/ld.so.conf.d/courier-authlib.conf
# ldconfig -v
# service courier-authlib start (启动服务)
11,新建虚拟用户邮箱所在的目录,并将其权限赋予postfix用户:
# mkdir –pv /var/mailbox
# chown postfix /var/mailbox/
12,接下来重新配置SMTP 认证,编辑 /usr/lib64/sasl2/smtpd.conf ,确保其为以下内容:
# vim /usr/lib/sasl2/smtpd.conf
pwcheck_method: authdaemond
log_level: 3
mech_list:PLAIN LOGIN
authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
# service saslauthd restart
13,让postfix支持虚拟域和虚拟用户,编辑/etc/postfix/main.cf,添加如下内容:
# vim /etc/postfix/main.cf
########################Virtual Mailbox Settings########################
virtual_mailbox_base = /var/mailbox
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_domains =
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_uid_maps = static:2525
virtual_gid_maps = static:2525
virtual_transport = virtual
# maildrop_destination_recipient_limit = 1
# maildrop_destination_concurrency_limit = 1
##########################QUOTA Settings########################
message_size_limit = 14336000
virtual_mailbox_limit = 20971520
#virtual_create_maildirsize = yes
#virtual_mailbox_extended = yes
#virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
#virtual_mailbox_limit_override = yes
#virtual_maildir_limit_message = Sorry, the user‘s maildir has overdrawn his diskspace quota, please Tidy your mailbox and try again later.
#virtual_overquota_bounce = yes
14,检测那些配置选项有误
# postconf -n
15,使用extman(http://www.extmail.org/download)源码目录下docs目录中的extmail.sql和init.sql建立数据库
# tar zxvf extman-1.1.tar.gz
# cd extman-1.1/docs
# sed -i ‘s@TYPE=MyISAM@ENGINE=InnoDB@g‘ extmail.sql
# mysql -uroot -p < extmail.sql
====================================================================
错误:
ERROR 1364 (HY000) at line 31: Field ‘ssl_cipher‘ doesn‘t have a default value
错误原因:
指定了严格模式,为了安全,严格模式禁止通过insert 这种形式直接修改mysql库中的user表进行添加新用户。
解决方法:
编辑/etc/my.cnf修改sql_mode选项值
# vim /etc/my.cnf
sql_mode=NO_ENGINE_SUBSTITUTION
# service mysqld restart
=====================================================================
# mysql -uroot -p < init.sql
# cp mysql* /etc/postfix/
PS: 在mysql5.1的版本之后定义存储引擎不再使用type 而是engine
# sed -i ‘s@TYPE=MyISAM@ENGINE=InnoDB@g‘ extmail.sql
16,授予用户extmail访问extmail数据库的权限
# mysql -uroot -p
mysql> GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY ‘extmail‘;
mysql> GRANT all privileges on extmail.* TO extmail@127.0.0.1 IDENTIFIED BY ‘extmail‘;
mysql> FLUSH PRIVILEGES;
17,启用虚拟域以后,需要取消中心域,即注释掉myhostname, mydestination, mydomain, myorigin几个指令
# vim /etc/postfix/main.cf
#myhostname
#mydestination
#mydomain
#myorigin
# service postfix restart
PS:启用虚拟域以后,需要取消中心域,即注释掉myhostname, mydestination, mydomain, myorigin几个指令;当然,你也可以把mydestionation的值改为你自己需要的。
六,配置dovecot使用虚拟用户
1,配置dovecot
# vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/mailbox/%d/%n/Maildir
# vim /etc/dovecot/conf.d/auth-sql.conf.ext
mechanisms = plain
passdb {
driver = sql
args = /etc/dovecot/dovecot-mysql.conf
}
userdb {
driver = sql
args = /etc/dovecot/dovecot-mysql.conf
}
2,提供dovecot认证用户配置文件
# vim /etc/dovecot/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=extmail user=extmail password=extmail
default_pass_scheme = CRYPT
password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = ‘%u‘
user_query = SELECT maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = ‘%u‘
PS:如果mysql服务器是本地主机即host=localhost;如果mysql.sock文件不是默认的/var/lib/mysql/mysql.sock,可以使用host=“sock文件的路径”来指定新位置;如果使用通用二进制安装的mysql 则 connect = host=/tmp/mysql.sock dbname=extmail user=extmail password=extmail
3,接下来重新启动dovecot服务
# service dovecot restart
七,安装Extmail-1.2
1、安装
# tar zxvf extmail-1.2.tar.gz
# mkdir -pv /var/www/extsuite
# mv extmail-1.2 /var/www/extsuite/extmail
# cp /var/www/extsuite/extmail/webmail.cf.default /var/www/extsuite/extmail/webmail.cf
2、修改主配置文件
# vim /var/www/extsuite/extmail/webmail.cf
部分修改选项的说明:
用户可以发送的最大邮件:SYS_MESSAGE_SIZE_LIMIT = 5242880
SYS_USER_LANG = en_US
默认语言选项,可改作:
SYS_USER_LANG = zh_CN
SYS_MAILDIR_BASE = /home/domains
此处即为您在前文所设置的用户邮件的存放目录,可改作:
SYS_MAILDIR_BASE = /var/mailbox
SYS_MYSQL_USER = db_user
SYS_MYSQL_PASS = db_pass
以上两句句用来设置连接数据库服务器所使用用户名、密码和邮件服务器用到的数据库,这里修改为:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_HOST = localhost
指明数据库服务器主机名,这里默认即可
SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password
以上用来指定验正用户登录里所用到的表,以及用户名、域名和用户密码分别对应的表中列的名称;这里默认即可
SYS_AUTHLIB_SOCKET = /var/spool/authdaemon/socket
此句用来指明authdaemo socket文件的位置,这里修改为:
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
PS: 注意mysql使用通用二进制安装时,sock文件在/temp/mysql.sock ;如果extmail的放置路径做了修改,那么配置文件webmail.cf中的/var/www路径必须修改为你所需要的位置。本文使用了默认的/var/www,所以,以上示例中并没有包含路径修改的相关内容。
八,apache相关配置
1,由于extmail要进行本地邮件的投递操作,故必须将运行apache服务器用户的身份修改为您的邮件投递代理的用户;本例中打开了apache服务器的suexec功能,故使用以下方法来实现虚拟主机运行身份的指定。此例中的MDA为postfix自带,因此将指定为postfix用户:
# vim /etc/httpd/conf/httpd.conf
# DocumentRoot "/var/www/html" 取消中心主机
###添加虚拟主机
<VirtualHost *:80>
ServerName mail.luolinux.com
DocumentRoot /var/www/extsuite/extmail/html/
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
#SuexecUserGroup postfix postfix ##查看日志信息tail /var/log/httpd/error_log 如果Apache不支持此功能,注释
</VirtualHost>
User postfix
Group postfix
# httpd -t ###检测语法
2,修改 cgi执行文件属主为apache运行身份用户:
# chown -R postfix.postfix /var/www/extsuite/extmail/cgi/
3,依赖关系的解决
extmail将会用到perl的Unix::syslogd功能,您可以去http://search.cpan.org搜索下载原码包进行安装。
# tar zxvf Unix-Syslog-0.100.tar.gz
# cd Unix-Syslog-0.100
# perl Makefile.PL
# make
# make install
4,重启apache服务
# service httpd restart
九,安装Extman-1.1(邮件后台管理程序)
1、安装及基本配置
# tar zxvf extman-1.1.tar.gz
# mv extman-1.1 /var/www/extsuite/extman
2,修改配置文件以符合本例的需要:
# cp /var/www/extsuite/extman/webman.cf.default /var/www/extsuite/extman/webman.cf
# vim /var/www/extsuite/extman/webman.cf
SYS_MAILDIR_BASE = /home/domains
此处即为您在前文所设置的用户邮件的存放目录,可改作:
SYS_MAILDIR_BASE = /var/mailbox
SYS_DEFAULT_UID = 1000
SYS_DEFAULT_GID = 1000
此两处后面设定的ID号需更改为前而创建的postfix用户和postfix组的id号,本文使用的是2525,因此,上述两项需要修改为:
SYS_DEFAULT_UID = 2525
SYS_DEFAULT_GID = 2525
SYS_MYSQL_USER = webman
SYS_MYSQL_PASS = webman
修改为:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
======================================================================================
或者直接使用webman 再授予用户webman访问extmail数据库的权限
# mysql -uroot
mysql> GRANT all privileges on extmail.* TO webman@localhost IDENTIFIED BY ‘webman‘;
mysql> GRANT all privileges on extmail.* TO webman@127.0.0.1 IDENTIFIED BY ‘webman‘;
mysql> FLUSH PRIVILEGES;
===================================================================
修改
SYS_CAPTCHA_ON = 1 ###是否启用验证码功能
为
SYS_CAPTCHA_ON = 0
3,而后修改cgi目录的属主:
# chown -R postfix.postfix /var/www/extsuite/extman/cgi/
4,在apache的主配置文件中Extmail的虚拟主机部分,添加如下两行:
# vim /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
ServerName mail.luolinux.com
DocumentRoot /var/www/extsuite/extmail/html/
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
#SuexecUserGroup postfix postfix ##查看日志信息tail /var/log/httpd/error_log 如果Apache不支持此功能,注释
</VirtualHost>
5,创建其运行时所需的临时目录,并修改其相应的权限:
# mkdir -pv /tmp/extman
# chown -R postfix.postfix /tmp/extman
# service httpd restart
PS:好了,到此为止,重新启动apache服务器后,您的Webmail和Extman已经可以使用了,可以在浏览器中输入指定的虚拟主机的名称进行访问,如下:http://mail.luolinux.com选择管理即可登入extman进行后台管理了。默认管理帐号为:root@extmail.org 密码为:extmail*123*。
说明:
(1) 如果您安装后无法正常显示验证码,安装perl-GD模块会解决这个问题。如果想简单,您可以到以下地址下载适合您的平台的rpm包,安装即可。
(2) extman-1.1自带了图形化显示日志的功能;此功能需要rrdtool的支持,您需要安装此些模块才可能正常显示图形日志。
本文出自 “珞辰的博客” 博客,请务必保留此出处http://luochen2015.blog.51cto.com/9772274/1761969
在Lamp平台上基于postfix+mysql+dovecot+sasl+courier-authlib+extmail+extman搭建企业级邮件系统
标签:在lamp平台上基于postfix+mysql+dovecot+sasl+courier-authlib+extmail+extman搭建企业级邮件系统
原文地址:http://luochen2015.blog.51cto.com/9772274/1761969