本笔记仅用于局域网内两台sendmail实验,以方便日后实验的拓展。关于sendmail网上的例子很多,腌还是按自己的步骤进行吧!一步一步。。。。
目的:熟悉sendmail的配置方法、以及在sendmail出现故障时排错方法。
要求:熟悉BIND(DNS)的配置方法
要点:熟悉sendmail的朋友可以闪了,两台机器之间发邮件。
    1、能够相互解析
    2、如果是利用客户端向另外一个邮件域发邮件,需要开启客户端所登录的服务器上的RELAY功能。
知识点回顾:
===================================
这个兄弟把MUA、MDA、MTA讲的很好。转了转了!
http://hi.baidu.com/xiamenyu/blog/item/3e1db3d15b37903d9a50277d.html
MUA:邮件用户代理; 指的就是如Foxmail,outlook,等邮件客户端程序。

MDA(Mail Delivery Agent):“邮件投递代理”主要的功能就是将MTA接收的信件依照信件的流向(送到哪里)将该信件放置到本机账户下的邮件文件中(收件箱),或者再经由MTA将信件送到下个MTA。如果信件的流向是到本机,这个邮件代理的功能就不只是将由MTA传来的邮件放置到每个用户的收件箱,它还可以具有邮件过滤(filtering)与其他相关功能

MTA(Mail Transfer Agent):MUA是用在Client端的软件,而MTA是用在邮件主机上的软件,它也是主要的邮件服务器。MTA就是“邮件传送代理”的意思,既然是 “传送代理”,那么用户寄信与收信时,都找MTA就对了!因为它负责帮用户传送。基本上,MTA的功能如下。
接收外部主机寄来的信件:既然是邮件主机,接收信件自然是主要功能,只要这个信件里有MTA内部账号,这封信就会被MTA收下来;
帮用户发(寄出)信:既然可以收信,自然也可以发信,只要用户具有合法的使用MTA的权力,就可以利用这台MTA主机把信传送出去!不过要注意,MTA会将信件送给目的地的MTA而不是目的地的MUA。不要搞错了!
====================================

一封邮件投 递过程:

小人使用MUA发一封邮件给xx@yy.com;MUA首先连接邮件提供商的MTA,认证通过后,MDA开始判断这个邮件将投递到哪里?如果是本域,则将该邮件投递到本域用户的收件夹,如果是另外一个邮件域,则将其投递到对方的MTA上,最终xx@yy.com使用MUA收取这封邮件。

笔记实验环境介绍:
设备及网络环境介绍:(省去拓补图,因为太简单了)
三台服务器,一台交换机   (所有服务器IP在同一个网段内)
Server:内网ftp服务器,已安装vsftpd,用于做另外两台PC的软件仓库。地址:ftp://192.168.10.129
unix:内网的sendmail服务器1,只是安装了一个操作系统。ip:192.168.10.33
linux:内网的sendmail服务器2,只是安装了一个操作系统。ip:192.168.10.34:

实现要求:
1、要求在unix上有四个账户: Boss,jerry,mary,jam
2、要求在linux上四个账户:jack,bing,badboy,chen_baocheng
3、要求发送all@linux.com邮件时,jack,bing,badboy,chen_baocheng可能收到。
4、要求发送到bing的邮件自动会发一封给jack
5、要求发送到Bnsen@linux.com的邮件,chen_baocheng@可以收到
6、要求发送到jack的邮件自动转发到badboy.

7、要求linux.com可以与unix.com相互邮件发送
8、要求unix里有四个账户:boss,jerry,mary,jam
9、要求unix里所有账户在接收邮件时,都自动发送一封给boss
10、要求发送给haha@unix.com的邮件,实际的接收者为boss (老板的邮件不一样啊!)

配置思路:
a、配置两台服务器的yum source.
b、安装配置DNS服务器及相应的转发
c、安装与配置sendmail服务器
d、确定账户与相应的邮件设定
e、检查两台主机的真实主机名。
    (请注意主机名的问题,我也曾因主机名的问题,导致两台机互发邮件解析出现问题)
