📄 1382.html
字号:
图3-1 sendmail.cf的层次结构<br>
<br>
安全起见,在配置文件/etc/sendmail.cf中指定的文件、目录名一般都使用绝对路径,例如:使用/var/spool/mqueue,而不使用mqueue。在我们讲解这些文件之前,首先运行如下命令以收集一个文件列表:<br>
<br>
% grep = / /etc/sendmail.cf<br>
<br>
<br>
注:如果你使用的是V8.7以上版本的sendmail,则你需要查找的应该改为”/[^0-9].*/”.<br>
<br>
这个命令将会出现类似如下的结果:<br>
<br>
<br>
O AliasFile=/etc/aliases<br>
#O ErrorHeader=/etc/sendmail.oE<br>
O HelpFile=/usr/lib/sendmail.hf<br>
O QueueDirectory=/var/spool/mqueue<br>
O StatusFile=/etc/sendmail.st<br>
#O UserDatabaseSpec=/etc/userdb<br>
#O ServiceSwitchFile=/etc/service.switch<br>
#O HostsFile=/etc/hosts<br>
#O SafeFileEnvironment=/arch<br>
Mlocal,P=/bin/mail, F=lsDFMAw5:/|@rmn, S=10/30, R=20/40,<br>
Mprog, P=/bin/sh, F=lsDFMoeu, S=10/30, R=20/40, D=$z:/,<br>
<br>
<br>
请注意,有些行是以字母O开始,有些行是以字母M开始,有些行是以#开始的。以字母O开始的行是配置选项。字母O后面紧跟着选项的名字。选项的值指出了sendmail使用的文件。例如,AliasFile定义了本地的aliases数据库文件。以M开始的行则定义了分发代理。以#开始的行就是注释。<br>
<br>
首先我们考察以O开始的选项行。然后再分析以M开始的分发代理选项。<br>
<br>
1.1.1 aliases文件<br>
<br>
aliasing就是将接收者的名字转换另一个名字。一种情况下是将一些通用名字(如root、webmaster)转换成真正的用户名。另一种情况下是将一个名字转换成多个名字的列表(如使用邮件列表)。<br>
<br>
Aliases文件在sendmail.cf文件中的AliasFile选项中指定,例如:<br>
<br>
O AliasFile=/etc/aliases<br>
<br>
<br>
以下是一个aliases文件的简要实例:<br>
<br>
# Mandatory aliases.<br>
postmaster: root<br>
MAILER-DAEMON: postmaster<br>
# The five forms of aliases<br>
John_Adams: adamj<br>
xpres: ford,carter,bush<br>
oldlist: :include: /usr/local/oldguys<br>
nobody: /dev/null<br>
ftphelp: |/usr/local/bin/sendhelp<br>
<br>
你的aliases文件可能更长、更复杂的,不过,以上这个示例也显示了aliases所有可能的构成。<br>
<br>
以#开始的行,是注释行。空行被忽略不计。第一行就是一个注释行,它指出了2、3两行是每一个aliases文件被必须强制拥有的。所有的别名格式都是一样的,一个名字(别名)和一个要改为成的名字(原名)。别名在“:”号的左边,原名在“:”号的右边。名字是不区分大小写。例如:POSTMASTER,Postmaster以及postmaster都是相同的。<br>
<br>
如果信封上列出的接收者名字是本地用户的话,sendmail程序就会查找aliases文件。如果sendmail发现接收者名字如果与aliases文件中的“:”号左边的名字相匹配,就将接收者名字替换为“:”号右边的名字。例如:发给本地的postmaster的信,会被转变成为发给root的信。<br>
<br>
在一个名字被替换后,会使用这个被替换后的名字继续查找,直到没有匹配的名字为止。如MAILER-DAEMON首先被转变为postmatser,然后postmaster又被改被为root。由于没有一个以root开始的别名项,所以转换过程到此结束,信件最后被传送到root的信箱中去。<br>
<br>
任何一个aliases文件必须有一个将postmaster转变成实际用户的别名项。因为当邮件出现问题时,总是会生成一个错误报告的信,发给postmaster。所以最好将这样的信发给邮件的系统管理员。<br>
<br>
当电子邮件被退回时,将会发给MAILER-DAEMON。所以这个别名是必须的。没有这个设置的话,退回的信将会在发件人与收件人之间不断来回传送。<br>
<br>
Aliases文件中有五种类型:<br>
<br>
John_Adams: adamj<br>
xpres: ford,carter,reagan,bush<br>
oldlist: :include: /usr/local/oldguys<br>
nobody: /dev/null<br>
ftphelp: |/usr/local/bin/sendhelp<br>
<br>
首先我们看一下第一行,这一行的格式与我们前面的例子相似,这一句让sendmail程序将发给John_Adams的信都给真实用户adamj。<br>
<br>
xpres那一行则象大家演示了如何将一个名字扩展到一组名字,发给xpres的信件将扩展为ford、carter、reagan、bush,并使用这些名字进行aliases处理,直到无匹配为止。然后将信件的副本分发给每一个。<br>
<br>
而oldlist这行,则象大家演示了如何从一个文件中读取一组名字,本例中就是让sendmail将发给oldlist的信息扩展为在/usr/local/oldguys文件里的用户列表。请记住它的格式,在文件绝对路径名前需加上“:include:”。<br>
<br>
nobody这一行,象大家演示了如何用文件名代替别名。发到这个邮件中的内容将添加到所指定的文件后面去。这里指定的是/dev/null。这样就是指发到nobody的信件将会被简单地丢弃。<br>
<br>
最后一行,ftphelp那一行象大家演示了如何用程序名代替别名。字符“|”使sendmail将这个邮件信息通过管道发给所指定的程序。<br>
<br>
aliases文件可能变得非常复杂。它能够用于解决许多特殊的问题。aliases文件的更多的内容将在第24章:别名中详述。<br>
<br>
1.1.2 邮件队列目录<br>
<br>
在很多情况下,都可能使一个电子邮件临时无法发送,例如:远程主机已经down了,或临时出现了磁盘错误。为了确保邮件最终能够发送成功,sendmail将会把它们存到邮件队列目录中,直到发送成功为止。<br>
<br>
配置文件中的选项QueueDirectory用于指定sendmail的邮件队列目录:<br>
<br>
O QueueDirectory=/var/spool/mqueue<br>
<br>
<br>
这里指出的目录名必须是全路径名。<br>
<br>
如果你用足够的权限,看一看队列目录。如果没有邮件等待发送的话,它们可能是空的。如果它们不是空的,那么可能包括形如以下的文件:<br>
<br>
dfQAA07038 dfMAA08000 qfQAA07038 qfMAA08000<br>
<br>
<br>
当一个邮件信息进入了邮件队列,将分成两个部分,每一个部分都保存在一个文件中。头信息存在一个文件名是以qf开头的文件中。邮件内容部分则存在一个文件名是以df开头的文件中。<br>
<br>
上例中,有两个邮件在邮件队列中。其中一个被标识为QAA07038,而另一个被标识为MAA08000。<br>
<br>
队列文件的格式与处理方法,我们将在第23章:邮件队列中详细说明。<br>
<br>
1.2本地分发的角色<br>
<br>
sendmail的另外一个角色则是分发电子邮件信息给本地用户。一个本地用户在本地系统上有一个邮箱。分发本地邮件,就是将其附加到这个用户的邮箱中。<br>
<br>
通常,sendmail不是直接将邮件信息直接放到文件中去。在上一节中,我们看到,只有指定sendmail程序将邮件附加到一个文件中时,才这样做的。但这是一个例外,不是规则,sendmail调用其他程序执行分发。被调用的程序叫做分发代理。<br>
<br>
在你的sendmail.cf文件中,有两行用来定义本地分发代理,其中一个用于在本地系统中分发邮件:<br>
<br>
Mlocal,P=/bin/mail, F=lsDFMAw5:/|@rm, s=10, R=20/40,<br>
Mprog,P=/bin/sh, F=lsDFMeu, S=10, R=20/40, D=$z:/,<br>
<br>
程序/bin/mail用来将邮件附加到用户的邮箱中。程序/bin/sh用来运行其它程序来处理分发。<br>
<br>
1.2.1 分发到邮箱<br>
<br>
配置文件中,以Mlocal开始的行定义了邮件如何附加到用户的邮箱文件中去。通常是使用/bin/mail程序,也可以使用deliver或mail.local程序。<br>
<br>
在UNIX系统中,用户的邮箱是一个单独文件,其中个邮件信息。通常UNIX系统约定(但不是唯一的可能)每一个在邮箱文件中邮件信息以一个五字节长的“From ”(4个字母、一个空格)开始,并以一个空行结束。<br>
<br>
Sendmail程序并不知道也不关心用户的邮箱文件是什么样的。而只关心将邮件添加到邮箱文件中的程序名称。例如:/bin/mail。以M开头的配置行定义了分发代理,详细的介绍可以参看第6章:Mail中枢和分发代理,以及第30章:分发代理。<br>
<br>
1.2.2 借助程序分发<br>
<br>
在1.1小节中的aliases文件示例中的ftphelp行,是以字符“|”开始的程序名作为Mail的目的地:<br>
<br>
ftphelp: |/usr/local/bin/sendhelp<br>
<br>
<br>
在此情况下,发送到ftphelp中的mail,经过别名转换到|/usr/local/bin/sendhelp中。以字符“|”开始的目的地地址告诉sendmail启动这个程序,而非添加到一个文件中去。这主要是实现使用一个邮件程序对接收的邮件作一些有用的处理。<br>
<br>
Sendmail程序不直接运行邮件的分发程序。而是运行一个shell,并告诉shell运行这个程序。这个shell的名字在配置文件中以Mprog开始的行中定义:<br>
<br>
Mprog,P=/bin/sh, F=lsDFMeu, S=10, R=20/40, D=$z:/,<br>
<br>
<br>
在这个例子是,指定的shell是/bin/sh。也可以使用/bin/ksh或smrsb。<br>
<br>
1.3网络传输角色<br>
<br>
sendmail还有一个角色就是负责将邮件传送到另一台机器。当sendmail确定接收者不在本地系统中时,邮件将传送出去。下列是典型的配置文件中定义负责将邮件传送到其它机器的分发代理:<br>
<br>
<br>
MsmtpP=[IPC], F=mDFMuX, S=11/31, R=21, E=<br>
, L=990,<br>
MuucpP=/usr/bin/uux, F=DFMhuUd, S=12, R=22/42, M=10000000,<br>
<br>
<br>
而在实际的配置文件中可能会有一些不同。上面例子中,smtp可以写为ether或ddn或其它的一些东西。而uucp可以写为suucp或uucp-dom。一个重要的知识点就是有一些分发代理处理本地分发,另外一些处理跨越网络的分发。<br>
<br>
1.1.1 TCP/IP<br>
<br>
sendmail程序内在拥有在同一种网络中传输邮件的能力,那就是使用TCP/IP;下列的行就是用来指示sendmail去处理:<br>
<br>
<br>
MsmtpP=[IPC], F=mDFMux, S=11/31, R=21, E=<br>
, L=990<br>
<br>
其中[IPC]可以写作[TCP],它们是完全等价的。<br>
<br>
当sendmail程序在TCP/IP网络中传输mail时,首先发送“信封”上的发信人主机名到另一个站点。如果这个站点认可这个发信人的主机名是合法的,本地的sendmail程序将发送“信封”上的收信人列表。这个站点针对每一个收件人确定接受或拒绝。如果一些收件人被接受,则本地的sendmail程序发送出邮件信息(信头和信体)。<br>
<br>
1.1.2 UUCP<br>
<br>
在配置文件中设置sendmail如何通过UUCP传输邮件的行如下所示:<br>
<br>
MuucpP=/usr/bin/uux, F=DFMhuUd, S=12, R=22/42, M=10000000,<br>
<br>
这行告诉sendmail程序使用/bin/uux来通过UUCP网络传输邮件。<br>
<br>
1.1.3 其它协议<br>
<br>
sendmail程序还可通过其它网络协议传输mail。你可以从我们前面做过grep操作的输出结果中发现它们,它们看上去象:<br>
<br>
Mfax, P=/usr/local/lib/fax/mailfax, F=DFMhu, S=14, R=24, M=100000,<br>
Mmail11, P=/usr/etc/maill11, F=nsFx, S=15, R=25, A=mail11 $g $x $h $u<br>
Mmac,P=/usr/bin/macmail, F=CDFMmpsu, R=16, S=16, A=macmail –t $u<br>
<br>
Mfax行定义了使用sendmail发送FAX的途径。FAX通过电话线传输文件的图形影象。在这个配置中,程序/usr/lib/fax/mailfax,将一个邮件文件的图形影象FAX出去。<br>
<br>
Mmail11行定义了使用mail11程序在DEC网络上传输邮件,一般应用于DEC系统。<br>
<br>
Mmac行定义了在Macintosh电脑系统的AppleTalk网络上传输邮件。<br>
<br>
在所有的这些例子中,sendmail通过专用的服务程序在网络上发送电子邮件。记住,sendmail本身只能直接在基于TCP/IP的网络上工作。<br>
<br>
1.4 Daemon角色<br>
<br>
就象sendmail能够在基于TCP/IP的网络上传输电子邮件一样,它也能够接收来自于网络的电子邮件。为了实现这个,就必须运行在daemon(守候进程)模式。Daemon是一个运行在后台,不受终端约束的程序。<br>
<br>
作为一个daemon,sendmail通常在系统启动时就运行。当一个电子邮件发送到你的机器时,远程机器将与运行在你机器上的sendmail daemon“商谈”。<br>
<br>
想观察你的系统如何将sendmail运行在daemon模式下,你可执行以下任何一条命令:<br>
<br>
% grep sendmail /etc/rc* (BSD系统)<br>
% grep sendmail /etc/init.d/* (SysV系统)<br>
% grep sendmail /etc/*rc (HP-UX系统)<br>
<br>
一个典型的输出是:<br>
<br>
/etc/rc.local:if [-f /usr/lib/sendmail –a –f /etc/sendmail.cf]; then<br>
/etc/rc.local: /usr/lib/sendmail –bd –q1h; echo –n ‘ sendmail’<br>
<br>
上面的第二行是sendmail在系统启动时运行的命令。<br>
<br>
/usr/lib/sendmail –bd –q1h<br>
<br>
命令选项-bd是使sendmail运行在daemon模式下。命令选项-q1h是让sendmail每小时唤醒一次,处理队列。<br>
<br>
[目录]<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
<br>
如何运行sendmail<br>
<br>
2.如何运行sendmail<br>
一种运行sendmail的方法是,直接在命令行上附加接收者参数。例如:下面命令就是发一个邮件消息给george。<br>
<br>
% /usr/lib/sendmail george<br>
<br>
你也可以同时给出多个接收者。例如,发一个邮件给george,truman和teddy:<br>
<br>
% /usr/lib/sendmail george,truman,teddy<br>
<br>
sendmail程序可以接受两种不同的命令行参数。不以“-”字符开始的参数是接收者,如上面的george。而以“-”字符开始的参数则是影响sendmail运行的开发选项。所有的命令行开关选项的解释,<br>
<br>
标记 说明<br>
-b 设置运行模式<br>
-v 运行于冗长模式<br>
-d 运行于调试模式<br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -