Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

Sendmail第七章 宏

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  sendmail程序将读取并分析client.cf文件。由于在这个配置文件中并没有错误,所以sendmail将不会打印错误信息。

7.3预定义宏

  在sendmail中,有一些内置的宏。你已经在分发代理的定义中看到过了u(接收者的用户名)和h(接收者的主机名)。它们无须在配置文件中定义,它们是sendmail定义的。这种宏,我们称之为预定义宏。下表中列出部分预定义宏:

  表7-1:一些预定义宏

  宏名 描述


n 发送者错误消息标志符
v 当前运行的sendmail的版本
w 短主机名
j 规范的主机名
m 域名
k UUCP节点名
b RFC1123格式的日期
_ 身份鉴别信息
opMode 当前操作模式(在V8.7版之后才有)

  在运行sendmail时,只需加上-d35.9参数,就可以显示出所有宏的定义:

% ./sendmail –d35.9 –Cclient.cf –bt </dev/null

  尽管client.cf文件如此小,但这个命令的输出惊人地长:


define(* as $*)
define(+ as $+)
define(- as $-)
define(= as $=)
define(~ as $~)
define(# as $#)
define(@ as $@)
define(: as $:)
define(> as $>)
define(? as $?)
define(| as $|)
define(. as $.)
define( [ as $[)
define(] as $])
define(( as $()
define() as $))
define(& as $&)
define(0 as $0)
define(1 as $1)
define(2 as $2)
define(3 as $3)
define(4 as $4)
define(5 as $5)
define(6 as $6)
define(7 as $7)
define(8 as $8)
define(9 as $9)
define(n as $MAILER-DAEMON)
  define(v as 8.8.4)
define(w as here.us.edu)
define(j as here.us.edu)
define(m as us.edu)
define(k as here)
define(b as Fri,13 Dec 1996 07:11:47 –0700 (PDT))
define(_ as you@localhost)
define(opMode as t)
redefine(w as here)
define(REMOTE as mailhost)

  不同版本的sendmail的输出将不同。例如,l、o和e在V8.7以前的版本中存在,而在8.7以后的版本中就没有了。前面27行显示出了sendmail为operators(操作者,将在下一章中具体说明)预留的宏。而后面的11行则是我们现在所感兴趣的。这11行中,前10行都是senmail程序预定义的,最后1行则是用户自己定义的。

  这些输出可以显示出另一个概念。一些内部宏是在读取配置文件之前定义的,你可以在client.cf文件中改变。例如我们要改为w,则只需在配置文件中加入一行:

Dwmyhost.my.domain

  使用了这行配置文件后,宏w的值就从here.us.edu变成了myhost.my.domain了。

  注意,在以上输出中并没有显示h和u宏。这些宏,尽管在内部定义了,但它们是直到邮件发送后才被赋予实际的值的。你不能够在你的配置文件中修改它们,因为它们在配置文件被读取之后才定义的。

  最后,请注意只有V8的sendmail会为宏设置适当的缺省值。所有老版本的sendmail需要你手动地在client.cf文件中设置e、l、n、o以及q的缺省值。

7.3.1 主机名

  本地主机名由两部分组成。主机名部分就是机器名,不包括“.”(如here)。而域名部分则至少有由“.”隔开的两个部分(如us.edu)。而全规范名(fully qualified)则是由主机名加上“.”,然后再加上域名构成。(例如:here.us.edu)。全规范名才能唯一标识一台机器。

  本地机器的主机名也需要规范化。一台机器可以有多个名字(如mailhost或printserver等等),但只能有一个是正式的。你可以执行hostname命令来获取这个正式的名字:


% hostname
here.us.edu

  下面我们就来看一下sendmail是如何解释你的本地主机名。我们以-d0.1的参数来执行sendmail:


% ./sendmail –Cclient.cf –d0.1 –bt </dev/null
version 8.8.4
Compiled with:LOG NAMED_BIND NDBM NETINET NETUNIX NIX SCANF XDEBUG
= = = = = = = = = SYSTEM IDENTITY (after readcf) = = = = = = = = =
   (short domain name) $w = here
   (canonical domain name) $j = here.us.edu
  (subdomain name) $m = us.edu
   (node name) $k = here
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 

  这里经常容易出错。例如,如果你并未与Internet连接,你可能就不会有一个合法的域名。或者你可能运行NIS而使得在hosts.byname映射中只有短主机名。一个很重要的事情就是观察以上输出中,sendmail是否正确地发现了你的短主机名和规范主机名:


(short domain name) $w = here
(canonical domain name) $j = here.us.edu
(subdomain name) $m = us.edu

  如果这里有错误,你需要修复引起这个错误的系统问题。在系统级,调查以下问题:

  1)/etc/hosts文件。你可能在这个文件中仅列出了短主机名。对于sendmail 8.7以前的版本,它需要你在这个文件的最开始一行列出全规范主机名。而从sendmail 8.7开始,新版的sendmail只需要在这个文件中存在全规范主机名就可以了。

  2)nis映射。确认主机名能够被DNS查寻。

  3)nsswitch.conf或svc.conf文件。确定正确的主机名查寻方法在此列出。

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Sendmail第六章:邮件中枢与分发代理   下一篇:Sendmail第八章:规则

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号