Mail Server:
SMTP: Simple Mail Tansfer Protocol (太简单,缺乏认证机制) smtp带文件路由功能,邮件中继/邮件中继服务器 。对应的TSL协议是smtps(不怎么实用,但是pop3s比较实用)
c/s架构 SMTPD 25/tcp <->smtp(sendmail) >5000/tcp 客户端-->服务端 smtp只负责传输,不负责投递。主机既要有客户端,又要有服务端。
MT:邮件传输 MTA:邮件传输代理 MD:邮件投递 MDA:邮件投递代理 MU:邮件用户 MUA:邮件用户代理
MUA--(smtp协议)-->SMTPD(一般是本地),分拣出本地邮件和远程邮件。本地邮件用LMTP协议。远程邮件则调用SMTP客户端--(smtp协议)-->远程服务器端SMTPD-->调用MDA-->投递到用户邮桶-->用户查看-->家目录的mbox目录
如果邮件中继了,那么中继服务器会给邮件盖邮戳,邮件来源是中继服务器,但是发件人不会因为中继而改变。
Open Relay (开放式转发)容易产生垃圾邮件,一般要禁用。 允许本地用户中继(因为MUA-->SMTPD-->SMTP 中SMTPD做了中继),缺点是“家贼难防”,所以必须有用户来认证。但是SMTP不支持用户认证。必须借助额外认证工具:SASL协议(简单认证安全层)。SMTPD和SASL服务通讯来实现认证。
ESMTP: Extended
POP3: Post Office Protocol 对应的TSL协议是pop3s
在SMTP基础上,将本机的MUA挪到PC机上,用MRA(邮件检索代理 Mail retrieval agent,比如POP3服务器)替换本机被挪走的MUA。而POP3协议工作在服务器上的MRA和PC机的MUA之间。发邮件用SMTP协议,收邮件用POP3协议(或IMAP4协议)。
IMAP4: Internet Mail Access Protocol (比POP3强大,但是资源消耗大)对应的TSL协议是imap4s
####################################################
WebMail: 邮件服务器上安装web服务,web服务通过PHP或perl等实现MUA的功能。客户就可以通过Web来收发邮件了。用户帐号不是服务器的系统帐号,而是虚拟用户(仅用于访问服务的标识)
发邮件:在邮件服务器上,web服务后的程序和SMTP(客户端)联系,直接发到远程SMTPD。
收邮件:在邮件服务器上,web服务后的程序和MRA(POP3服务器)连接,通过MRA来检索邮件。
POP3服务器需要验证用户,如果用户量巨大(比如上亿用户),则需要LDAP协议(轻量级目录访问协议)能提供比MySQL数据库高一个数量级的检索性能。LDAP写的性能比MySQL慢一个数量级。一般情况用MySQL来存放用户账户信息。
SMTPD服务需要SASL服务验证用户,SASL需要一个组建来链接Mysql服务。
MTA: sendmail 、qmail 、postfix 、exim。
MDA:procmail(sendmail)、maildrop、postfix分为本地用户和虚拟用户的MDA
MRA:pop3、imap4 对应程序有cyrus-imap、dovecot
MUA:thunderbird、outlook、evolution、mutt(CLI)
webmail: openwebmail、squirrelmail
SASL: cyrus-sasl
courier-authlib(比cyrus-sasl强大)
邮件服务器搭建规划:
发邮件:POSTFIX+SASL+MySQL(courier-authlib)
收邮件:DOVECOT+MySQL
WebMail: Extmail + Extman + httpd
注意:POSTFIX 的RMP包不支持SASL的虚拟用户认证。所以需要源码编译安装。
安装顺序:mysql-->postfix
如果系统25号端口被占用,需要停掉25号端口的服务,并卸载对应程序。
参考:
http://hypocritical.blog.51cto.com/3388028/1403385
服务脚本:
#!/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 $?
发邮件:
telnet localhost 25
helo
mail from:root
rcpt to:root
data
Subject: 主题
text
.
quit