sendmail: 介绍与配置

作者:Eric Jorn Seneca

随着互联网的增长,电子邮件已迅速成为在公众中传播信息的主要途径。随着对快速、廉价和可靠的电子邮件的需求增长,越来越多的人转向 Linux 以提供快速、廉价和可靠的解决方案。

sendmail 最初由 Eric Allman 于 1979 年开发,名为 "delevermail",首次随 BSD 4.0 发布。该程序不是很灵活,需要在编译时进行配置。随着 TCP 协议和其他因素的增长,很明显 delevermail 不够灵活,无法处理这些新需求。Eric Allman 不得不从头开始重新创建 sendmail,而他所创建的程序已成为 MTA 的标准。sendmail 的设计宗旨是容忍不符合协议的消息,而不是拒绝这些消息。对于那些从未配置过电子邮件服务器的个人,本文将演示在全新安装 Red Hat Linux 7.1 后如何配置 sendmail 8.11.2。

默认情况下,sendmail 8.11 在 Red Hat Linux 7.1 安装期间安装。随着 Red Hat 多年来的发展,安装过程变得非常容易。尽管本文不会详细介绍安装细节,但在 Red Hat CD 集中提供了更多文档。

为了使您的新电子邮件服务器工作,您必须首先理清所有 DNS 问题。首先,将新电子邮件服务器的主机名和 IP 地址添加到您的 DNS 服务器,并使用 nslookup 确认地址。

[root@testmail /root]# nslookup -sil testmail.blank.com
Server:         192.168.100.1
Address:        192.168.100.1#53
Name:   testmail.blank.com
Address: 192.168.100.134

同样重要的是,您的管理员要设置反向 DNS 条目,以防止邮件传递延迟。大多数现代电子邮件服务器都使用反向查找作为邮件传输的身份验证手段。同样,使用 nslookup 命令在您的 IP 地址上确认此设置是否正确。

[root@testmail /root]# nslookup -sil 192.168.100.134
Server:         192.168.100.1
Address:        192.168.100.1#53
134.100.168.192.in-addr.arpa    name = TESTMAIL.blank.com.

正如您所看到的,DNS 条目已设置并正常工作,现在让我们继续实际配置 sendmail。默认情况下,Red Hat 上的 sendmail 安装仅允许本地主机上的 SMTP 流量。netstat -nl 的输出将显示所有具有守护进程监听的端口;请注意显示 127.0.0.1:25 的行。这意味着服务器仅在环回接口上监听端口 25 (SMTP) 的连接。

[root@testmail /root]# netstat -nl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address
State
tcp        0      0 0.0.0.0:32768           0.0.0.0:*
LISTEN
tcp        0      0 0.0.0.0:111             0.0.0.0:*
LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*
LISTEN
tcp        0      0 127.0.0.1:25            0.0.0.0:*
LISTEN
udp        0      0 0.0.0.0:32768           0.0.0.0:*
udp        0      0 0.0.0.0:667             0.0.0.0:*
udp        0      0 0.0.0.0:111             0.0.0.0:*
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     1119   /dev/gpmctl
unix  2      [ ACC ]     STREAM     LISTENING     1172
/tmp/.font-unix/fs7100

这将阻止您的邮件守护进程接受来自除本地主机以外的任何计算机的电子邮件。要解决此问题,我们必须告诉 sendmail 监听外部接口上的连接。在我们的新服务器的情况下,只有一张以太网卡,其中 eth0 是外部接口。要确认 eth0 上的 IP,只需执行 ifconfig。根据您的配置,此 IP 可能与您的 DNS 服务器定义的地址不同,但在我们的示例中,地址是相同的。

   
[root@testmail /root]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:60:97:DE:E9:99
          inet addr:192.168.100.134  Bcast:192.168.100.255
Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12421 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          Interrupt:10 Base address:0xe000
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
 

这台机器在 eth0 接口上的地址为 192.168.100.134。获得该地址后,编辑 /etc/sendmail.cf 文件并将 sendmail 守护进程配置为监听该地址。

# SMTP daemon options
O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA

更改为

O DaemonPortOptions=Port=smtp,Addr=192.168.100.134, Name=MTA

完成此任务后,保存此文件并使用 rc 脚本 /etc/init.d/sendmail 重新启动 sendmail 守护进程。

[root@testmail /root]# /etc/init.d/sendmail restart
Shutting down sendmail:                                    [  OK  ]
Starting sendmail:                                         [  OK  ]
[root@testmail /root]#

现在检查 netstat -nl 命令是否发生了更改。正如您所看到的,输出清楚地表明守护进程 (sendmail) 正在监听分配给我们的接口 eth0 的 IP 地址 192.168.100.134 的端口 25。

[root@testmail /root]# netstat -nl
Active Internet connections (only servers)
Proto Recv-Q send-Q Local Address           Foreign Address
State
tcp        0      0 0.0.0.0:32768           0.0.0.0:*
LISTEN
tcp        0      0 0.0.0.0:111             0.0.0.0:*
LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*
LISTEN
tcp        0      0 192.168.100.134:25      0.0.0.0:*
LISTEN
udp        0      0 0.0.0.0:32768           0.0.0.0:*
udp        0      0 0.0.0.0:667             0.0.0.0:*
udp        0      0 0.0.0.0:111             0.0.0.0:*
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     1119   /dev/gpmctl
unix  2      [ ACC ]     STREAM     LISTENING     1172
/tmp/.font-unix/fs7100
[root@testmail /root]#

现在我们已经让 sendmail 接受外部连接,我们需要分配可以接受的域。这可以通过 /etc/mail/local-host-names 文件来完成。只需将域名 blank.com 放入文件中即可。

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

