在 AIX 上使用 Sendmail 的有趣技巧

市场上有许多邮件服务器可供选择,使用 AIX 上的 Sendmail 被认为已经过时了。但是,Sendmail 仍然有用。本文提供使用 AIX 上的 Sendmail 的一些技巧。

Chris Gibson, AIX 专家, Australia Post

Chris Gibson 是一位 AIX 系统专家,居住在澳大利亚墨尔本市。他是 IBM CATE(System p 平台和 AIX 5L),同时也是 IBM Redbook “NIM from A to Z in AIX 5L” 的作者之一。


developerWorks 投稿作者

2010 年 5 月 31 日

简介

AIX 操作系统上引入 Sendmail 已经许多年了。尽管它很难管理,但是非常强大,可以实现一些有趣的功能。多年来,它帮助我克服了一些难题。本文讨论我发现的两个关于 AIX 上的 Sendmail 的有趣技巧。


基础知识

Sendmail 在 AIX 上的表现与其他 UNIX® 系统不太一样。因此,我先回顾一下基础知识。

使用 startsrc 命令启动 Sendmail 守护进程。例如:

# startsrc -s sendmail -a "-bd -q30m"

–s 标志指定要启动的子系统。–a 标志让 startsrc 用指定的参数执行子系统。

-bd 标志以守护进程(在后台运行)的形式启动 Sendmail,作为 Simple Mail Transfer Protocol (SMTP) 邮件路由器。–q 标志指定 Sendmail 守护进程在邮件队列中保存邮件的时间间隔。在这个示例中,Sendmail 每 30 分钟处理一次邮件队列。

要想在重新引导时自动地启动 Sendmail 守护进程,只需注释掉 /etc/rc.tcpip 文件中的以下行:

# vi /etc/rc.tcpip
start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"

执行以下命令显示 Sendmail 守护进程的状态:

# lssrc -s sendmail

使用 stopsrc 停止 Sendmail:

# stopsrc -s sendmail

Sendmail 的配置在 /etc/mail/sendmail.cf 文件中,Sendmail 邮件别名文件是 /etc/mail/aliases。

如果在 /etc/mail/aliases 文件中添加了别名,一定要重新构建别名数据库,并运行带 -bi 选项的 sendmail 命令或 /usr/sbin/newaliases 命令。这迫使 Sendmail 守护进程重新读取别名文件。

# sendmail -bi

要想在 Sendmail 配置文件中添加邮件中继服务器(智能主机),应该编辑 /etc/mail/sendmail.cf 文件,修改 DS 行并刷新守护进程:

# vi /etc/mail/sendmail.cf
DSsmtpgateway.xyz.com.au
# refresh -s sendmail

要想记录 Sendmail 活动,应该在 /etc/syslog.conf 文件中放以下条目,创建日志文件并刷新守护进程:

# grep mail /etc/syslog.conf
mail.debug  /var/log/maillog rotate time 7d files 4 compress
# touch /var/log/maillog
# refresh –s syslogd

用 Sendmail 解决难题!

Sendmail 帮助我解决了两个难题。这两个难题都源于我公司消息团队的要求。他们无法使用 Exchange 为一个邮件路由问题开发解决方案。我不确定是什么阻碍了他们,但是这给了我提高 Sendmail 技能的机会!

消息团队询问 AIX 系统是否有办法把以某一邮件地址为目的地的邮件转发到外部 SMTP 邮件服务器(即不由他们管理的邮件服务器)。但是,公司网络内的服务器由防火墙隔离。可以在公司网络上连接服务器的 "NAT'ed" IP 地址。它不是与 Internet 连接的主机。

第二个要求与第一个相似。消息团队需要把邮件转发到另一个 SMTP 服务器的另一个 SMTP 端口(即不是默认 SMTP 端口 25)。

为了保护公司机密,我修改了以下示例中的主机名和域名。组织的域名是 xyz.com.au,远程 SMTP 服务器是 notus.com.au


Sendmail 技巧 1

第一个问题要求把应该发送给 notus.com.au 上任何用户的邮件转发到 NotUs 邮件服务器。邮件要从用户的桌面邮件客户机发送到以下邮件地址:user@notus.com.au。邮件先到达公司邮件服务器。Exchange 服务器上的一条规则会把消息转发到 AIX SMTP 主机 (aixmta01)。aixmta01 上的 Sendmail 守护进程接收消息,把它传递给 notus.com.au SMTP 服务器,这个服务器最终把邮件投递到用户的邮箱。图 1 给出这个过程的示意图。

