⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 6.html

📁 介绍linux下文件和设备编程
💻 HTML
📖 第 1 页 / 共 5 页
字号:
2.如何运行sendmail<p>  一种运行sendmail的方法是,直接在命令行上附加接收者参数。例如:下面命令就是发一个邮件消息给george。<p>% /usr/lib/sendmail george<p>  你也可以同时给出多个接收者。例如,发一个邮件给george,truman和teddy:<p>% /usr/lib/sendmail george,truman,teddy<p>  sendmail程序可以接受两种不同的命令行参数。不以“-”字符开始的参数是接收者,如上面的george。而以“-”字符开始的参数则是影响sendmail运行的开发选项。所有的命令行开关选项的解释,<p>  标记&nbsp;&nbsp; 说明<br>&nbsp;&nbsp;&nbsp; -b&nbsp;&nbsp; 设置运行模式<br>&nbsp;&nbsp;&nbsp; -v&nbsp;&nbsp; 运行于冗长模式<br>&nbsp;&nbsp;&nbsp; -d&nbsp;&nbsp; 运行于调试模式<p><br>2.1适宜的模式(-b)<p>  sendmail程序的“-b”参数可以衍生出许多功能。例如:使sendmail显示队列的内容,使sendmail重建别名数据库。本章将介绍一些比较常用到的子参数。<p>  格式&nbsp;&nbsp; 说明<br>&nbsp;&nbsp;&nbsp; -ba&nbsp;&nbsp; 使用ARPAnet(灰皮书书)协议<br>&nbsp;&nbsp;&nbsp; -bD&nbsp;&nbsp; 以守候进程模式运行,但不fork<br>&nbsp;&nbsp;&nbsp; -bd&nbsp;&nbsp; 以守候进程模式运行<br>&nbsp;&nbsp;&nbsp; -bH&nbsp;&nbsp; 清除固有的主机状态<br>&nbsp;&nbsp;&nbsp; -bh&nbsp;&nbsp; 打印固有的主机状态<br>&nbsp;&nbsp;&nbsp; -bi&nbsp;&nbsp; 重建别名数据库<br>&nbsp;&nbsp;&nbsp; -bm&nbsp;&nbsp; 成为一个邮件发送者<br>&nbsp;&nbsp;&nbsp; -bp&nbsp;&nbsp; 打印邮件队列内容<br>&nbsp;&nbsp;&nbsp; -bs&nbsp;&nbsp; 在标准输入处运行SMTP<br>&nbsp;&nbsp;&nbsp; -bt&nbsp;&nbsp; 测试模式:仅解析地址<br>&nbsp;&nbsp;&nbsp; -bv&nbsp;&nbsp; 检验:不收集、分发<br>&nbsp;&nbsp;&nbsp; -bz&nbsp;&nbsp; 冻结配置文件<p>  选项可以使sendmail执行时象其它名字。每个名字可以是一个硬连接,一个符号连接,或sendmail的一份拷贝。<p>hoststat -bh 打印固有主机状态<br>mailq -bp 显示邮件队列内容<br>newaliases -bi 重建别名数据库<br>purgestat -bH 清除固有主机状态<br>smtpd -bd 以守侯进程运行<p>2.1.1 守候进程模式 (-bd)<p>  sendmail程序能够在后台以守侯进程模式运行,监听来自其它机器的邮件。Sendmail当第一次以守侯进程模式运行时,程序只读取配置文件一次,然后就一直运行,不再读取配置文件了。也就是说,执行后将不会发现配置文件的变化。<p>  当你对配置文件sendmail.cf做了任何修改,都需要kill掉sendmail进程,然后重新启动它。但当你kill掉这个守候进程前,必须知道如何正确地重新启动它。这些信息是/etc/sendmail/pid或一个系统rc文件。<p>  在BSD系列的UNIX系统,守候进程通常使用以下命令启动:<p>/usr/lib/sendmail –bd –q1h<p>  命令行开关选项“-bd”指定sendmail以守候进程方式运行。“-q”选项告诉sendmail多久去查看一次待处理邮件队列。“-q1h”就是将其设置为1小时。<p>  在你的机器上启动sendmail的命令,可能与我们这儿给出的是不同的。如果你管理许多不同的UNIX系统,你无须知道每一种是如何运行的。<p>2.1.1.1 kill并重启sendmail v8.7<p>  在sendmail 8.7以后的版本中,kill并重启sendmail变得比较简单。一个单一的命令将会完成这一工作:<p>% kill –HUP `head –1 /etc/sendmail.pid`<p><br>  这个单一的命令与下一个小节中的两个命令的效果完全相同。<p>2.1.1.2 kill并重启sendmail v8.6<p>  当你要以守候进程方式启动sendmail,你须确认没有一个已运行的sendmail守候进程。在8.6版sendmail中,可以在/etc/sendmail.pid文件的第一行中找到进程ID号pid。你可以执行以下命令来kill掉sendmail:<p>% kill `head –1 /etc/sendmail.pid`<p>  当你kill掉当前运行的守候进程,你可以使用以下命令来重新运行sendmail:<p>% `tail –1 /etc/sendmail.pid`<p>2.1.1.3 kill并重启老版本sendmail<p>  在老版本的sendmail中,你必须使用ps来获得sendmail的进程ID号pid。在BSD UNIX和System V UNIX使用ps的方法不尽相同。<p>  针对BSD UNIX来说,ps命令的将得到类似以下的输出:<p>% ps ax | grep sendmail | grep –v grep<br>&nbsp;&nbsp; 99&nbsp; ?&nbsp; IN&nbsp; 0:07&nbsp; /usr/lib/sendmail -bd –q1h<br>% kill 99<p>  这个输出的最左边的就是进程ID号。<p>  针对System V UNIX系统来说,ps命令的参数及命令输出都不尽相同:<p><br>% ps ae | grep sendmail<br>&nbsp;&nbsp; 99&nbsp; ?0:01 sendmail<br>% kill 99<p><p>  在老版本的sendmail中,你必须通过查看rc文件来获知如何重启sendmail。<p>2.1.1.4 如果你忘记了kill守候进程<p>  如果你在重启sendmail时,忘了kill掉原来的进程的话,你就会看到类似以下列出的错误消息,每5秒显示一次。<p>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Opendaemonsocket: Server SMTP socket wedged:exiting<p>2.1.2 显示邮件队列模式 (-bp)<p>  sendmail程序能够显示邮件队列的内容。可以通过两种方法实现:一种是运行mailq,另一种是运行带开关选项“-bp”的sendmail。无论你使用哪种方法,邮件队列将会显示出来。如果这个队列是空的,sendmail将打印出:<p>Mail queue is empty<p>  如果有一个邮件正在等待队列中,那么将输出更多的消息,其中包含类似于下列的信息:<p>)&nbsp;&nbsp; Mail Queue (1 requests)<br>--Q-ID---&nbsp;&nbsp; --Size--&nbsp;&nbsp; ----Q-Time<br>-------------------Sender/Recipient-------------------<br>GAA29775*&nbsp;&nbsp; 702&nbsp;&nbsp; Thu Mar 12 16:51&lt;you@here.us.edu&gt;<br>&nbsp;&nbsp; Deferred:Host fbi.dc.gov is down<br>&nbsp; &lt;george@fbi.dc.gov&gt;<p>  在此,带开关选项“-bp”的sendmail显示了仅有一个邮件信息在队列中。如果有多个,那么每一个邮件都会像这样列出来。每一个至少有两行输出。<p>  第一行显示邮件和发送者的细节信息。GAA29775是这个邮件在队列中的标记。“*”号则代表由于这个邮件正在被处理,所以已被锁定。“702”是邮件体的字节数。这里的时间则是邮件被放入队列的时间。地址则显示了发送者的名字。<p>  第二行则可能显示出错的原因,这个邮件就是因为暂时无法分发,所以才暂存在队列中的。<p>  第三行则可能显示接收者地址。<p>  如果你想更完整、清楚地了解这里的输出,参见第23章:队列。<p>2.1.3 重建别名库模式 (-bi)<p>  由于sendmail有可能需要在存放上千条别名记录的aliases文件中寻找别名,为了提高效率,可以使用dbm或db格式来存储。使用这种数据库格式来存储将大大提高检索速度。<p>  尽管sendmail可以在aliases文件改变时自动更新数据库,但它并不总能及时完成。你可以通过运行newaliases命令或带“-bi”开关选项的sendmail来完成,以下这两个命令是相同的:<p>% newaliases<br>% /usr/lib/sendmail -bi<p>  稍过一会儿,将显示出统计信息:<p>/etc/aliases: 859 aliases, longest 615 bytes, 28096 bytes total<p><br>  这一行表示数据库已成功重建。从8.6版以后,就可以存在多个别名文件,所以每一行都是以别名文件名开始的。然后是显示处理了的别名,最大的一项的长度,总长度, 同时有多少个出错也会显示出来。<p>  关于aliases文件更详细的信息,参见第24章:别名。<p>2.1.4 校验模式 (-bv)<p>  带开关选项“-bv”的sendmail是一个简单方便的检查别名的工具。它能够在别名中递归地查找,并显示出最终的用户名称。<p>  假设aliases文件中有如下别名设置:<p>animals:&nbsp; farmanimals, wildanimals<br>bill-eats:&nbsp; redmeat<br>birds:&nbsp; farmbirds, wildbirds<br>bob-eats:&nbsp; seafood,whitemeat<br>farmanimals:&nbsp; pig, cow<br>farmbirds:&nbsp; chicken, turkey<br>fish:&nbsp; cod, tuna<br>redmeat:&nbsp; animals<br>seafood:&nbsp; fish,shellfish<br>shellfish:&nbsp; crab, lobster<br>ted-eats:&nbsp; bob-eats, bill-eats<br>whitemeat:&nbsp; birds<br>wildanimals:&nbsp; deer, boar<br>wildbirds:&nbsp; quail<p>  虽然你也可以通过演算得知ted-eats最终的用户名称,但远不如使用sendmail来帮你完成那样方便。使用sendmail也将更加准确,而且对于很大很复杂的aliases文件来说,更加显得重要。<p>  另外,sendmail –bv还有一个附加的功能,那就是可以检验别名是否真的可分发。假设在aliases文件中包含以下一行:<p>root:&nbsp; fred, larry<p>  假定fred是一个拥有本地机器帐户的系统管理员,但用户larry已经离开,帐号已经被删除。你可以运行sendmail –bv检查所有的用户是否有效:<p>% /usr/lib/sendmail –bv root<p>  这个命令将在aliases文件检查root用户,由于larry不存在,输出将会如下所示:<p>larry … User unknow<br>fred … deliverable: mailer local, user fred<p>2.2冗长模式(-v)<p>  命令行开关选项“-v”,将使sendmail运行在冗长(verbose)模式下。在这个模式下,sendmail将会打印出转发邮件的每一步的详细说明。为了观察运行在冗长模式下sendmail的运行情况,可以执行:<p>% /usr/lib/sendmail –v you &lt; sendstuff<p>  邮件传送在本地进行,输出如下所示:<p>you …&nbsp; Connecting to loca…<br>you …&nbsp; Sent<p>  当sendmail通过TCP/IP网络传送邮件到其它机器,它将使用一个叫SMTP(简单邮件传输协议)。为了观察使用SMTP的情况,我们再次运行sendmail程序,但这次,我们使用一个不在本地的E-mail地址代替“you”:<p>% /usr/lib/sendmail –v you@remote.domain &lt; sendstuff<p>  这个命令的输出看起来类似:<p>you@remote.domain … Connecting to remote.domain via smtp …<br>220-remote.Domain Sendmail 8.6.12/8.5 ready at<br>Fri, 13 Dec 1996 06:36:12 –0800<br>220 ESMTP spoken here<br>&gt;&gt;&gt; EHLO here.us.edu<br>250-remote.domain Hello here.us.edu,pleased to meet you<br>250-EXPN<br>250-SIZE<br>250 HELP<br>&gt;&gt;&gt; MAIL From:&lt;you@here.us.edu&gt;<br>250 &lt;you@here.us.edu&gt; … Sender ok<br>&gt;&gt;&gt; RCPT To:&lt;you@remote.domain&gt;<br>250 &lt;you@remote.domain&gt; … Recipient ok<br>&gt;&gt;&gt; DATA<br>354 Enter mail, end with “.” on a line by itself<br>&gt;&gt;&gt; .<br>250 GAA20115 Message accepted for delivery<br>you@remote.domain … Sent (GAA20115 Message accepted for delivery)<br>Closing connection to remote.domain<br>&gt;&gt;&gt; QUIT<br>221 remote.domain closing connection<p>  以数字开头的行和以字符串“&lt;&lt;&lt;”开头的行组成了SMTP的会话过程。我们马上说谈论一下它们。其它行显示本地sendmail尝试做的操作和成功完成的操作:<p>you@remote.domain … Connecting to remote.domain via smtp …<br>…<br>you@remote.domain … Sent (GAA20115 Message accepted for delivery)<br>Closing connection to remote.domain<p>  第一行显示使用网络发送信件到远程主机remote.domain上。最后两行显示邮件已经发送成功。<p>  在SMTP会话中,以“&lt;&lt;&lt;”开始的行显示本地机器对远程机器的交谈。而来自远程机器的应答行则以数字开始的行。现在我们来看一下会话过程。<p><br>220-remote.Domain Sendmail 8.6.12/8.5 ready at<br>Fri, 13 Dec 1996 06:36:12 –0800<br>220 ESMTP spoken here<p>  一旦sendmail与远程机器连接上后,sendmail就等待远程机器初始化会话。远程机器说它准备好发送,详细的主机名。如果远程主机也运行了sendmail,也将说sendmail的名字与版本。还有就是日期与时间。<p>  第二行也以220开始,“ESMTP spoken here”的含义是远程站点能够使用扩展的SMTP协议。如果远程机器跑的sendmail是8.7或以上版本,ESMTP将可能会出现在第一行。<p>  如果sendmail等待接收这个初始化信息太久,就会打印“Connection timed out”信息,并将这个邮件放入邮件队列中。<p>  接着,本地sendmail发送EHLO(以&gt;&gt;&gt;开始),传送扩展的HELLO信息,和本地主机名:<p>&gt;&gt;&gt; EHLO here.us.edu<br>250-remote.domain Hello here.us.edu,pleased to meet you<br>250-EXPN<br>250-SIZE<br>250 HELP<p>  在EHLO中的E说明本地sendmail也是使用ESMTP的。远程主机以250开始的回执ESMTP支持的服务列表。<p>  如果本地机器发送EHLO消息时,传送的是短主机名(如here)就可能会遇到一个问题。远程主机无法得知这个短主机名的位置,因为它不在远程主机的域remote.domain中。这也就是为什么sendmail一直使用完整的主机名来表示。一个完整的主机名是由主机名加上一个点,然后再加上DNS域名项。<p>  如果到现在为止,一切正常的话,本地机器将说明邮件的发件人:<p>&gt;&gt;&gt; MAIL From:&lt;you@here.us.edu&gt;<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -