电子邮件服务器
电子邮件服务器的作用:为一个域收信(前提是:它必须是这个域的MX记录),eg:sohu.com MX:sohumx.h.a.sohu.com (abc@sohu.com;123@sohu.com)只要是这个域的邮件,都由邮件服务器代收
基本概念:
发信服务器:用来替用户把邮件发送到目的地的服务器,一般运行着smtp服务器软件。
收信服务器:等待用户来收信的服务器,一般运行着pop/imap服务器软件。通常也有收信服务器和发信服务器是同一台物理服务器。
MTA(Mail Transfer Agent):邮件传输代理。发送邮件服务器软件的总称,比如sendmail,qmail,postfix,exim等
MUA(mAIL User Agent):邮件用户代理,帮助用户收信的客户端软件的总称,比如outlook,mozilla,foxmail等
邮件格式:
From:123@v1.com
To: ncre1124@126.com
Subject:hi
body: welcome to v1.com
Smtp服务器的工作原理:在mail.v1.com服务器收到邮件后判断收件人“是自己域的吗?”判断是126.com即非自己域,发送到目标域mail.126.com,如果是,则放进本地信箱。
sendmail服务器的安装
站点:http://www.sendmail.org
下载:ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.14.0.tar.gz 2007-01-31发布
[root@happyboy root]# rpm -qa |grep sendmail
sendmail-8.12.10-1
[root@happyboy root]# rpm -qa |grep postfix
[root@happyboy root]# rpm -e --nodeps sendmail //卸载已经安装的低版本sendmail
warning: /etc/mail/statistics saved as /etc/mail/statistics.rpmsave
sendmail需要增加用户验证机制,sendmail本身不支持支持认证功能,需要安装额外的身份验证库:cyrus-sasl,cyrus-sasl-plain,cyrus-sasl-devel,cyrus-sasl-gssapi,cyrus-sasl-md5,前面三个包是必须的,后面两个可选。
[root@happyboy soft]# rpm -qa |grep sasl
cyrus-sasl-plain-2.1.15-3
cyrus-sasl-2.1.15-3
cyrus-sasl-gssapi-2.1.15-3
cyrus-sasl-devel-2.1.15-3
cyrus-sasl-md5-2.1.15-3
sendmail还需要DNS环境的配合。
[root@happyboy named]# host -t MX v1.com
v1.com mail is handled by 10 mail.v1.com.
[root@happyboy named]# host mail.v1.com
mail.v1.com has address 192.168.0.200
[root@happyboy soft]# tar xvzf sendmail.8.14.0.tar.gz
[root@happyboy soft]# cd sendmail-8.14.0/
由于sendmail默认没有支持用户验证机制,我们需要手工增加sasl认证。
[root@happyboy sendmail-8.14.0]# vi devtools/Site/site.config.m4 创建文件增加两行内容
APPENDDEF(`confENVDEF',`-DSASL=2') //注意这里的4个符号分别是反斜点,单引号,反斜点,单引号,下面那句相同
APPENDDEF(`conf_sendmail_LIBS',`-lsasl2') //反斜点:即esc键和Tab键之间的键。
[root@happyboy sendmail-8.14.0]# sh Build -c //第一次执行时不需要参数,如果有修改过配置文件,要用-c参数重新编译,确保编译过程完整,完成后生成sendmail可执行守护程序。
[root@happyboy sendmail-8.14.0]# sh Build install //安装
install: 无法创建一般文件‘/usr/man/man8/praliases.8’: 没有那个文件或目录 //出现类似错误
[root@happyboy sendmail-8.14.0]# cd /usr/
[root@happyboy usr]# mkdir man
[root@happyboy usr]# cd man
[root@happyboy man]# mkdir man1
[root@happyboy man]# mkdir man8
[root@happyboy man]# mkdir man5 //再安装顺利完成
[root@happyboy man]# cd /root/soft/sendmail-8.14.0/
该过程很复杂,一定要注意,如果出错只能逐步逐步检查。
[root@happyboy sendmail-8.14.0]# rpm -q m4 //其配置过程需要使用m4宏解释器,配置过程复杂,没有有意义的单词,可以用m4的宏配置类进行
m4-1.4.1-13
在sendmail的配置文件中包含了一套m4的宏定义,在cf/m4目录下,安装需要将cf目录copy到系统目录中去
[root@happyboy sendmail-8.14.0]# mkdir /usr/share/sendmail
[root@happyboy sendmail-8.14.0]# cp -a cf /usr/share/sendmail //稍后我们会调用该目录下的m4宏文件。
[root@happyboy sendmail-8.14.0]# cd cf/cf //sendmail需要一个默认的mc配置文件,该目录下有各种不同型号不同平台的配置文件,我们需要linxu平台
[root@happyboy cf]# cp generic-linux.mc sendmail.mc //该语法非常严格,以dnl结束表示该行从该处开始到行尾全部失效,防止有多余的空格,字符串全部用引号引起来,左边不是单引号为反斜点,右边的才是单引号。要非常注意。
[root@happyboy cf]# mkdir /etc/mail //创建sendmail的默认配置文件目录,默认sendmail会到该目录查找配置文件
mkdir: 无法创建目录‘/etc/mail’: 文件已存在
[root@happyboy cf]# make install-cf //该命令作用就是将sendmail配置文件copy到/etc/mail目录中,故先建立该目录,该版本已经自行建立该目录了
[root@happyboy cf]# cp sendmail.mc /etc/mail
[root@happyboy cf]# cd /etc/mail
[root@happyboy mail]# touch aliases //保存用户的别名,即别名数据库
[root@happyboy mail]# touch access //允许访问,发信的用户地址
[root@happyboy mail]# echo "v1.com" > local-host-names //申明为哪个域服务
[root@happyboy mail]# echo "mail.v1.com" >> local-host-names
[root@happyboy mail]# makemap hash aliases < aliases //生成库文件,完整为makemap hash aliases.db < aliases 省略了库文件后缀
[root@happyboy mail]# makemap hash access < access
[root@happyboy mail]# mkdir /var/spool/mqueue
[root@happyboy mail]# /usr/sbin/sendmail -bd -q1h //-bd让sendmail在后台运行,守护进程以命令运行,-q1h表示队列每个小时处理一次,可以更改为-q30m每30分钟,或者s秒,详细可以参考sendmail帮助 man sendmail
[root@happyboy mail]# ps -axu |grep sendmail
root 12197 0.2 0.7 5640 2108 ? S 22:11 0:00 sendmail: accepting connections
root 12201 0.0 0.2 4920 672 pts/0 S 22:11 0:00 grep sendmail
sendmial已经正常启动了
[root@happyboy mail]# netstat -tnlp |grep 25
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 12197/sendmail: acc
测试发信
[root@happyboy mail]# useradd mailtest //创建一个普通帐号远程发信 密码为mailtest
[root@happyboy mail]# passwd mailtest
[root@happyboy mail]# echo "root:mailtest" >> /etc/mail/aliases //系统必须有一个别名文件,并且不能为空,建立别名帐号,即发送到root帐号转给mailtest
[root@happyboy mail]# newaliases //创建新的数据库帐号
测试过程:
[root@happyboy mail]# telnet 192.168.0.200 25 //登陆本地25端口
Trying 192.168.0.200...
Connected to 192.168.0.200 (192.168.0.200).
Escape character is '^]'.
220 happyboy.net.cn ESMTP Sendmail 8.14.0/8.14.0; Mon, 1 Oct 2007 23:04:19 +0800
mail from: root@v1.com //登陆成功后输入发件人,注意格式:后可以有空格在写发件人
250 2.1.0 root@v1.com... Sender ok
rcpt to: mailtest@v1.com //输入收件人地址
250 2.1.5 mailtest@v1.com... Recipient ok
data //输入data命令表示下面开始输入邮件内容了
354 Enter mail, end with "." on a line by itself //这行是smtp服务的提示信息,输入邮件内容,在一行中直接输入.结束。
welcome,mail from smtp command. //这两行为内容和结束符号.
.
250 2.0.0 l91F4Jni012222 Message accepted for delivery
quit //退出邮局
221 2.0.0 happyboy.net.cn closing connection
Connection closed by foreign host.
[root@happyboy mail]# more /var/log/maillog 查看日志是否发送成功。该版本的mail日志好象不是记录在这里的?
[root@happyboy mail]# su - mailtest //由于没有配置收件服务器,只能切换到mailtest用户用mail命令收信
###注意这里切换用户参数 - 不要忘记,否则
###[root@happyboy mail]# su mailtest
###[mailtest@happyboy mail]$ mail
###/var/spool/mail/root: Permission denied
###[root@happyboy mail]# su - mailtest 携带环境变量
###[root@happyboy mail]# su mailtest 只是切换用户,但是环境变量还是之前用户的
[mailtest@happyboy mailtest]$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/mailtest": 4 messages 4 new
>N 1 root@v1.com Mon Oct 1 23:07 12/474
N 2 root@v1.com Mon Oct 1 23:18 12/474
N 3 root@v1.com Tue Oct 2 08:35 12/473
N 4 mailtest@v1.com Tue Oct 2 08:50 21/690 "from outlook"
& //在该符号下输入邮件编号即可看到邮件内容 q退出。
[root@happyboy soft]# rpm -ihv imap-2002d-2.i386.rpm
warning: imap-2002d-2.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
Preparing... ########################################### [100%]
1:imap ########################################### [100%]
[root@happyboy soft]# rpm -ql imap //安装好可以查询到该包中所包含的文件
[root@happyboy soft]# chkconfig ipop3 on
[root@happyboy soft]# chkconfig imap on
[root@happyboy soft]# ls /etc/xinetd.d //可以看到这两个服务依赖xinetd
chargen daytime echo-udp imap ipop3 kshell services time-udp
chargen-udp daytime-udp eklogin imaps klogin pop3s sgi_fam vsftpd
cups-lpd echo gssftp ipop2 krb5-telnet rsync time
[root@happyboy soft]# service xinetd restart 启动超级服务器来启动imap和ipop3
[root@happyboy soft]# grep imap /etc/services
imap 143/tcp imap2 # Interim Mail Access Proto v2
imap 143/udp imap2
imap3 220/tcp # Interactive Mail Access
imap3 220/udp # Protocol v3
imaps 993/tcp # IMAP over SSL
imaps 993/udp # IMAP over SSL
[root@happyboy soft]# netstat -tnl |grep 143
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
这样客户端就可以收邮件了
=======================================================================
允许邮件中继,即发往外域邮件。可以通过在服务器上增加局域网地址打开转发。
[root@happyboy root]# cd /etc/mail
[root@happyboy mail]# vi sendmail.mc
divert(0)dnl
include(`/usr/share/sendmail/cf/m4/cf.m4')dnl //由于增加的行为m4宏,所以要将宏包含进去。
VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
OSTYPE(linux)dnl
FEATURE(`access_db')dnl //该行为增加的一行
DOMAIN(generic)dnl
MAILER(local)dnl
MAILER(smtp)dnl
[root@happyboy mail]# m4 sendmail.mc > sendmail.cf //使用m4宏语言将其生成为sendmail.cf配置文件
[root@happyboy mail]# echo "192.168.0 RELAY" >> access //允许来自该网段的用户RELAY
[root@happyboy mail]# makemap hash access < access //生成数据库
[root@happyboy mail]# killall -9 sendmail //重启sendmail
[root@happyboy mail]# sendmail -bd -q1h
测试用客户端发送出去的邮件到163.com可以收到,注意,这里要求客户端对自身的邮局和目标邮局都可以查询得到mx记录。否则DNS出错是无法完成的。
=======================================================================================
如果服务器不是一个局域网内部的服务器,客户端IP是变化的,无法通过access进行验证,那么就需要配置客户身份验证机制。
[root@happyboy security]# cd /etc/mail
[root@happyboy mail]# rm access //为了看到实验效果,删除之前配置的access,重新建立一个空白的,并生成数据库
rm:是否删除一般文件‘access’? y
[root@happyboy mail]# > access
[root@happyboy mail]# makemap hash access < access
[root@happyboy mail]# killall -9 sendmail
[root@happyboy mail]# sendmail -bd -q1h
//重启sendmail,客户端发信就会出现:由于服务器拒绝收件人之一,无法发送邮件。被拒绝的电子邮件地址是“ncre1124@163.com>”。 主题 'to 163', 帐户: 'mail.v1.com', 服务器: 'mail.v1.com', 协议: SMTP, 服务器响应: '550 5.7.1 <ncre1124@163.com>... Relaying denied. IP name possibly forged [192.168.0.100]', 端口: 25, 安全(SSL): 否, 服务器错误: 550, 错误号: 0x800CCC79
如果是发送给本域:由于服务器拒绝收件人之一,无法发送邮件。被拒绝的电子邮件地址是“mailteset@v1.com”。 主题 'test', 帐户: 'mail.v1.com', 服务器: 'mail.v1.com', 协议: SMTP, 服务器响应: '550 5.1.1 <mailteset@v1.com>... User unknown', 端口: 25, 安全(SSL): 否, 服务器错误: 550, 错误号: 0x800CCC79
[root@happyboy mail]# vi sendmail.mc //编译该文件,增加以下几行,打开身份验证
divert(0)dnl
include(`/usr/share/sendmail/cf/m4/cf.m4')dnl //这行也需要添加,在上面做IP认证是已经添加了
VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
OSTYPE(linux)dnl
FEATURE(`access_db')dnl //该行在用户验证模式中可以删除
define(`confAUTH_OPTIONS',`A y')dnl //从这里开始的三行是需要增加的
TRUST_AUTH_MECH(`LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS',`LOGIN PLAIN')dnl
DOMAIN(generic)dnl
MAILER(local)dnl
MAILER(smtp)dnl
[root@happyboy mail]# m4 sendmail.mc > sendmail.cf
[root@happyboy mail]# chkconfig saslauthd on //启动sasl用户身份验证服务
[root@happyboy mail]# service saslauthd restart
停止 saslauthd:[失败]
启动 saslauthd:[ 确定 ]
[root@happyboy mail]# echo "pwcheck_method:saslauthd" > /usr/lib/sasl2/Sendmail.conf //编译配置文件,sasl必须通过该文件来确定sendmail如何进行身份验证
[root@happyboy mail]# killall -9 sendmail //重启sendmail
[root@happyboy mail]# sendmail -bd -q1h
[root@happyboy sasl2]# telnet localhost 25 //本地测试
Trying 127.0.0.1...
Connected to happyboy.net.cn (127.0.0.1).
Escape character is '^]'.
220 happyboy.net.cn ESMTP Sendmail 8.14.0/8.14.0; Tue, 2 Oct 2007 13:20:12 +0800
ehlo localhost //输入ehlo 域名
250-happyboy.net.cn Hello happyboy.net.cn [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN //可以看到这个就说明认证成功
250-DELIVERBY
250 HELP
quit //退出
221 2.0.0 happyboy.net.cn closing connection
Connection closed by foreign host.
用户别名:
修改/etc/mail/aliases
postmaster:root //将pid为500以下的用户做别名到root,root别名到mailtest,所以最后收件人为mailtest.
daemons:root
bin:root
sys:root
...
root:mailtest
...
[root@happyboy mail]# newaliases
[root@happyboy mail]# killall -9 sendmail //重启sendmail
[root@happyboy mail]# sendmail -bd -q1h
避免imap的不安全,激活安全的imaps
imaps=imap+ssl
# chkconfig imap off
# chkconfig imaps on
# service xinetd restart
# netsat -tnl |grep 993
客户端也需要做调整,如outlookexpress中的高级标签需要选中“此服务器要求安全连接(SSL)
以上测试基于已经将该服务器配置为DNS了,要结合解析才可以进行.
imap的客户端认证测试过程中还有部分问题,可能涉及到pam认证配置有问题,后续有时间再研究.