/ 中存储网

sendmail/imap邮件服务器的配置

2014-12-22 13:02:45 来源:中存储网

电子邮件服务器

电子邮件服务器的作用:为一个域收信(前提是:它必须是这个域的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认证配置有问题,后续有时间再研究.