SMTP全称是Simple Mail Transfer Protocol,直译过来就是简单邮件传输协议, 由RFC5321定义.主要的工作就是把邮件信息从发件人的邮件服务器中传送到接收人的邮件服务器中,偶尔我们使用MUA来发送邮件的话,也承载传输用户邮件到发件服务器的功能, 因而也称作推协议,顺带提一下,SMTP协议的出现是比HTTP还早的,最早在1982年中发布第一版的RFC.
因而因为提出的年代久远,所以在当时有许多问题都考虑不全面并且也有这许多的限制,例如SMTP要求信息内容需要是7位的ASCII来承载,因而我们在发送以及接受的时候,都需要将其编码解码.
另外,SMTP还存在一个问题就是没有对发送方进行一个身份验证,虽然在早期的互联网环境没有很大问题,但是在垃圾邮件满天飞的今天,这却是一个明显的短板.因而衍生出了SPF, DKIM, DMARC等一系列用来验证发件人身份的方法.
POP3,Post Office Protocol Version 3,直译就是邮局协议第三版,由RFC1939进行定义.这个协议的主要服务于用户管理邮件服务器上面的电子邮件.具体过程是:当外来邮件发送到收件人的邮件服务器上时,收件人可以使用邮件客户端连接邮件服务器,把未阅读的邮件服务器以及部分信息拉取回本地进行处理.在拉取的过程中,我们可以选择拉取完删除以及拉取完不删除两种方式,不过现在默认一般都是拉取完不删除,方便我们在其他的地方也能对邮件进行阅读以及管理.
IMAP, Internet Message Access Protocol, 直译过来就是网络信息访问协议,可能和现在主流的翻译不太一致,不过能理解其意思就好.相对于pop3协议所有邮件的管理都需要下载下来进而管理,IMAP提供了用户远程访问邮件服务器的途径,因而通过IMAP,用户可以直接管理邮件服务器上的邮件.
Sender Policy Framework,直译过来就是发件人保证框架.出现的主要原因是SMTP协议的缺陷.XMTP中,发件人的邮箱地址是可以伪造的,因而SPF的出现就是防止伪造发件人.SPF的记录实际上就是DNS服务器上面的一个记录.如果邮件服务器收到了一封邮件,来自主机的IP是45.76.210.63并且生成发件人为yusengy@info.邮件服务器会去查询yusengy@info的SPF记录.如果SPF记录的IP为45.76.210.63,那么就认为是合法的,否则通常都会被退信.
DomainKeys Identified Mail.功能目的与SPF相似,主要是让收件人可以通过加密解密的方式来得知发件人是否是真实的.原理就是在电子邮件的开头插入一段签名,然后接收方通过从DNS查询得到公钥以后,以进行验证,与SSH的公钥和密钥类似.
反向域名解析,可以通过发件人的IP地址反向得知域名,也是一种用以判断发件人是否正常的方式.
Mail User Agent.用户邮件代理,用户通过MUA接收发送邮件.例如Outlook, formail等.
Mail Transfer Protocol.邮件传输代理,是SMTP的一种实现.常用的MTA有sendmail,Postfix.本例中使用Postfix.MTA仅仅负责邮件的传输,MDA负责把接收到的邮件保存在硬盘中.
Mail Deliver Agent,邮件分发代理.负责将接收到的邮件保存在邮件服务器上.sendmail以及Postfix默认使用的MDA是procmail.
Mail Receive Agent,邮件接收代理,用来实现IMAP,POP3协议,负责与MUA交互,将服务器上的邮件通过IMAP以及POP3传输给客户端.本例中使用的MRA是Dovecot.
Local Mail Transfer Protocol.本地邮件传输协议,是SMTP协议的扩展.本例中用与同一主机内邮件传输.
一个开源的MTA服务器,负责通过SMTP协议管理发送到本机的邮件以及由本机向外发送的邮件.与sendMail相似.现今流行的服务器套件例如Zimbra,IRedMail内部都采用Postfix作为MTA.
一个开源的IMAP以及POP3服务器.通常工作是验证用户身份以及邮件的处理.
存取用户信息,监听的域名信息,用户邮箱地址以及登录密码等.
postfix:实现SMTP协议,用于发件
dovecot:实现POP3和IMAP协议,用于收件
Cyrus-SASL函数库:用于用户认证
courier-authlib:使用MySQL数据库中的表进行身份验证
extmail和extman:提供webmail
邮件原理
这里我们使用的MTA是Postfix, MRA是Dovecot.我们可以绘制出邮件服务器接受邮件,用户查收邮件以及用户发送邮件的过程.
假设[email protected]发送一封邮件到[email protected]中.
邮件服务器接受邮件
foxmail.com服务器会通过DNS查询到yusengy.info的MX记录,然后找到Postfix所在的服务器所在.
邮件通过SMTP协议发送给Postfix.
Postfix通过MySQL查询,yusengy.info是否是本机需要处理的域名.
MySQL通过查询返回确认信息给Postfix.
Postfix得到确认信息,把邮件传送给Dovecot,由Dovecot的LMTP服务来说投递工作.
Dovecot把邮件的内容保存在对应的路径中.
用户查收邮件过程
用户查收邮件过程
MUA向Dovecot请求IMAP连接.
Dovecot发送自己的SSL证书.
MUA发送用户的账号密码.
Dovecot得到账号密码向MySQL查询.
MySQL返回查询结果.
如果账号密码正确,Dovecot读取在改用户路径下的信息.
得到最新的邮件以及其他的一些统计信息.
通过IMAP协议发送给MUA.
用户发送邮件的过程
用户发送邮件过程
MUA请求Postfix建立SMTP连接
Postfix发送SSL证书给MUA
MUA发送账号密码给Postfix,请求验证
Postfix请求Dovecot验证账号密码.
Dovecot请求MySQL查询结果
MySQL返回查询结果.
Dovecot返回Postfix账号密码验证结果.
Postfix返回MUA账号密码验证结果.
MUA使用SMTP协议发送邮件到Postfix.
Postfix把邮件进行发送.接下来的步骤参考前面服务器查收邮件的过程.
结构图
主机名:mail.insigmail.com
域名:insigmail.com
关闭selinux
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]#
关闭firewalld
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -X
[root@localhost ~]# iptables -nvL
安装wget、mysql、epel
yum install -y wget
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum install nginx vim gcc gcc-c++ openssl openssl-devel db4-devel ntpdate mysql mysql-devel mysql-server bzip2 php-mysql cyrus-sasl-md5 perl-GD perl-DBD-MySQL perl-GD perl-CPAN perl-CGI perl-CGI-Session cyrus-sasl-lib cyrus-sasl-plain cyrus-sasl cyrus-sasl-devel libtool-ltdl-devel telnet mail libicu-devel -y
1.卸载系统自带的postfix,并删除postfix用户,重新指定uit gid创建新用户postfix,postdrop
yum remove postfix -y
userdel postfix
groupdel postdrop
groupadd -g 2525 postfix
useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
groupadd -g 2526 postdrop
useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop
2.下载源码包并解压编译
cd /usr/local/src/
wget http://cdn.postfix.johnriley.me/mirrors/postfix-release/official/postfix-3.2.5.tar.gz
tar -zxvf postfix-3.2.5.tar.gz
cd postfix-3.2.5.tar.gz
make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS ' 'AUXLIBS=-L/usr/lib64/mysql -lmysqlclient -lz -lrt -lm -L/usr/lib64/sasl2 -lsasl2 -lssl -lcrypto'
make && make install
更改第二项临时文件目录为:/tmp/extmail,其他一路回车
3.更改目录的属主和属组:
chown -R postfix:postdrop /var/spool/postfix
chown -R postfix:postdrop /var/lib/postfix/
chown root /var/spool/postfix
chown -R root /var/spool/postfix/pid
4.修改postfix的配置文件:
[root@localhost ~]# vim /etc/postfix/main.cf
myhostname = mail.bk.sh //设置主机名
mydomain = bk.sh //指定域名
myorigin = $mydomain //指明发件人所在的域名
inet_interfaces = all //指定postfix系统监听的网络接口
mydestination = $myhostname, localhost.$mydomain, localhost,$mydomain //指定postfix接收邮件时收件人的域名 [使用虚拟域需要禁用]
mynetworks_style = host //指定信任网段类型
mynetworks = 192.168.77.1/24, 127.0.0.0/8 //指定信任的客户端
relay_domains = $mydestination //指定允许中转邮件的域名
alias_maps = hash:/etc/aliases //设置邮件的别名
5.在/etc/init.d/目录下创建脚本,控制postfix
[root@localhost /var/www/extsuite/extman]# vim /etc/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 $?
6.为脚本添加权限并添加到开机启动项中
[root@localhost /var/www/extsuite/extman]# chmod +x /etc/init.d/postfix
[root@localhost /var/www/extsuite/extman]# chkconfig --add postfix
[root@localhost /var/www/extsuite/extman]# chkconfig postfix on
[root@localhost /var/www/extsuite/extman]# chown postfix.postfix -R /var/lib/postfix/
[root@localhost /var/www/extsuite/extman]# chown postfix.postfix /var/spool/ -R
yum安装
[root@localhost ~]# yum install -y dovecot dovecot-mysql
配置dovecot:
[root@localhost ~]# cd /etc/dovecot/
[root@localhost dovecot]# vim dovecot.conf //直接在配置文件最后添加即可
protocols = imap pop3
!include conf.d/*.conf
listen = *
base_dir = /var/run/dovecot/
[root@localhost dovecot]# cd conf.d/
[root@localhost conf.d]# vim 10-auth.conf
disable_plaintext_auth = no
[root@localhost conf.d]# vim 10-mail.conf
mail_location = maildir:~/Maildir
mail_location = maildir:/var/mailbox/%d/%n/Maildir
mail_privileged_group = mail
[root@localhost conf.d]# vim 10-ssl.conf
ssl = no
[root@localhost conf.d]# vim 10-logging.conf
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot.info
log_timestamp = "%Y-%m-%d %H:%M:%S "
[root@localhost conf.d]# cp auth-sql.conf.ext auth-sql.conf
[root@localhost conf.d]# vim auth-sql.conf
passdb {
driver = sql
# Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
编辑dovecot通过mysql认证的配置文件:
[root@localhost conf.d]# 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'
下载解压并编译
[root@localhost ~]# cd /usr/local/src/
[root@localhost /usr/local/src]# wget https://sourceforge.net/projects/courier/files/authlib/0.69.0/courier-authlib-0.69.0.tar.bz2
[root@localhost /usr/local/src]# tar xf courier-authlib-0.69.0.tar.bz2
下载courier-unicode-1.2编译安装
[root@localhost ~]# wget https://sourceforge.net/projects/courier/files/courier-unicode/2.1/courier-unicode-2.1.tar.bz2
[root@localhost ~]# tar jxvf courier-unicode-2.1.tar.bz2
[root@localhost ~]# cd courier-unicode-2.1
[root@localhost courier-unicode-1.2]# ./configure
[root@localhost courier-unicode-1.2]# make && make install
编译courier-anthlib
[root@localhost /usr/local/src]# cd courier-authlib-0.69.0/
[root@localhost /usr/local/src/courier-authlib-0.66.2]# ./configure --prefix=/usr/local/courier-authlib --sysconfdir=/etc --without-authpam --without-authshadow --without-authvchkpw --without-authpgsql --with-authmysql --with-mysql-libs=/usr/lib64/mysql --with-mysql-includes=/usr/include/mysql --with-redhat --with-authmysqlrc=/etc/authmysqlrc --with-authdaemonrc=/etc/authdaemonrc --with-mailuser=postfix --with-mailgroup=postfix
[root@localhost /usr/local/src/courier-authlib-0.66.2]# make && make install
配置courier-authlib:
[root@localhost courier-authlib-0.66.2]# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
[root@localhost courier-authlib-0.66.2]# cp /etc/authdaemonrc.dist /etc/authdaemonrc
[root@localhost courier-authlib-0.66.2]# cp /etc/authmysqlrc.dist /etc/authmysqlrc
[root@localhost courier-authlib-0.66.2]# vim /etc/authdaemonrc //配置文件里的验证方法比较多,我们这里只使用authmysql
authmodulelist="authmysql"
authmodulelistorig="authmysql"
[root@localhost courier-authlib-0.66.2]# vim /etc/authmysqlrc //直接添加到配置文件尾部,然后去上面将响应系统默认的注视掉,或者删除即可
MYSQL_SERVER localhost
MYSQL_USERNAME extmail
MYSQL_PASSWORD extmail
MYSQL_SOCKET /var/lib/mysql/mysql.sock
MYSQL_PORT 3306
MYSQL_DATABASE extmail
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
DEFAULT_DOMAIN test.com
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)
courier-authlib添加启动脚本及其他:
[root@localhost courier-authlib-0.66.2]# cp courier-authlib.sysvinit /etc/init.d/courier-authlib
[root@localhost courier-authlib-0.66.2]# chmod +x /etc/init.d/courier-authlib
[root@localhost courier-authlib-0.66.2]# chkconfig --add courier-authlib
[root@localhost courier-authlib-0.66.2]# chkconfig courier-authlib on
[root@localhost courier-authlib-0.66.2]# echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf
[root@localhost courier-authlib-0.66.1]# ldconfig
[root@localhost courier-authlib-0.66.1]# service courier-authlib start
Starting Courier authentication services: authdaemond
smtp以及虚拟用户相关的设置:
[root@localhost ~]# vim /usr/lib64/sasl2/smtpd.conf //文件不存在,要自己创建
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
[root@localhost ~]# vim /etc/postfix/main.cf
##postfix支持SMTP##
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = ''
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
broken_sasl_auth_clients=yes
smtpd_client_restrictions = permit_sasl_authenticated
smtpd_sasl_security_options = noanonymous
##postfix支持虚拟用户##
virtual_mailbox_base = /var/mailbox
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf //这里的配置文件需在后面extman
里复制过来
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
下载extmail和extman:
[root@localhost ~]# cd /usr/local/src/
从百度网盘下载extmail-1.2.tar.gz和 extman-1.1.tar.gz
创建站点目录并解压、重命名extmail包
[root@localhost /usr/local/src]# mkdir -p /var/www/extsuite
[root@localhost /usr/local/src]# tar -zxvf extmail-1.2.tar.gz -C /var/www/extsuite/
[root@localhost /usr/local/src]# mv /var/www/extsuite/extmail-1.2/ /var/www/extsuite/extmail
更改extmail的配置文件:
[root@localhost ~]# cd /var/www/extsuite/extmail
[root@localhost extmail]# cp webmail.cf.default webmail.cf
[root@localhost extmail]# vim webmail.cf
SYS_SESS_DIR = /tmp/extmail
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_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.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
建立临时文件目录与session目录,并更改权限:
[root@localhost extmail]# mkdir -p /tmp/extmail/upload
[root@localhost extmail]# chown -R postfix.postfix /tmp/extmail/
到extmail的下载目录下,解压extman包:
[root@localhost ~]# cd /usr/local/src/
[root@localhost /usr/local/src]# tar -zxvf extman-1.1.tar.gz -C /var/www/extsuite/
[root@localhost /usr/local/src]# cd /var/www/extsuite/
[root@localhost /var/www/extsuite]# mv extman-1.1/ extman
拷贝extman的配置文件:
[root@localhost /var/www/extsuite]# cd extman/
[root@localhost /var/www/extsuite/extman]# cp webman.cf.default webman.cf
更改cgi目录的属主属组:
[root@localhost /var/www/extsuite/extman]# chown -R postfix.postfix /var/www/extsuite/extman/cgi/
[root@localhost /var/www/extsuite/extman]# chown -R postfix.postfix /var/www/extsuite/extmail/cgi/
加载数据到数据库中,同时修改TYPE为ENGINE 数据库的文件是
sed -i 's/TYPE/ENGINE/g' extmail.sql
启动mysql
service mysql restart
导入数据库
mysql -uroot < extmail.sql
mysql -uroot < init.sql
创建一个mysql用户并授予权限:
[root@localhost /var/www/extsuite/extman]# mysql -uroot
mysql> GRANT ALL ON extmail.* to extmail@'%' identified by 'extmail'; //我这里是直接授予全部权限在任意的IP地址上了,实际情况根据需求而定
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
复制之前的配置文件:
[root@localhost ~]# cd /var/www/extsuite/extman/docs/
[root@localhost /var/www/extsuite/extman/docs]# cp mysql_virtual_* /etc/postfix/
为extman创建临时目录:
[root@localhost /var/www/extsuite/extman/docs]# mkdir /tmp/extman
[root@localhost /var/www/extsuite/extman/docs]# chown -R postfix.postfix /tmp/extman/
启动postfix、dovecot、saslauthd服务,并查看进程是否正常:
[root@localhost /var/www/extsuite/extman]# service postfix start
Starting postfix (via systemctl): [ 确定 ]
[root@localhost /var/www/extsuite/extman]# ps aux |grep postfix
root 63586 0.0 0.1 95392 2160 ? Ss 01:29 0:00 /usr/libexec/postfix/master -w
postfix 63587 0.0 0.2 95448 3808 ? S 01:29 0:00 pickup -l -t unix -u
postfix 63588 0.0 0.2 95496 3816 ? S 01:29 0:00 qmgr -l -t unix -u
root 63592 0.0 0.0 112680 976 pts/0 S+ 01:33 0:00 grep --color=auto postfix
[root@localhost /var/www/extsuite/extman]# ss -tnluo | grep :25
tcp LISTEN 0 100 *:25 *:*
[root@localhost /var/www/extsuite/extman]# service dovecot start
Redirecting to /bin/systemctl start dovecot.service
[root@localhost /var/www/extsuite/extman]# ps aux |grep dovecot
root 63834 0.3 0.0 15652 1484 ? Ss 02:15 0:00 /usr/sbin/dovecot -F
dovecot 63837 0.0 0.0 9320 1012 ? S 02:15 0:00 dovecot/anvil
root 63838 0.0 0.0 9448 1164 ? S 02:15 0:00 dovecot/log
root 63840 0.0 0.1 12464 2196 ? S 02:15 0:00 dovecot/config
root 63842 0.0 0.0 112680 972 pts/0 S+ 02:15 0:00 grep --color=auto dovecot
[root@localhost /var/www/extsuite/extman]# systemctl start saslauthd
[root@localhost /var/www/extsuite/extman]# ps aux |grep saslauthd
root 63131 0.0 0.0 69648 916 ? Ss 01:19 0:00 /usr/sbin/saslauthd -m /run/saslauthd -a pam
root 63132 0.0 0.0 69648 676 ? S 01:19 0:00 /usr/sbin/saslauthd -m /run/saslauthd -a pam
root 63133 0.0 0.0 69648 676 ? S 01:19 0:00 /usr/sbin/saslauthd -m /run/saslauthd -a pam
root 63134 0.0 0.0 69648 676 ? S 01:19 0:00 /usr/sbin/saslauthd -m /run/saslauthd -a pam
root 63135 0.0 0.0 69648 676 ? S 01:19 0:00 /usr/sbin/saslauthd -m /run/saslauthd -a pam
root 63144 0.0 0.0 112680 972 pts/0 S+ 01:20 0:00 grep --color=auto saslauthd
[root@localhost /var/www/extsuite/extman]# ps aux |grep courier-authlib
root 61661 0.0 0.0 4316 444 ? S 00:07 0:00 /usr/local/courier-authlib/sbin/courierlogger -pid=/usr/local/courier-authlib/var/spool/authdaemon/pid -start /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
root 61662 0.0 0.0 35512 1796 ? S 00:07 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
root 61663 0.0 0.0 35512 468 ? S 00:07 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
root 61664 0.0 0.0 35512 468 ? S 00:07 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
root 61665 0.0 0.0 35512 468 ? S 00:07 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
root 61666 0.0 0.0 35512 468 ? S 00:07 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
root 61667 0.0 0.0 35512 468 ? S 00:07 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
root 63660 0.0 0.0 112680 980 pts/0 S+ 02:00 0:00 grep --color=auto courier-authlib
测试虚拟用户:
[root@localhost courier-authlib-0.66.2]# /usr/local/courier-authlib/sbin/authtest -s login [email protected] extmail
Authentication succeeded. //显示这个表示成功,测试时使用的是[email protected],因为我们导入的数据库init.sql里面自带了这个。
Authenticated: [email protected] (uid 2525, gid 2525)
Home Directory: /var/mailbox/extmail.org/postmaster //这里需要注意/var/mailbox这个目录现在我们还没有创建,后面web访问的时候如果没有会报错,所以提前创建。
Maildir: /var/mailbox/extmail.org/postmaster/Maildir/
Quota: (none)
Encrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0
Cleartext Password: extmail
Options: (none)
[root@localhost courier-authlib-0.66.2]# mkdir /var/mailbox
[root@localhost courier-authlib-0.66.2]# chown -R postfix.postfix /var/mailbox/
测试smtp发信:
[root@localhost ~]# printf "[email protected]" | openssl base64
cG9zdG1hc3RlckBleHRtYWlsLm9yZw==
[root@localhost ~]# printf "extmail" | openssl base64
ZXh0bWFpbA==
[root@localhost ~]# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.daen.com ESMTP Postfix
auth login
334 VXNlcm5hbWU6
cG9zdG1hc3RlckBleHRtYWlsLm9yZw==
334 UGFzc3dvcmQ6
ZXh0bWFpbA==
235 2.7.0 Authentication successful //成功
quit
221 2.0.0 Bye
Connection closed by foreign host.
vim /etc/httpd/conf/httpd.conf
#第119行,注释中心主机
#DocumentRoot "/var/www/html"
#修改用户与组为postfix
User postfix
Group postfix
结尾加上虚拟主机配置
ServerName mail.zhongdianjizhi.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
chown -R postfix.postfix /var/www/extsuite/extmail/cgi/
chown -R postfix.postfix /var/www/extsuite/extman/cgi/
httpd -t
tar xf Unix-Syslog-1.1.tar.gz
cd Unix-Syslog-1.1/
perl Makefile.PL
make && make install
systemctl start httpd
默认用户名:[email protected]
默认密码:extmail*123*
说明:MX记录值的最后有一个点,代表主机名结束。在有些域名服务商网站设置的时候不会自动帮您加上,如果漏掉的话 DNS 服务器在解析的时候,会自动并上你的域名,这样会引起解析错误。如果 MX 记录设置的值为主机名或是域名,则需要增加对应的 A 记录。例如我们MX记录的值设置的是 mail.insigmail.com 则需要增加一条相应的 A 记录
SPF 记录是一种域名服务 (DNS) 记录,可确定允许哪些邮件服务器代表您的域来发送电子邮件。
SPF的设置选项可以参考:http://www.openspf.org/SPFRecordSyntax
这里说几个常用的:
例如:v=spf1 a mx -all,则表示允许A记录和MX记录IP收发邮件。添加的方法是在域名DNS解析设置一个txt记录,主机记录为空或者@,记录值为v=spf1 a mx -all,其他可以忽略。我这里设置的是:v=spf1 ip4:220.191.249.136 -all
DomainKeys Identified Mail的缩写,域名密钥识别邮件标准。
向你的 CentOS 添加 EPEL 库 , Extra Packages for Enterprise Linux (EPEL) :: Fedora Docs 可以在这里寻找适合你操作系统的库
下载安装EPEL:
wget install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh epel-release-latest-7.noarch.rpm
安装opendkim:
yum install opendkim
生成DKIM key (修改红色部分域名)
# 请替换下面的域名export domain=insigmail.com
mkdir /etc/opendkim/keys/$domain
cd /etc/opendkim/keys/$domain
opendkim-genkey -d $domain -s default
chown -R opendkim:opendkim /etc/opendkim/keys/$domain
echo "default._domainkey.$domain $domain:default:/etc/opendkim/keys/$domain/default.private" >> /etc/opendkim/KeyTable
echo "*@$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
生成之后打开/etc/opendkim/keys/domain.com/default.txt,里面就是DKIM key,需要添加到DNS,主机记录为default._domainkey,记录值为括号里面的(去掉引号)。
将这段填入域名记录值v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDnY13M6hQgOH+3MAQ8/d/7weJSlq0AYaqx6ZtmCHezteHR84Q93pqhlDuBCWDNIqL4MZh7KqJuSqxtFNgWEXaEp/Lv9myUbbJQAChgy7ELS/cr37bF0Hi0kzOO9qkbTDb9NFr2LBj8JivbogLG91eA9E3Q4kpgWRinHRtR25Kc3QIDAQAB
修改openDKIM设置
vi /etc/opendkim.conf
1. 将Mode 改为 Mode sv 2. 将Domain 改为 Domain lomu.me(lomu.me是之前设置的域名) 3. 将所有变量前面的#去掉,但是KeyFile、Statistics加上# 4. 再把SigningTable /etc/opendkim/SigningTable改成SigningTable refile:/etc/opendkim/SigningTable,KeyTable /etc/opendkim/KeyTable改成KeyTable refile:/etc/opendkim/KeyTable
设置Postfix
vi /etc/postfix/main.cf
加上下面幾行# opendkim setup
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891
milter_default_action = accept
重启服务
service opendkim restart
service postfix restart
chkconfig opendkim on
PS: 第一次启动如果出现 Generating default DKIM keys: hostname: Unknown host 可以在 /etc/hosts 上面加上域名,例如:
127.0.0.1 lomu.me localhost localhost.localdomain localhost4 localhost4.localdomain4
DMARC协议是有效解决信头From伪造而诞生的一种新的邮件来源验证手段,为邮件发件人地址提供强大保护,并在邮件收发双方之间建立起一个数据反馈机制。
具体信息可以看这里:Overview – dmarc.org。
DMARC记录中常用的参数解释
p:用于告知收件方,当检测到某邮件存在伪造我(发件人)的情况,收件方要做出什么处理,处理方式从轻到重依次为:none为不作任何处理;quarantine为将邮件标记为垃圾邮件;reject为拒绝该邮件。初期建议设置为none。
rua:用于在收件方检测后,将一段时间的汇总报告,发送到哪个邮箱地址。
ruf:用于当检测到伪造邮件时,收件方须将该伪造信息的报告发送到哪个邮箱地址。
例如v=DMARC1;p=reject;rua=[email protected],意思是拒绝伪造邮件,并且将一段时间的汇总报告发送给我。
添加到DNS
添加TXT记录,主机名:_dmarc,记录值:v=DMARC1;p=quarantine;[email protected]
PTR记录,是电子邮件系统中的邮件交换记录的一种;另一种邮件交换记录是A记录(在IPv4协议中)或AAAA记录(在IPv6协议中)。PTR记录常被用于反向地址解析。
PTR记录也就是IP反向解析,我们常见的解析都是将域名A记录解析到IP,PTR则是将IP反向解析到对应的域名,通过设置PTR可以提高发信方的信誉,从而提高到达率。
PTR设置
通过观察,一般国外的VPS都会直接将购买的时候的hostname设置为PTR记录值,但是我买的阿里云的并没有,所以这个需要提交售后工单要求客服帮你添加的,添加的值为安装postfix的时候设置的myhostname,例如我的是mail.insigmail.com。
添加好了以后可以通过以下命令查看
dig -x IP
如果看到了PTR记录为你的域名那就说明成功了
到这里,基本上只要不发垃圾邮件,邮件的到达率应该就没啥问题了。
这里给大家推荐一个测试工具:Newsletters spam test by mail-tester.com,只要给页面上的邮箱随便发一封邮件,然后点击按钮提交就可以看到测试结果,里面会有一些优化建议,非常好用。
1.登陆报错
Can't open /tmp/extman/xxxxxxxx, No such file or directory
超找原因,是因为系统因为自动清理了/tmp下的extman文件,找不到文件,
两种办法。
1.在tmp下创建一个extman,并修改权限为777即可,这种办法是临时的。
2.还有一种永久解决这个问题
修改vi /var/www/extsuite/extman/webman.cf
里面的SYS_SESS_DIR即可
SYS_SESS_DIR = /var/www/extsuite/extman/session
同时记得修改权限
[root@localhost ~]# chmod 777 /var/www/extsuite/extman/session
如果是extmail登陆报错,修改/var/www/extsuite/extmail/webmail.cf里面的
SYS_SESS_DIR即可
nsecure dependency in sprintf while running with -T switch at /usr/local/lib/perl5/site_perl/5.14.2/mach/Unix/Syslog.pm line 59.
修改/你的webmail路径/cgi/index.cgi中把第一行的T参数去掉就可以了:
如:
#!/usr/bin/perl -wT
修改为:
#!/usr/bin/perl -w
然后重新登陆WEBMAIL界面,问题解决!
Can't locate RRDs.pm in @INC (@INC contains: /var/www/extsuite/extman/libs /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /var/www/extsuite/extman/libs/Ext/GraphLog.pm line 23. BEGIN failed--compilation aborted at /var/www/extsuite/extman/libs/Ext/GraphLog.pm line 23. Compilation failed in require at /var/www/extsuite/extman/libs/Ext/MgrApp/ViewLog.pm line 22. BEGIN failed--compilation aborted at /var/www/extsuite/extman/libs/Ext/MgrApp/ViewLog.pm line 22. Compilation failed in require at /var/www/extsuite/extman/cgi/viewlog.cgi line 18.
解决办法:
根据日志分析,出现上述问题主要原因在于mydestination和virtual_mailbox_domains冲突所致!
那么我们将mydestination字段留空!
[root@centos58 courier-authlib]# vim /etc/postfix/main.cf
mydestination = $mydomain
改为
mydestination =
[root@centos58 courier-authlib]# /etc/init.d/postfix restart
1.查看日志
[root@insigam119 cur]# tail -f /var/log/dovecot.log
2020-12-17 15:12:33 pop3([email protected]): Error: open(/var/mailbox/insigmail.com/jinxm/Maildir/cur/1608188628.Vfd01I1e03dfM37704.insigam119:2,AS) failed: Permission denied (euid=1000(publish) egid=1000(publish) missing +r perm: /var/mailbox/insigmail.com/jinxm/Maildir/cur/1608188628.Vfd01I1e03dfM37704.insigam119:2,AS, dir owned by 2525:2525 mode=0777)
2.查看postfix用户的用户ID和组ID为2525
[root@insigam119 cur]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
publish:x:1000:1000::/home/publish:/bin/bash
front:x:1001:1001::/home/front:/bin/bash
project:x:1002:1002::/home/project:/bin/bash
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
zabbix:x:996:994:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
saslauth:x:995:76:Saslauthd user:/run/saslauthd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
postfix:x:2525:2525::/home/postfix:/sbin/nologin
postdrop:x:2526:2526::/home/postdrop:/sbin/nologin
dovecot:x:97:97:Dovecot IMAP server:/usr/libexec/dovecot:/sbin/nologin
dovenull:x:994:993:Dovecot's unauthorized user:/usr/libexec/dovecot:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
3.用管理员账号登录修改用户的用户ID和组ID
Dec 17 22:27:12 insigam119 authdaemond: received auth request, service=smtp, authtype=login
Dec 17 22:27:12 insigam119 authdaemond: authmysql: trying this module
Dec 17 22:27:12 insigam119 authdaemond: authmysqllib: connected. Versions: header 50650, client 50650, server 50650
Dec 17 22:27:12 insigam119 authdaemond: SQL query: SELECT id, crypt, '', uid, gid, home, concat('/var/mailbox/',maildir), '', name, '' FROM mailbox WHERE id = '[email protected]' AND (1=1)
Dec 17 22:27:12 insigam119 authdaemond: mysql_query failed: SELECT command denied to user 'extmail'@'localhost' for table 'mailbox'
Dec 17 22:27:12 insigam119 authdaemond: authmysqllib: connected. Versions: header 50650, client 50650, server 50650
Dec 17 22:27:12 insigam119 authdaemond: mysql_query failed second time, giving up: SELECT command denied to user 'extmail'@'localhost' for table 'mailbox'
Dec 17 22:27:12 insigam119 authdaemond: authmysql: REJECT - try next module
Dec 17 22:27:12 insigam119 authdaemond: FAIL, all modules rejected
Dec 17 22:27:12 insigam119 postfix/smtpd[7205]: warning: maven.insigma.com[10.85.159.202]: SASL LOGIN authentication failed: authentication failure
总结:sql查询语句不正确,就是/etc/authmysqlrc文件配置不正确。由于配置是拷贝过来的,将重复的配置注释掉。
退信内容:550 Domain may not exist or DNS check failed [NX9WKUWGGZoEdpKuMBJbEmXcZnp1+GoEt62NhQ65bRw2iEld1x+go68= IP: xx.xx.xx.xx]
退信原因:域名SPF问题。
如果想使用需要安装图形日志的运行所需要的软件包Time::HiRes、File::Tail和rrdtool。
其中前两个包您可以去http://search.cpan.org搜索并下载获得。
安装依赖包
[root@localhost ~]# yum install tcl tcl-devel libart_lgpl libart_lgpl-devel
安装Time::HiRes
[root@localhost ~]# tar xvf Time-HiRes-1.9721.tar.gz
[root@localhost ~]# cd Time-HiRes-1.9721
[root@localhost Time-HiRes-1.9721]# perl Makefile.PL
[root@localhost Time-HiRes-1.9721]# make
[root@localhost Time-HiRes-1.9721]# make test
[root@localhost Time-HiRes-1.9721]# make install
安装File::Tail
[root@localhost ~]# tar xvf File-Tail-0.99.3.tar.gz
[root@localhost ~]# cd File-Tail-0.99.3
[root@localhost File-Tail-0.99.3]# perl Makefile.PL
[root@localhost File-Tail-0.99.3]# make
[root@localhost File-Tail-0.99.3]# make test
[root@localhost File-Tail-0.99.3]# make install
安装rrdtool-1.2.23
rpm -qa | grep rrdtool
如果没有安装,安装即可!
[root@localhost ~]# yum install rrdtool rrdtool-perl
cp -r /var/www/extsuite/extman/addon/mailgraph_ext/ /usr/local
/var/www/extsuite/extman/addon/mailgraph_ext/mailgraph-init start
/var/www/extsuite/extman/addon/mailgraph_ext/qmonitor.pl start &
使用Extmail Webmail过程中,发现登陆时,因为使用IP访问,所以域名老是显示为IP,而不是默认域名,很麻烦,现在解决这个问题,让Webmail默认显示域名,而不再是IP:
#vi /var/www/extsuite/extmail/html/default/index.html
主要修改162行,增加如下红字部分(value=“你的默认登陆域名”)如下:
<%domain%> value="insigmail.com">
再次登陆,就搞定了
1.查看邮件队列 # postqueue -p 或 mailq
2.停止postfix # service postfix stop
3.清除所有发送队列 # postsuper -d ALL
4.刪除所有正在 deferred 队列中的邮件 (删除曾经发送失败的邮件 )
postsuper -d ALL deferred
5.启动postfix # service postfix start
https://www.imooc.com/article/277274
https://blog.csdn.net/qq_29891615/article/details/79495320
https://blog.csdn.net/fish_study_csdn/article/details/103945578
https://www.cnblogs.com/kevingrace/p/9383993.html
https://www.sohu.com/a/292545854_100094647
https://blog.51cto.com/weiruoyu/1017823
http://blog.chinaunix.net/uid-20776139-id-3331697.html
https://www.sohu.com/a/292545854_100094647
https://blog.csdn.net/weixin_34186128/article/details/92497283
https://www.cnblogs.com/lichongbing/p/12069567.html
http://lomu.me/post/SPF-DKIM-DMARC-PTR
http://blog.sina.com.cn/s/blog_a8192bdd0102vrxo.html
https://www.cnblogs.com/zdz8207/p/Linux-postfix-sendmail2.html