图 1. 从桌面到 NotUs SMTP 服务器的邮件流
显示过程的流程图,过程开始于用户邮件客户机,结束于 notus SMTP 服务器

为了实现这个过程,我必须在 AIX 服务器端对 Sendmail 配置做一些修改。首先,需要启用 mailer table 规则。我把清单 1 所示的条目放在 /etc/mail/sendmail.cf 文件中:

清单 1. sendmail.cf 文件中的条目
Kmailertable hash /etc/mail/mailertable.db
# not local -- try mailer table lookup
R$* <@ $+ > $*          $: < $2 > $1 < @ $2 > $3        extract host name
R< $+ . > $*            $: < $1 > $2                    strip trailing dot
R< $+ > $*              $: < $(mailertable $1 $) > $2   lookup
R< $~[ : $* > $*        $>MailerToTriple < $1 : $2 > $3         check -- resolved?
R< $+ > $*              $: $>Mailertable <$1> $2                try domain
# End of mailer table rules

Sendmail 中的 mailer table 用于覆盖某些域的路由,这些域不是本地主机名。

接下来,创建新的 /etc/mail/mailertable 文件。这个文本文件包含需要转发邮件的域名和接收邮件的 SMTP 服务器的名称。

notus.com.au	esmtp:[notus.com.au]

要发送到 notus.com.au 域的邮件会转发到指定的 SMTP 主机 notus.com.au。方括号 ([ ]) 让 SMTP 忽略对 notus.com.au 的 MX 记录查询,避免对这个不连接 Internet、无法通过 DNS 解析的主机产生 “mail loops back to self” 错误。

然后,必须使用前面创建的 mailertable 文本文件创建 mailertable 数据库 (mailertable.db)。这通过 makemap 实用程序完成:

# cd /etc/mail
# makemap hash /etc/mail/mailertable  < mailertable
# ls mailertable.db
mailertable.db

还需要把 NotUs 服务器添加到本地的 /etc/hosts 文件中。

10.1.1.20	notus.com.au

Sendmail 需要能够解析主机名,而这个服务器在 DNS 能够解析的范围之外。

完成这些修改之后,刷新 Sendmail 守护进程 (refresh –s sendmail)。为了确认 mailertable 条目是正确的,确认邮件会投递到正确的主机,我运行以下命令:

$ sendmail -bv user@notus.com.au
user@notus.com.au... deliverable: mailer esmtp, host [notus.com.au], 
user user@notus.com.au

–bv 标志启动 Sendmail 并请求确认命令的 Address 参数字段中指定的用户 ID。这个 sendmail 命令的响应是一个消息,它指出哪些 ID 可以解析为 mailer 命令。它并不尝试投递邮件。可以使用这个模式检查用户 ID、别名或邮件列表的格式。

根据前面的输出,我可以确认 Sendmail 会把与 notus.com.au 相关联的任何用户的所有邮件转发到 SMTP 主机 notus.com.au

查看 Sendmail 日志 (/var/log/maillog) 中记录的邮件活动也可以确认这一点。

        Dec 18 12:34:54 aixmta01 sendmail[16724]: hBI1Yr315494: 
        to=<admin@notus.com.au>, delay=00:00:01, xdelay=00:00:01, mailer=esmtp, 
        pri=120998, relay=notus.com.au. [10.1.1.20], dsn=2.0.0, stat=Sent (OK)

这是一个简单但有效的解决方案。配置和测试它只花了几分钟。另外,除了设置所需的时间之外,没有其他开销。


Sendmail 技巧 2

第二个需求也涉及把邮件转发到特定的服务器。但是,接收邮件的服务器并不监听默认的 SMTP 端口 25。它通过自己的特殊端口接收邮件。用户通过电子邮件把报告发送到一个 SAP 系统,然后 SAP 系统处理报告。SAP 系统 (sapaix01) 有自己的 SMTP 服务器,这个服务器监听端口 25250。邮件必须投递到 SAP 的这个端口。

由于某种原因,Exchange SMTP 中继服务器无法建立到 sapaix01 的端口 25250 的连接。它必须监听端口 25。否则,由于 “destination unreachable”,邮件会留在 Exchange 服务器邮件队列中。消息团队无法解决这个问题。这就需要 Sendmail 了!

消息团队要求实现以下过程(见图 2):

  1. 用户向 SAPRPT@xyz.com.au 发送电子邮件报告。
  2. Exchange 把电子邮件路由到 SAPRPT@aixmta01(AIX Sendmail 服务器)。
  3. Sendmail 服务器把电子邮件路由到 SAPRPT@sapaix1.xyz.com.au 的端口 25250。然后,SAP 自动地处理电子邮件报告。
图 2. 从桌面通过 Sendmail 服务器到达 SAP ICM SMTP 服务器的端口 25250 的邮件流
显示过程的流程图,过程开始于用户邮件客户机,结束于 SAP 服务器

我没有使用 SAP 系统的实际主机名 (sapaix01),而是创建了一个 DNS 别名 icm01。这个别名指向 SAP 服务器的实际 IP 地址。这有助于(在日志中)识别以 SAP 系统 “Internet Communication Manager (ICM)” SMTP 服务器作为目的地的通信流。我还在 /etc/hosts 文件中添加了 ICM DNS 别名的条目。

# grep -p icm /etc/hosts
10.1.1.22  icm01.xyz.com.au

这里同样可以使用 Sendmail mailertable 条目,但是需要有办法处理非默认的 SMTP 端口。

我在 /etc/mail/mailertable 文件中创建了一个新的 mailer 定义。然后,与前面所做的一样,使用 makemap 实用程序更新 mailertable 数据库。

# grep 25250 /etc/mail/mailertable        
icm01.xyz.com.au esmtp25250:[sapaix01.xyz.com.au]

这指定以 icm01.xyz.com.au 作为目的地的邮件应该通过 esmtp25250 转发到 Sendmail 主机 sapaix01.xyz.com.au。

在 /etc/mail/sendmail.cf 文件中,我创建了一个新条目,它把新的 SMTP 端口映射到 esmtp25250。这个 Mesmtp 条目指定,如果从 mailertable 定义调用 esmtp25250,那么在投递邮件时使用相关联的端口,即 sapaix01.xyz.com.au:25250

# grep 25250 /etc/mail/sendmail.cf
Mesmtp25250,    P=[IPC], F=mDFMuXa, S=EnvFromSMTP/HdrFromSMTP, 
R=EnvToSMTP/HdrFromSMTP, E=\r\n, L=990,
A=TCP $h 25250

/etc/mail/aliases 文件中还有一个条目,它让 Sendmail 把 “用户” SAPRPT 的所有邮件发送到 icm01.xyz.com.au 主机。

# grep –p SAPRPT /etc/mail/aliases
SAPRPT: @icm01.xyz.com.au

为了确认 mailertable 和别名会把邮件发送到正确的用户、主机和端口,我运行带 -bv 标志的 sendmail 命令:

# sendmail -bv SAPRPT
SAPRPT@icm01.xyz.com.au... deliverable: mailer esmtp25250, host 
[sapaix01.xyz.com.au], user SAPRPT@icm01.xyz.com.au

这确认要发送给 SAPRPT@icm01.xyz.com.au 的邮件会转发到 sapaix01.xyz.com.au 的 SMTP 端口 25250。/var/log/maillog 中记录的 Sendmail 活动也确认邮件成功地投递到了 sapaix01 的端口 25250。

Aug  9 20:02:59 aixmta01 mail:info sendmail[299822]: k79K2xh299822:
from=<Chris.Gibson@xyz.com.au>, size=1384, class=0, nrcpts=1,
msgid=<E45223DDBB33774EA13C993829A75AA504B203E5@EXCHANGE.xyz.com.au>, 
proto=ESMTP, daemon=MTA, relay=exchange.xyz.com.au [10.1.1.24]
        
Aug  9 20:03:00 aixmta01 mail:info sendmail[68896]: k79K2xh299822: 
to=SAPRPT@icm01.xyz.com.au, delay=00:00:01, xdelay=00:00:01, 
mailer=esmtp25250, pri=31582, relay=sapaix01.xyz.com.au. [10.1.1.22], 
dsn=2.0.0, stat=Sent (OK)

结束语

我希望您觉得这些技巧有意思。市场上有许多邮件服务器可供选择,使用 AIX 上的 Sendmail 被认为已经过时了。但是,Sendmail 仍然有用。它可以帮助您或其他人解决难题,即使只作为问题的临时解决方案。

参考资料

学习

  • 了解如何在代码中使用 Mailertables
  • 了解 makemap 以及在哪里获得它。
  • 进一步了解如何使用 替代端口 发送邮件。
  • Funky routing of mail on non-standard ports 提供关于使用替代端口的更多信息。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


这是您第一次登陆到 developerWorks,已经自动为您创建了您的概要文件。 选择您概要文件中可以公开的信息的信息(如姓名、国家/地区,以及公司),这些信息同时也会与您所发布的内容相关联。 您可以随时更新您的 IBM 账号。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=493387
ArticleTitle=在 AIX 上使用 Sendmail 的有趣技巧
publish-date=05312010