将此信息保存在此文件中后,使用 /etc/init.d/sendmail restart 中的 rc 脚本 sendmail 重新启动 sendmail 守护进程。sendmail 可以在同一服务器上接受多个域的电子邮件。每次要添加新域时,将域名插入此文件。

您现在拥有一个来自本地主机的完全工作的电子邮件服务器。它可以接受来自世界任何地方的电子邮件,但只能从本地主机发送电子邮件或中继电子邮件。另一个默认安全功能是 sendmail 不允许中继任何邮件,以防止垃圾邮件源自您的服务器。如果您的用户直接登录到服务器,则此配置不需要修改。但是,如果您的组织像大多数组织一样,客户端正在从远程站点使用电子邮件。如果您的用户使用 KMail 或 Outlook Express 等客户端,您将需要允许这些机器使用您的新服务器中继电子邮件,但您不希望完全开放您的站点进行中继。这可以通过将以下行添加到 /etc/mail/access 文件并在保存该文件后运行命令 make access.db 来完成。

blank.com                       RELAY
# Check the /usr/share/doc/sendmail-8.11.2/README.cf file for a
description
# of the format of this file. (search for access_db in that file)
# The /usr/share/doc/sendmail-8.11.2/README.cf is part of the
sendmail-doc
# package.
#
# by default we allow relaying from localhost...
localhost.localdomain           RELAY
localhost                       RELAY
127.0.0.1                       RELAY
blank.com                         RELAY
 
[root@testmail mail]# make access.db
[root@testmail mail]#

make access.db 命令会将您的新设置包含在 sendmail 用于确定谁可以从您的服务器中继电子邮件的哈希数据库中。这将允许来自 blank.com 域内部的连接从您的新邮件服务器中继电子邮件,并防止非成员使用该服务。也可以放置一个 IP 子网,例如 192.168,以限制在一个域内。请记住,如果此设置过于开放,垃圾邮件发送者可能会从您的系统反弹大量电子邮件。

现在您可以接受来自世界任何地方的电子邮件,配置了您的域,并允许为批准的客户端中继电子邮件,您可能希望允许远程访问该邮件。这可以通过 IMAP 或 POP 来完成。使用默认服务器安装,并非所有必需的软件包都已安装,以使 POP/IMAP 邮件工作。这些服务可以通过安装 imap-2000-9 rpm 软件包获得。要检查此软件包的安装状态,请使用以下命令:rpm -aq | grep -i imap。如果未找到软件包,请将 Red Hat 7.1 安装光盘集的 Disk 2 插入您的 CD-ROM 并挂载该介质。要完成此操作,请使用 mount /dev/cdrom /mnt/cdrom 命令。

[root@testmail mail]# mount /dev/cdrom /mnt/cdrom
mount: block device /dev/cdrom is write-protected, mounting read-only
(Successful Mount of Read-Only Media)
Once mounted you can install the package with rpm -Uvh
        /mnt/cdrom/RedHat/RPMS/imap-2000-9.i386.rpm.
[root@testmail mail]# rpm -Uvh
/mnt/cdrom/RedHat/RPMS/imap-2000-9.i386.rpm
Preparing...                ###########################################
[100%]
   1:imap                   ###########################################
[100%]
As you can see, when I run the rpm search, rpm -aq | grep -i
imap the IMAP package is displayed with output.
[root@testmail mail]# rpm -aq | grep -i imap
imap-2000-9
[root@testmail mail]#

安装正确的软件包后,您现在需要启用 POP3 连接到您的新电子邮件服务器。这可以在 /etc/xinetd.d 目录中通过修改 ipop3 文件来完成。将 disable 的值设置为 no,然后保存文件。请记住保持文件中的大小写。

# default: off
# description: The POP3 service allows remote users to access their mail
\
#              using an POP3 client such as Netscape Communicator, mutt,
\
#              or fetchmail.
service pop3
{
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/ipop3d
        log_on_success          += USERID
        log_on_failure          += USERID
        disable                 = no
}

现在您需要重新启动 xinetd 守护进程以使新设置生效。这可以通过使用 rc 脚本 /etc/init.d/xinetd 来实现。只需发出如下所示的 restart 命令。

[root@testmail xinetd.d]# /etc/init.d/xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]
[root@testmail xinetd.d]#

现在向您的新服务器发送一封测试电子邮件,并通过您喜欢的 pop 客户端连接到服务器。您现在应该能够通过 POP 协议访问您的电子邮件。

关于您的新服务器的最后一个考虑因素是性能。如果客户端流量是从防火墙后面发起的,您可能会收到有关 POP 服务器连接速度慢的投诉。此延迟的原因是您的电子邮件服务器与客户端启动了 IDENT 会话,以确认客户端的身份。如果对该查询没有响应,服务器将调用默认设置为 5 秒的超时值。此值可以减少到 1 秒,以消除 IDENT 引起的大部分延迟。要更改此值,请编辑 /etc/sendmail.cf 文件,并将超时值减小到所需的值。

# timeouts (many of these)
#O Timeout.ident=5s
change to
O Timeout.ident=1s

您的电子邮件服务器现在正在工作并为您的用户提供服务。sendmail 还有许多超出本文范围的配置。Linux 将为您的电子邮件需求提供非常稳定、强大的平台。要查找有关 sendmail 的更多信息,请访问 www.sendmail.org

Eric Jorn Seneca 是路易斯安那州巴吞鲁日的一名 UNIX 系统工程师。

电子邮件:eseneca@cs.selu.edu

加载 Disqus 评论