f、两台邮件服务器之间相互邮件发送
g、开启针对用户认证的relay设置
============================================
在这里我已关闭两台机的firewall\selinux
a、配置两台服务器的yum source
[root@unix ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo
[redhat5.4]
name=redhat
baseurl=ftp://192.168.10.129
enable=1
gpgcheck=0
做一下清洁工作!
[root@unix ~]# yum clean all
Loaded plugins: rhnplugin, security
Cleaning up Everything
开始获取仓库软件清单了
[root@unix ~]# yum list
邮件服务器2,也仍照此操作。

b、安装DNS服务器,并做相应的转发。
即unix.com 需要把访问到linux.com的请求转向192.168.10.34
即linux.com需要把访问到unix.com的请求转向192.168.10.33
1、安装BIND需要四个包。bind,bind-chroot,bind-until,bind-devel
[root@unix ~]# rpm -qa | grep ^bind    #缺少三个包
bind-utils-9.3.6-4.P1.el5
bind-libs-9.3.6-4.P1.el5
[root@unix ~]# yum list | grep ^bind   #通过yum来安装吧
This system is not registered with RHN.
RHN support will be disabled.
bind-libs.i386                             30:9.3.6-4.P1.el5           installed
bind-utils.i386                            30:9.3.6-4.P1.el5           installed
bind.i386                                  30:9.3.6-4.P1.el5           redhat5.4
bind-chroot.i386                           30:9.3.6-4.P1.el5           redhat5.4
bind-devel.i386                            30:9.3.6-4.P1.el5           redhat5.4
bind-libbind-devel.i386                    30:9.3.6-4.P1.el5           redhat5.4
bind-sdb.i386                              30:9.3.6-4.P1.el5           redhat5.4
[root@unix ~]# yum install -y bind bind-chroot bind-devel    #安装

2、配置DNS服务器,并做相应的转发。
    I、编辑unix服务器的named.conf文件
    [root@unix ~]# vim /var/named/chroot/etc/named.conf
    options {
            directory "/var/named";
    };

    zone "unix.com" IN {
            type master;
            file "data/master.unix.com.zone";
    };

    zone "linux.com" IN {   
            type forward;
            forwarders { 192.168.10.34; };
    };


linux服务器DNS的设定:
    options {
            directory "/var/named";
    };

    zone "linux.com" IN {
            type master;
            file "data/master.linux.com.zone";
    };

    zone "unix.com" IN {
            type forward;
            forwarders { 192.168.10.33; };
    };

编辑unix服务器的正向代理
    [root@unix ~]# vim /var/named/chroot/var/master.unix.com.zone
    $TTL 86400
    @       IN      SOA     sz.unix.com.    baoch8.163.com  (
                            0000001
                            1400
                            2800
                            36000
                            86400   )
    @       IN      NS              sz.unix.com.
              IN         MX                  sz.unix.com.
    sz      IN      A               192.168.10.33
    [root@unix ~]# service named restart
    停止 named:                                               [确定]
    启动 named:                                               [确定]

II,设置/etc/resolv.conf文件
[root@unix ~]# cat /etc/resolv.conf    
nameserver 192.168.10.33

III.unix.com的DNS服务器配置完成。  linux.com的DNS服务器配置与此类似,不再提供。

IIII.测试
[root@linux ~]# nslookup
> sz.unix.com
Server:         192.168.10.34
Address:        192.168.10.34#53

Non-authoritative answer:
Name:   sz.unix.com
Address: 192.168.10.33
> bj.linux.com
Server:         192.168.10.34
Address:        192.168.10.34#53

Name:   bj.linux.com
Address: 192.168.10.34


IIIII.另外一台服务器,请也按此设定。

c、安装与配置sendmail服务器

1、sendmail在系统安装之时,已经将其加入了。但是有些包还是没有装的,所以在这里我查询一下。
[root@unix ~]# yum list *sasl  m4  dovecot sendmail-*
Installed Packages
cyrus-sasl.i386                       2.1.22-5.el5                     installed
m4.i386                               1.4.5-3.el5.1                    installed
sendmail.i386                         8.13.8-2.el5                     installed
Available Packages
dovecot.i386                          1.0.7-7.el5                      redhat5.4
sendmail-cf.i386                      8.13.8-2.el5                     redhat5.4
sendmail-devel.i386                   8.13.8-2.el5                     redhat5.4
sendmail-doc.i386                     8.13.8-2.el5                     redhat5.4


sendmail-cf生成配置文件 的包
sendmail-devel. 需要的头文件
sendmail-doc 文档包
dovecot 用于pop3协议IMAP协议接收包
m4  用于日后将sendmail.mc 编辑成sendmail.cf的包
cyrus-sasl    用于日后,开启用户的SMTP的认证包。

安装sendmail的必须包:
[root@unix ~]# yum install -y dovecot sendmail-cf sendmail-devel sendmail-doc

2、开始配置sendmail服务器
[root@unix ~]# vim /etc/mail/sendmail.mc
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl   #允许侦听本机所有网络地址
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl   # 
以下是定义可以使用短主机名。
发邮人定义:比如:你的完整邮址为mary@sz.unix.com ,定义后你的发件会变成mary@unix.com
MASQUERADE_AS(`unix.com')dnl             #定义你的邮件域名
MASQUERADE_DOMAIN(localhost)dnl                   
MASQUERADE_DOMAIN(localhost.localdomain)dnl
MASQUERADE_DOMAIN(unix.com)dnl

[root@unix ~]# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
[root@unix ~]# vi /etc/mail/local-host-names
# local-host-names - include all aliases for your machine here.
# 定义短的收件人名单。如你的完整邮址为mary@sz.unix.com,别人发给你的邮件时,可以将收件人写成mary@unix.com
sz.unix.com
unix.com

启用我们的pop3协议
[root@unix ~]# vi /etc/mail/local-host-names
protocols = pop3
[root@unix ~]# service dovecot start
启动 Dovecot Imap:                                        [确定]

开启用户认证服务:
[root@unix ~]# service saslauthd start
启动 saslauthd:                                           [确定]

d、确定账户与相应的邮件设定
添加账户
[root@unix ~]# vi user.sh
#!/bin/bash
for i in boss jerry mary jam
do
        useradd $i
        echo "123456" | passwd --stdin $i
done
[root@unix ~]# chmod u+x user.sh
[root@unix ~]# ./user.sh
Changing password for user boss.
passwd: all authentication tokens updated successfully.
Changing password for user jerry.
passwd: all authentication tokens updated successfully.
Changing password for user mary.
passwd: all authentication tokens updated successfully.
Changing password for user jam.
passwd: all authentication tokens updated successfully.

邮件设定
[root@unix ~]# vi /etc/aliases
jerry:          jerry,boss   #凡是收件为jerry, 老板也会接收一封。
mary:           mary,boss
jam:            jam,boss
haha:           boss            #老板的邮件别名。
备注:关于linux.com上的邮件设定也跟此类改,配置文件不再提供。
[root@unix ~]# newaliases       #让别名生效
/etc/aliases: 80 aliases, longest 10 bytes, 812 bytes total

[root@unix ~]# service sendmail restart
关闭 sm-client:                                           [确定]
关闭 sendmail:                                            [确定]
启动 sendmail:                                            [确定]
启动 sm-client:                                           [确定]

测试一下:
[root@unix ~]# mail -s "to-jam" jam@unix.com
Hello.jam.
20101025
.
Cc:

看一下邮件:OK
[root@unix ~]# cat /var/mail/jam
From root@localhost.localdomain  Mon Oct 25 19:58:27 2010
Return-Path: <root@localhost.localdomain>
Date: Mon, 25 Oct 2010 19:58:27 +0800
From: root <root@localhost.localdomain>
Message-Id: <201010251158.o9PBwRQW003560@localhost.localdomain>
To: jam@unix.com
Subject: to-jam
Hello.jam.
20101025

[root@unix ~]# cat /var/mail/boss
From root@localhost.localdomain  Mon Oct 25 19:58:27 2010
Date: Mon, 25 Oct 2010 19:58:27 +0800
From: root <root@localhost.localdomain>
Message-Id: <201010251158.o9PBwRQW003560@localhost.localdomain>
To: jam@unix.com
Subject: to-jam
Hello.jam.
20101025


[root@unix ~]# mail -s "hello.haha" haha@unix.com
hello.Boss,where is my money
.
Cc:
[root@unix ~]# cat /var/mail/boss
From root@localhost.localdomain  Mon Oct 25 20:28:41 2010
Return-Path: <root@localhost.localdomain>
Date: Mon, 25 Oct 2010 20:28:41 +0800
From: root <root@localhost.localdomain>
Message-Id: <201010251228.o9PCSfDw019864@localhost.localdomain>
To: haha@unix.com
Subject: hello.haha

hello.Boss,where is my money

e、检查两台主机的真实主机名与添加MX记录 。
[root@linux ~]# hostname
linux
[root@linux ~]# hostname
linux
两台主机均没有以FQDN的标准命名,为此,我们要修改:/etc/hosts文件   /etc/sysconfig/network文件
在这里,我们以unix.com的主机为例:  (linux.com的主机请按类似修改)
在/etc/hosts文件中,添加:
192.168.10.33           sz.unix.com     unix
在/etc/sysconfig/network中修改:
HOSTNAME=sz.unix.com

[root@unix ~]# hostname sz.unix.com    #让主机名立即生效。

可以开始发邮件了,测试一下:
从unix.com上的发邮件到linux.com---->mary@unix.com  mailto : bnsen@linux.com
结果需要:1、邮件能成功发送。
             2、这封邮件最终是被chen_baocheng@linux.com给收走!
[root@sz ~]# su - mary

[mary@sz ~]$ mail -s "money" bnsen@linux.com
hi,please tell me you passwd

验证一下:
[root@bj ~]# cat /var/mail/chen_baocheng
From mary@sz.unix.com  Mon Oct 25 23:21:53 2010
Return-Path: <mary@sz.unix.com>
Received: from sz.unix.com ([192.168.10.33])
From: mary@unix.com
Message-Id: <201010251521.o9PFLqA1003688@sz.unix.com>
To: bnsen@linux.com
Subject: money

hi,please tell me you passwd


g、开启针对用户认证的relay设置
仅仅是上面的设定还是不够的,我们搭建邮件服务器是为了什么 ? 
为客户端传输邮件;难道要让客户自己登陆到服务器上来发,NO。 
当然是客户自己在邮件客户端自己发,在这里我们就要开启relay的功能。

1、针对IP或是域名的relay。  配置文件在/etc/mail/access,修改后,我们还要做:
makemap hash /etc/mail/access.db < /etc/mail/access  
这个仅适用于局域网用户,如果有用户在外地,我们总不能这么做吧。

2、针对用户认证的relay
在这里我们要修改几个地址;
vi /etc/mail/sendmail.mc

TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl

[root@bj mail]# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
[root@bj mail]# service saslauthd start
[root@bj mail]# service sendmail restart

客户端需要注意的是:在开 启针对用户认证的relay后,我们的邮件客户端上,需要启用SMTP认证!这样就OK了。

以下是我从虚拟机XP中,用outlook express。给jam@unix.com发的邮件。(由于使用提linux在写博客方面,基本上以文字为主。虽然我也用有图有真相来说明问题,但是文本有时候也以说明问题。呵呵。欢迎大家来拍砖块!)
From jack@linux.com  Tue Oct 26 00:00:55 2010
Return-Path: <jack@linux.com>
Received: from bj.linux.com ([192.168.10.34])
        by sz.unix.com (8.13.8/8.13.8) with ESMTP id o9PG0tiQ003740
        for <jam@unix.com>; Tue, 26 Oct 2010 00:00:55 +0800
Received: from ISLAND6CA79F1F ([192.168.10.5])
        (authenticated bits=0)
        by bj.linux.com (8.13.8/8.13.8) with ESMTP id o9PG0spY003449
        for <jam@unix.com>; Tue, 26 Oct 2010 00:00:54 +0800
Message-ID: <6EA8806B2B264A0594AEAB12D4397785@ISLAND6CA79F1F>
From: "jack" <jack@linux.com>
To: <jam@unix.com>
Subject: hi.....
Date: Mon, 25 Oct 2010 16:00:54 +0800
MIME-Version: 1.0
Content-Type: multipart/alternative;
        boundary="----=_NextPart_000_0003_01CB745D.CDBEB880"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2900.5512
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579

This is a multi-part message in MIME format.

------=_NextPart_000_0003_01CB745D.CDBEB880
Content-Type: text/plain;
        charset="gb2312"
Content-Transfer-Encoding: base64

d2hlcmUgYXJlIHlvdT8=

------=_NextPart_000_0003_01CB745D.CDBEB880
Content-Type: text/html;
        charset="gb2312"
Content-Transfer-Encoding: base64

PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVu
dD0idGV4dC9odG1sOyBjaGFyc2V0PWdiMjMxMiI+DQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNi4w
MC41NzMwLjEzIiBuYW1lPUdFTkVSQVRPUj4NCjxTVFlMRT48L1NUWUxFPg0KPC9IRUFEPg0KPEJP
RFkgYmdDb2xvcj0jZmZmZmZmPg0KPERJVj48Rk9OVCBzaXplPTI+d2hlcmUgYXJlIHlvdT88L0ZP
TlQ+PC9ESVY+PC9CT0RZPjwvSFRNTD4NCg==

------=_NextPart_000_0003_01CB745D.CDBEB880--



FAQ:
在配置sendmail中可能出现的问题:
1、为什么 出现这样?
Oct 25 21:55:09 sz sendmail[3539]: o9PDt8Tt003537: to=<bing@linux.com>, ctladdr=<root@sz.unix.com> (0/0), delay=00:00:01, xdelay=00:00:00, mailer=esmtp, pri=120349, relay=bj.linux.com. [192.168.10.34], dsn=4.4.0, stat=Deferred: 450 4.4.0 <bing@linux.com>... Relaying temporarily denied. Cannot resolve PTR record for 192.168.10.33
因解析linux.com时,发现不正确,无法获取到192.168.10.33记录。
原因:可能是因为linux.com没在做接收邮件的短主机名设置. /etc/mail/local-host-names

2.--->5.3.5 mail.abc.com. config error: mail loops back to me (MX problem?)
        554 5.3.5 Local configuration error
原因:解析的问题。可以从hostname,DNS中寻找原因。
网友的一个奇怪的问题:
两台SENDMAIL相互发信,在DNS中注册两个域名,在域名文件中分别设定MX记录表示两个域的MAIL服务器,DIG能正确解析这两个MX记录,两个SENDMAIL都启用认证功能,一切都按照我预想的在进行,每台SENDMAIL服务器都能在本机发邮件,本机的通讯能成功。在两个域相互发邮件的时候,问题出来了:
5.3.5 mail.abc.com. config error: mail loops back to me (MX problem?)
554 5.3.5 Local configuration error

遇到这个问题,我第一反应是MX记录出现了问题,我反复检查我的DNS的问题(后来事实证明我是错误的),但是每次的检查都能正确返回给我正确的关于域名的正确MX记录。我百思不得其解,于是上网查找解决的方法,但是最终我没找到我的正确的答案,我发现网上提出这个问题的帖子倒是木佬佬,唉,靠自己吧

我开始进行SENDMAIL的全面检查,ACCESS,LOCAL-HOST-NAMES,SENDMAIL.CW,SENDMAIL.CF,还是不行,我再次陷入了困境,突然我想到SENDMAIL
是GNU的产品,也就是说它肯定有一个官方网站,我何不去那里看看,带着沉甸甸的心情,我来到了
www.sendmail.org
,我进入了FAQ,找啊找,找了好久,总算是有了一些心得。当然最后我解决了问题,现在我来总结下

首先出现这个问题的主要原因在于SENDMAIL服务器不能正确的识别在DNS服务器中相关的MX记录,我们能解析出来,但是SENDMAIL确不能正常识别;
我解决的步骤为:

修改local-host-names,添加MX的FQDN进去

修改ACCESS,添加这两个域的域名进去

重新启动服务

最重要的一步:kill -HUP -1 /var/run/sendmail.pid

搞定,正常工作了
其实当SENDMAIL出问题的时候,我曾经尝试过1,2,3个步骤,但是没成功,运行了第4步以后就成功了,第4步的作用实际上就是用来刷新SENDMAIL的进程文件的。。