配置与管理sendmail服务器

一、电子邮件系统的组成

Linux系统中的电子邮件系统包括3个组件:MUA(Mail user Agent,邮件用户代理)、MTA(Mail Transfer Agent,邮件传送代理)、MDA (Mail Dilivery Agent,邮件投送代理)

1、MUA

MUA是电子邮件系统的客户端程序,它是用户与电子邮件系统的接口,主要负责邮件的发送和接受以及邮件的撰写,阅读等功能,目前主流的用户代理平台有OutLook、foxmail和Linux中的Mail

2、MTA

MTA是电子邮件系统的服务器程序、它主要负责邮件的存储和转发。最常用的MTA软件由基于Windows平台的Exchange、和基于Linux平台的Sendmail和postfix。

3、MDA

MDA又是也称LDA(Local Dilivery Agent,本地投递代理)MTA把邮件投递到邮件接受者所在的邮件服务器**MDA则负责把邮件按照接收者的用户名投递到邮箱中**

4、MUA,MTA,MDA的协同工作

总的来说,当使用MUA程序写信时,应用程序会把信件发送给sendmail或者postfix这样的MTA程序。如果信件时寄给局域网或本地主机的,那么MTA程序应该从地址上就可以确定这个信息。

二、与电子邮件相关的协议

常用的电子邮件协议有SMTP,POP3,IMAP4

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,该协议默认工作再TCP的25端口。SMTP属于客户机/服务器类型,它是一组用于由源地址目的地址传送到邮件的规则,由他来控制新建的中转方式,SMTP属于TCP/IP协议簇,它帮助每台计算机再发哦是那个或中专新建时找到下一个目的地。

POP3(Post Office Protocol3)即邮局协议的第三个版本。该协议默认工作在TCP的110端口,POP3同样属于客户机/服务器模型,它是规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。它是Internet电子邮件的第一个离线协议标准,POP3允许从服务器上把邮件存储到本地主机即自己的计算机上,同时删除保存在邮件服务器上的邮件。


三、邮件中继

中继是指要求你的服务器向其他服务器传递邮件的一种请求。一个服务器处理的邮件只有两类,一类是外发的邮件,一类是接收的邮件,前者是本域用户通过服务器要向外部转发的邮件,后者是发给本域用户的。

一个用户不应该处理过路的邮件,就是既不是你的用户转发的,也不是发给你的用户的,而是一个外部用户发给另一个外部用户的。这一行为称为第三方中继。如果是不需要经过验证就可以中继邮件到组织外的,称为Open RELAY(开放中继),“第三方中继”和“开放中继”是要禁止的,但中继是不能关闭的。这里需要了解几个概念。

(1)中继:用户通过服务器将邮件传递到组织外

(2)OPEN RELAY:不受限制的组织外中继,即无验证的用户也可提交中继请求。

(3)第三方中继:由服务器提交的OPEN RELAY 不是从客户端直接提交的。比如网段域是A,我通过服务器B中转邮件到C域,这时服务器B上看待的是连接请求来源于A域的服务器,而邮件既不是服务器B所在域用户提交的,也不是发给B域的,这就是属于第三方中继。这是垃圾邮件的根本。如果用户通过直接连接你的服务器发送邮件,这是无法阻止的,比如群发软件。如果关闭了OPEN RELAY,那么他只能发信到你的组织内用户,无法将邮件中继出组织。

**sendmail相关配置文档**

**sendmail.cf**:sendmail核心配置文件,位于/etc/mail/sendmail.cf

sendmail.mc:sendmail提供sendmail文件模板,通过编辑此文件后再使用m4工具将结果导入sendmail.cf完成配置Sendmail核心配置文件,降低配置复杂性,位于/etc/mail/sendmail.mc

local-host-name:定义收发邮件服务器的域名和主机别名,位于/etc/mail/local-host-names

accesss.db:用来设置Sendmail服务器为哪些主机进行转发邮件,位于/etc/mail/access.db

aliases.db:用来定义邮件别名,位于/etc/mail/aliases.db

virtusertaable.db:用来设置虚拟账户,位于/etc/mail/virtusertable.db

***

四、Sendmail常规服务器配置

1.Sendmail服务器配置步骤

如果想要成功地假设Sendmail服务器,除了需要理解其工作原理外,还需要清楚整个设定流程,以及在整个流程中每一步的作用。一个建议Sendmail服务器设定流程主要包含一下几个步骤。

(1)配置好DNS

(2)检查是否安装Sendmail

(3)修改/etc/mail/sendmail.mc

