从零学习搭建邮件系统

邮件系统有很多相关的资料,但是通过网上的介绍我自己整理和实践了如下的邮箱搭建过程。

使用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即可

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值