/ 中存储网

Sendmail邮件服务器搭建与配置笔记及邮件发送原理介绍

2016-06-23 16:46:38 来源:中存储网

Sendmail邮件服务器搭建与配置笔记及邮件发送原理介绍

本笔记仅用于局域网内两台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设置

============================================ 

在这里我已关闭两台机的firewallselinux

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的进程文件的。

至此sendmail邮件服务器配置完成。

原文地址:http://myhat.blog.51cto.com/391263/410414/