(4)使用m4工具编译产生sendmail.cf文件,启动Sendmail服务器

(5)修改/etc/mail/access文件

(6)编译生成access.db

(7)修改/etc/mail/local-host-names。

(8)启动Sendmail服务器

(9)创建用户

(10)测试

2.Sendmail.cf和sendmail.mc

sendmail.cf是Sendmail的核心配置文件,有关Sendmail参数的设定大都需要修改文件。正因如此,sendmail的文件实在太复杂,可以说是天书,为了降低设置的复杂性,人们使用修改sendmail.mc文件来代替直接修改Sendmail.cf文件。

所以只需要通过修改sendmail.mc,再使用m4工具将结果导入sendmail.cf文件中即可。通过这种方法可以大大降低配置复杂度。、

sendmail.mc内容非常庞大,但大部分都被注释,以"dnl"开头随后的信息无效,我们再通常配置sendmail服务器的时候,只需要修改以下内容

116				DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

在括号中的Addr字段表示SMTP协议侦听的地址为127.0.0.1.我们在通常的配置中,需要将其改为题目所要求的网段或者0.0.0.0以来加大侦听范围,否则,邮件将无法正常发送信件

3.m4工具的使用

m4工具是一个强大的宏处理过滤器,他的复杂性完全不亚于sendmail.cf。在使用m4工具之前,请先确认服务器上安装了该软件包,默认情况下m4工具是被安装好的。

在配置过程中,需要利用m4工具将编辑后的sendmail.mc文件内容重定向到sendmail.cf文件中。这样可避免去直接编辑复杂的sendmail.cf文件;如下所示:

m4 sendmail.mc > sendmail.cf 

注意:此时如果sendmail报错,那么就是因为sendmail.cf中有错误,在第39行多空了一个,我们只需要把那多的一行删掉,在重启即可。

4.local-host-names文件

该文件用来定义收发邮件的主机别名,默认情况下该文件位于/etc/mail下,为了使sendmail服务正常工作,必须在该文件中添加主机名称或主机别名,否则提示错误。

假如邮件服务器有两个主机名称,分别是mail.skils.com和mail1.skills.com,而只想收到发给mail.skills.com的信件,发给mail1.skills.com的信件则不受,那么需要添加mail.skills.com到loxal-host-names中

如下所示:

# local-host-names - include all aliases for your machine here.
mail.skills.com
skills.com

如果想要所有主机别名都可以收发邮件,请参照上述例子把所有的主机别名都添加到文件中即可。

5.别名和群发设置:

用户别名是经常用到的一个功能,别名就是给用户起另外一个名字。例如给用户A起个别名为B,则以后发给B的邮件实际A用户来接收。

为什么要用到这个功能呢?

  • 首先root用户无法收发邮件,如果有发给root用户的信件必须为root用户建立别名。
  • 其次群发设置需要用到这个功能,企业内部在使用邮件服务的时候,经常会按照部门群发信件,发给财务部的邮件只能财务部的所有人才会收到,其他则收不到。

使用格式如下:

aliases:   user[,user,user,...]

其中alias邮件地址中的用户名,而recioient实际接收该邮件的用户。下面通过几个例子来说明用户别名的设置方法:

例1:

为user1账号设置别名为toto,为user2账号设置别名为popo

[root@localhost named]# vim /etc/mail/aliases     //创建aliases文件并对其修改
toto:   user1
popo:   user2

例2:

假设网络组在此服务器内都有一个电子邮件账户,现在我们要给网络组的所有成员发送一封相同内容的电子邮件。可以使用别名机制中的有机胺列表功能实现:

group: net1,ne2,net3,....

6.利用Access文件设置邮件中继

Access文件用于控制邮件中继(RELAY)和邮件的进出管理。可以利用Access文件来限制哪些客户端可以使用此邮件服务器来转发邮件。例如限制莫某个域的客户端拒绝转发邮件,也可以限制某个网段的客户端可以转发邮件。其格式如下:

对象				处理方式

对象和处理方式的表现形式并不单一,每一行都包含对象和对它们的处理方式。下面对常见的对象和处理方式的类型做简单介绍。

Access文件中的每一行都具有一个对象和一种处理方式,我们要根据环境需要进行二者的组合。

Connect:localhost.localdomain           RELAY
Connect:localhost                       			 RELAY
Connect:127.0.0.1  									 RELAY

例:允许192.168.0.0网段自由发送邮件,但拒绝客户端ftp.skills.com及除192.168.123.101以外的192.168.123.0网段的所有主机

