邮件系统有很多相关的资料,但是通过网上的介绍我自己整理和实践了如下的邮箱搭建过程。
使用postfix ,以及extmail. [CentOS7环境下]
首先搭建基础环境Apache + Mysql (此处略~)
网上很多文献在提出编译postfix之前需要安装大量依赖包,我通过实际的安装只是yum install
cyrus-* [postfix的sasl认证]
perl-devel [Unix-Syslog]
openssl-devel [编译postfix时需要,我试过指定路径或添加ld.so.conf都有异常~]
libtool-ltdl-devel [安装courier-authlib时候需要]
先介绍不同的认证方式,可以按照需求安装使用,由于是学习,我就两种都尝试一遍了
认证方式一:cyrus-sasl[2.1.26]
yum安装之后添加一些配置,在/etc/sysconfig/saslauthd 这里面定义sasl的sock位置/var/run/saslauthd,修改MECH=shadow模式,然后新建编辑/etc/sasl2/smtp.conf
pwcheck_method:saslauthd
mech_list:plain login
log_level:3
saslauthd_path:/var/run/saslauthd/mux
然后启动添加自启动并启动 systemctl enable saslauthd.service && systemctl start saslauthd.service
认证方式二:courier-authlib[0.67.0]
需要先安装courier-unicode ,用的版本是[1.4]:./configure && make && make install
然后配置参数,网上好像会禁用部分参数,我没有禁用,主要是加上mysql的支持和配置文件的路径定位
./configure --prefix=/usr/local/courier-authlib
--sysconfdir=/etc
--with-authmysql
--with-mysql-libs=/usr/local/mysql/lib
--with-mysql-includes=/usr/local/mysql/include
--with-authmysqlrc=/etc/authmysqlrc
--with-authdaemonrc=/etc/authdaemonrc
--with-mailuser=postfix
--with-mailgroup=postfix
复制courier.tar包内的courier-authlib.sysvinit到/etc/init.d/courier-authlib 添加可执行权限chmox u+x ;chkconfig --level 2345 courier-authlib on 添加自启动
cp /etc/authdaemonrc.dist /etc/authdaemonrc; cp /etc/authmysqlrc.dist /etc/authmysqlrc
编辑这两份文件
##vim /etc/authdaemonrc##
authmodulelist="authmysql"
#指定认证模块
ahtumodulelistorig="authmysql"
#指定认证原始模块模块
daemons=10
#默认启动进程个数
authdaemonvar=/usr/local/courier-authlib/var/spool/atuhdaemon
#指定socket文件位置。若编译是没指定可以在此修改,注意文件夹要提前创建好
DEBUG_LOGIN=0
#是否启用调试。0表示不启用,1表示启用,2表示启用同时记录密码
##vim /etc/authmysqlrc##
MYSQL_SERVER localhost
MYSQL_PORT 3306
#mysql地址和端口
MYSQL_USERNAME extmail
#指定连接mysql的账号
MYSQL_PASSWORD extmail 指定账号的密码
MYSQL_SOCKET /usr/local/mysql/mysqld.sock
#指定mysql套接字位置可以编辑/etc/my.cnf修改
MYSQL_UID_FIELD
MYSQL_GID_FIELD
#postfix设置uid和gid号
MYSQL_LOGIN_FIELD username
MYSQL_CRYPT_PWFIELD password
MYSQL_DATABASE extmail
MYSQL_USER_TABLE mailbox
MYSQL_HOME_FIELD concat('/var/mailbox/',homedir)
#指定用户家目录的位置。虚拟用户是没有家目录,所以和邮箱目录保持一致,contcat()是mysql的函数,作用是将括号内的内容连接起来。
MYSQL_NAME_FIELD name
#指定用户名称的字段
MYSQL_MAILDIR_FIELD concat('/var/mailbox/',maildir)
#指定用户邮箱目录的位置。
然后修改/usr/lib64/sasl2/smtpd.conf
pwchech_menthod: authdaemond
mech_list: PLAIN LOGIN
log_level:3
authdaemond_path=/usr/local/courier-authlib/var/spool/authdaemon/socket
Postfix[3.1.5]
先删除系统的自带的postfix服务和禁用系统的sendmail服务
删除系统的原有的postfix和postdrop用户,并建立新的postfix和postdrop
userdel postfix ;groupdel postfix;groupadd -g 2525 postfix ; useradd -s /sbin/nologin -M -g postfix -u 2525 postfix
userdel postdrop ;groupdel postdrop;groupadd -g 2526 postdrop ; useradd -s /sbin/nologin -M -g postdrop-u 2526 postdrop
postfix的编译是没有configure的,所以一开始会让用习惯了configure的人一头雾水,通过<postfix权威指南>一书也学习到
可以通过如下方式编译
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 -lrt -L/usr/lib64/sasl2 -lsasl2 -lssl -lcrypto'
这里的sasl就是cyrus-sasl,对应的include和lib路径要按照实际修改,我在这里有过两三个报错
①usr/bin/ld: cannot find -lxxx 问题,解决方案是安装对应的devel包,或者你已经编译好了就修改/etc/ld.so.conf
②openssl/opensslv.h no such file or directory问题,我之前的openssl是编译的也有添加shared参数,但是好像连接对应include和lib还是无法识别,所以我yum install openssl-devel解决了
③mysql.h no such file or directory问题,很明显啦,这个问题就是找不到mysql对应include目录,因为我的mysql是cmake编译的5.6版本,后来重新修改了编译参数里的路径正常
make && make install
这里会有一段交互,一般除了第二个修改/tmp/postfix其他可以使用默认,你也可以按照需要设置,如果此处没有默认选项给你的话,那么证明编译postfix时无法读取到mysql的lib,解决办法是修改ld.so.conf添加mysql的路径
编译完之后修改postfix的main.cf配置,配置项实在很多,这里只是节选部分个人测试用的配置选项
拷贝备份原有main.cf,然后postconf -n > main.cf,将postfix的配置去掉相关注释只留下有用的部分[方便修改和查看]
学习用的配置,不适合用于生产,而且注释的中文源自我自己的理解如果有错请谅解
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
html_directory = no
mailq_path = /usr/bin/mailq
manpage_directory = /usr/local/man
meta_directory = /etc/postfix
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
shlib_directory = no
alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
debugger_command =PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin xxgdb $daemon_directory/$process_name $process_id & sleep 5
debug_peer_level = 2
compatibility_level = 2
#兼容性等级
unknown_address_reject_code = 450
#返回给客户端的错误代码
unknown_local_recipient_reject_code = 550
#寄给不存在用户的响应码
local_recipient_maps =
#发给本域不存在用户时转发至何处
bounce_queue_lifetime = 1d
#重新投递最长时间
maximal_queue_lifetime = 1d
#放弃投递邮件在队列中的生存时间
disable_dns_lookups = no
#不通过dns MX记录查询收信网域
mail_name = Postfix
mail_owner = postfix
myhostname = mail.youngyuyeah.com
mydomain = youngyuyeah.com
myorigin = $mydomain
#只输入user时候默认补充的本邮件域
mynetworks = 192.168.0.0/16,127.0.0.0/8
mynetworks_style = subnet
#networks和networks_style同时设置时networks优先
mydestination = $mydomain,$myhostname,localhost,$mynetworks
#接收哪些域的邮件
relay_domains = $mydomain
#转发域
inet_interfaces = all
inet_protocols = ipv4
#home_mailbox = Maildir/
#可以发送到对应用户的mail目录中
message_size_limit = 15728640
#限制邮件最大长度
mailbox_size_limit = 15728640
#用户mailbox超过此大小就不接收邮件
main.cf使用sasl认证
学习用的配置,不适合用于生产,而且注释的中文源自我自己的理解如果有错请谅解
smtpd_banner = $myhostname ESMTP unknow
smtpd_sasl_auth_enable = yes
#使用sasl认证
broken_sasl_auth_clients = yes
#解决部分不兼容问题
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
#不使用匿名认证
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_non_fqdn_hostname,
reject_unauth_destination,
reject_unauth_pipelining,
reject_invalid_hostname,
#reject_sender_login_mismatch,
#reject_authenticated_sender_login_mismatch,
#permit_mynetwork:只要收件人在mynetworks中就可以转发
#permit_sasl_authenticated:转发通过sasl认证的邮件
#reject_unauth_destination:拒绝转发未信任域
#reject_unauth_pipelining:禁止非授权客户端使用pipelining
#*non_fqdn*:非RFC要求的FQND(域名)返回REJECT
#reject_invalid_hostname:提供无效主机名返回REJECT
#*login*:与$smtpd_sender_owner_maps匹配的规则
然后postfix reload重新读取配置即可
main.cf建立虚拟域和虚拟用户并使用courier-authlib认证
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
message_size_limit = 14336000
#邮件大小显示
virtual_mailbox_limit = 20971520
#邮箱大小限制
mysql_virtual*文件在extman/docs有,cp过来并且按照实际修改即可,下面介绍extmail的搭建会说
然后使用postfix check检查配置并且postfix start看能否启动
启动的时候我这边也遇到一两个报错情况
①postsuper: fatal: scan_dir_push: open directory defer: Permission denied,对应的文件夹/var/lib/postfix或/var/spool/postfix的某些权限设置有误,根据实际设置好
②postfix: warning: smtputf8_enable is true, but EAI support is not compiled in,我配置两台机测试,其中一个没有这样的问题,如果出现了,可以使用postconf -e “smtputf8_enable=no”解决
extmail[1.2] extman[1.1]
这两个包不用安装,解压就可以使用,解压在/usr/local/mail下,然后
cp /usr/local/mail/extmail/webmail.cf.default /usr/local/mail/extmail/webmail.cf.default;
cp /usr/local/mail/extman/webman.cf.default /usr/local/mail/extman/webman.cf.default
修改webmail.cf
SYS_MESSAGE_SIZE_LIMIT = 5242880
用户可以发送的最大邮件
SYS_SESS_DIR=/tmp/extmail
#用户的session保存的位置
SYS_UPLOAD_TMPDIR=/tmp/extmail/upload
SYS_USER_LANG = zh_CN
SYS_MIN_PASS_LEN = 8
#最短密码长度
SYS_MAILDIR_BASE = /var/mailbox
#此处即为前文所设置的用户邮件的存放目录
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
#设置连接数据库的用户名和密码
SYS_MYSQL_SOCKET = /usr/local/mysql/mysqld.sock
SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password
以上用来指定验正用户登录里所用到的表,以及用户名、域名和用户密码分别对应的表中列的名称
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
#authdaemon socket文件的位置
修改webman.cf
SYS_MAILDIR_BASE = /var/mailbox
SYS_DEFAULT_UID = 2525
SYS_DEFAULT_GID = 2525
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_SOCKET = /usr/local/mysql/mysqld.sock
然后建立对应的目录mkdir -p /tmp/extmail/upload ;chown -R postfix:postfix /tmp/extmail
mkdir -p /tmp/extman ;chown -R postfix:postfix /tmp/extman
顺便修改extmail extman的属主为postfix
配置Apache的httpd.conf
User postfix
Group postfix
#DocumentRoot "/usr/local/apache/htdocs" #注释关闭中心主机,开户虚拟主机
<VirtualHost *:80>
ServerName mail.youngyuyeah.com
DocumentRoot /usr/local/mail/extmail/html/
ScriptAlias /extmail/cgi /usr/local/mail/extmail/cgi
Alias /extmail /usr/local/mail/extmail/html
ScriptAlias /extman/cgi /usr/local/mail/extman/cgi
Alias /extman /usr/local/mail/extman/html
</VirtualHost>
导入extman的数据库和复制postfix main.cf配置使用到的几个mysql*.cf文件
cp extman/docs/mysql_virtual* /etc/postfix/ 然后mysql -u root -p </usr/local/mail/extman/docs/extmail.sql和init.sql,如果这里导入失败,可能是mysql5.6以上版本开启了严格模式,不允许插入的模式加上新用户,修改/etc/my.cnf 注释掉sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,然后重启mysql再尝试导入,导入之后修改权限grant all privileges on extmail.* to extmail@localhost identified by 'extmail';(谨慎点可以加多一个extmail@127.0.0.1的)
检查数据库文件是否正常,然后启动apache,默认管理员账户为root@extmail.org密码为extmail*123*,进行登录尝试
①如果这里显示异常403或404,可能是apache的目录配置异常,目录的对应权限没有修改好
②提示Unix-Syslog错误的话就需要安装Unix-Syslog,这个包使用perl Makefile.PL && make && make install,如果装不上可能是缺少perl-devel,yum install perl-devel即可
③安装了Unix-Syslog,然后提示/etcman/libs/Ext/Utils.pm line59的一个报错,编辑index.cgi去掉#/usr/bin/perl -wT的T即可