Connect:localhost.localdomain          RELAY
Connect:localhost                       			RELAY
Connect:127.0.0.1                       				RELAY
Connect:192.168.0                     			    RELAY
Connect:192.168.123                    		    REJECT
Connect:ftp.skills.com                           REJECT
Connect:192.168.123.101                       OK

最后使用makemap命令生成新的access.db数据库

[root@localhost named]# cd /etc/mail
[root@localhost mail]# makemap hash access.db<access

7.设置SMTP验证

利用access.db文件实现邮件中继代理时,对于利用拨号上网的用户不太现实,此时可以使用SMTP验证机制对指定的用户进行邮件中继。

编辑/etc/mail/sendmail.mc文件,修改和认证相关的配置行。

 52  TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
 53  define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
 78 FEATURE(`no_default_msa', `dnl')dnl
 125 DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl

删除这几行每行开头的dnl

(1)TRUST_AUTH_MECH的作用是使Sendmail不管Access文件中如何设置,都能relay那些通过LOGIN、PLAIN、或DIGEST-MD5方式验证的邮件

(2)confAUTH_MECHANISMS的作用是确定系统的认证方式

(3)`Port=submission, Name=MSA, M=Ea的作用是开启认证,并以子进程运行MSA,实现邮件的账户和密码的验证。

7.2 使用m4命令重新生成/etc/mail/sendmail.cf文件

[root@localhost mail]# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

7.3 重启sendmail服务 和 saslauthd服务

systemctl restart sendmail  saslauthd

8.设置邮箱容量

设置用户邮件大小设置,原来限制为2MB,建议设置为20MB,注意**单位为字节**。2000000=2M,20000000=20M

 36 define(`UUCP_MAILER_MAX', `20000000')dnl

设置本地邮箱的域名

157 LOCAL_DOMAIN(`skills.com')dnl

设置完毕,使用m4工具生成新的sendmail.cf文件

m4 /etc/mail/sednmail.mc > /etc/mail/sendmail.cf

五、设置虚拟域用户

使用虚拟域。可以将发送给虚拟域的邮件投递到真是域的用户邮箱中。利用虚拟域也可以实现邮件列表的功能。这里的虚拟域可以是不存在的域,而真实域既可以是本地域,也可以是远程域名Inter中的域。

虚拟域是真实域的别名,通过虚拟域用户表/etc/mail/virtusertable.db,实现了虚拟域的邮件地址到真实域的邮件地址的重定向。

虚拟域用户表/etc/mail/virtuserable.db文件**是通过/etc/mail/virtuserable文件生成**的。如下所示

虚拟域地址				真实域地址

虚拟域地址和真实域地址之间用Tab分隔,该文件中虚拟域地址和真实域地址可以写完整也可以只有域名或用户名,如下几种格式皆可

@sales.com		@smile.com
[email protected]		user2
[email protected]		user1,user2,user3

如果要实现邮件列表功能,则各个真实域地址之间用逗号分隔。


例题:

Sendmail邮件服务器的域为smile.com,为该邮件服务器设置虚拟域skills.com。并为[email protected]指定虚拟域名别名[email protected]

具体步骤如下:

(1)配置DNS服务器,并设置虚拟域的MX资源记录

1 修改DNS区域解析文件,添加skills.com域

zone "skills.com" IN {
        type master;
        file "1";
        allow-update { none; };
};
zone "123.168.192.in-addr.arpa" IN {
        type master;
        file "2";
        allow-update { none; };
};

2 创建并编辑skills.com区域的正向解析文件/var/named/1

      cd /var/named/
      cp -a named.localhost 1
      cp -a named.loopback 2

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
@       IN      MX      10      mail.skills.com
mail    IN      A       192.168.123.101

(2) 将虚拟域skills.com加入到/etc/mail/local-host-named文件中

echo "skills.com" >> /etc/mail/local-host-names 

(3)配置邮件中继

利用vim编辑器编辑/etc/mail/access文件

[root@localhost named]# vim /etc/mail/access
skills.com				RELAY

使用makemap命令生成/etc/mail/access.db文件

[root@localhost named]# makemap hash /etc/mail/access.db < /etc/mail/access

设置虚拟域列表/etc/mail/virtuserable,并生成/etc/mail/virtuserable.db

使用vim编辑器编辑/etc/mail.access文件

vim /etc/mail/virtusertable
user1@skils.com			user1@smile.com

生成新的/etc/mail/virtusertable.db文件

makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable

重启sendmail服务 注:若此处重启失败 可以使用systemctl status sendmail(named) -l查看服务状态 一般来说查看的就是named.conf,sendmail.cf两个文件


六、 调试Sendmail服务器

1.使用Telnet登录服务器并发出邮件

当Sendmail服务器搭建好后,使用telnet工具可以快速的登录服务器的25端口并发出邮件。

2.下载telnet工具及mail工具

(mail工具可以快速的帮助我们查看各个邮件用户的邮箱)

yum install -y telnet mailx

下载完毕后,我们关闭防火墙

systemctl stop firewalld
setenforce 0

3.登录sendmail服务器

[root@localhost mail]#  
[root@localhost mail]# telnet localhost 25      //利用telnet命令登录邮件服务器25端口
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 localhost.localdomain ESMTP Sendmail 8.14.7/8.14.7; Mon, 15 May 2023 00:26:24 +0800
mail from:user1@smile.com    //设置发信人地址
250 2.1.0 user1@smile.com... Sender ok
rcpt to:user2@skills.com     //设置收件人地址
250 2.1.5 user2@skills.com... Recipient ok
data					//data表示要开始写信内容了
354 Enter mail, end with "." on a line by itself
this is a happy mail   
wish you happy everyday!    				//这两行都是信件的内容
.								//“.”表示结束信件内容 千万不要漏掉了
250 2.0.0 34EGQO8V001584 Message accepted for delivery
quit					//退出telnet服务器的命令
221 2.0.0 localhost.localdomain closing connection

telnet中,每当我们输入过指令后,服务器都会回复一段数字代码。熟知这些代码,有利于我们更好的掌握sendmail并判断服务器错误原因。

4.常见的回应代码及其含义

回应代码 说明
220 表示SMTP服务器开始提供服务
250 表示命令指定完毕,回应正确
354 开始输入信件的内容,并以“.”结束
500 表示SMTP语法错,无法执行命令
501 表示指令参数或引述的语法错误
502 表示不支持该命令

5.利用Mailx命令接收电子邮件

安装好并重启mailx后,我们可以输入以下命令来查询邮件

[root@localhost mail]# mail -u user2     使用命令查看user2的邮箱
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/mail/user2": 1 message 1 new 
>N  1 user1@smile.com       Mon May 15 00:27  13/520    //邮件编号
& 1    //查看邮件编号1
Message  1:
From user1@smile.com  Mon May 15 00:27:49 2023   //信件来源与发信时间
Return-Path: <user1@smile.com>     //返回路径
Date: Mon, 15 May 2023 00:26:24 +0800  //接收时间
From: user1@smile.com 
X-Authentication-Warning: localhost.localdomain: localhost [127.0.0.1] didn't use HELO protocol
Status: R

this is a happy mail
wish you happy everyday!    //邮件内容

& quit   //使用命令退出
Held 1 message in /var/mail/user2

6.用户邮件目录/var/spool/mail

我们可以在邮件服务器上进行用户邮件的查看,这可以确保邮件服务器邮件再正常工作了,Sendmail再/var/spool/mail目录中为每个用户分别建立单独的文件用于存放每个用户的邮件这些名字和用户名是相同的

[root@localhost mail]# ls /var/spool/mail
user1  user2

7.邮件队列

邮件服务器配置成功后,就能够为用户提供E-mail的发送服务了,但是如果接收这些邮件的服务器出现问题,或者因为其他原因导致邮件无法安全到达目的地。这封邮件可能就会失踪。所以sendmail采用了邮件队列来保存这些发送不成功的信件。

我们可以通过mailq来查询

[root@localhost mail]# mailq
                /var/spool/mqueue (1 request)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
34EGNRUH001537       40 Mon May 15 00:24 "this is a happy mail"<user1@skills.com
                 (host map: lookup (smile.com): deferred)
                                         user2@smile.com
                Total requests: 1

其中相关参数的说明:

Q-ID:表示此封邮件队列的编号

size:表示邮件的大小

Q-Time:邮件进入/var/spool/mqueue目录的时间,并说明无法立即发送的原因

Sender/Recipient:发信人和收信人的邮件地址


七、邮件服务器配置常记的几件事

第一件:一定把DNS服务器配置好。保证DNS服务器和sendmail服务器、客户端之间的通信正常

第二件:关闭防火墙 或者 打开服务器的端口

第三件:将selinux关闭 可以使用setenfroce 0

第四件:注意网卡在虚拟机的连接方式

猜你喜欢

转载自blog.csdn.net/2201_75288693/article/details/130668442