郵件隊(duì)列是存儲(chǔ) sendmail 命令傳送的郵件消息數(shù)據(jù)和控制文件的目錄。缺省情況下,郵件隊(duì)列是 /var/spool/mqueue。
郵件消息可能由于很多原因而排入隊(duì)列。
例如:
- sendmail 命令可以配置成按一定的時(shí)間間隔處理隊(duì)列,而不是立即處理。如果這樣,郵件消息必須臨時(shí)存儲(chǔ)。
- 如果一個(gè)遠(yuǎn)程主機(jī)不響應(yīng)一個(gè)郵件連接的請(qǐng)求,郵件系統(tǒng)會(huì)將這些消息排入隊(duì)列,稍后再作嘗試。
打印郵件隊(duì)列
隊(duì)列內(nèi)容可以使用 mailq 命令打?。ɑ蛲ㄟ^指定 sendmail 命令的 -bp 標(biāo)志)。
這些命令產(chǎn)生隊(duì)列標(biāo)識(shí)、消息大小、消息進(jìn)入隊(duì)列的日期以及發(fā)送方與收件人的列表。
郵件隊(duì)列文件
隊(duì)列中的每條消息都與一定數(shù)量的文件相關(guān)聯(lián)。這些文件按以下約定命名:
TypefID
其中 ID 是一個(gè)唯一的消息隊(duì)列標(biāo)識(shí),而 Type 是以下表示文件類型的字母中的一個(gè):
d |
包含消息正文但無標(biāo)題信息的數(shù)據(jù)文件。 |
q |
隊(duì)列控制文件。該文件包含處理作業(yè)所需要的信息。 |
t |
臨時(shí)文件。該文件是 q 文件重建時(shí)的一個(gè)映象。它快速重命名為 q 文件。 |
x |
在會(huì)話過程中存在并顯示該次會(huì)話中發(fā)生的任何事件的記錄文件。 |
例如,如果一條消息的隊(duì)列標(biāo)識(shí)為 AA00269,當(dāng) sendmail 命令嘗試傳送消息時(shí),在郵件隊(duì)列目錄中創(chuàng)建和刪除以下文件:
dfAA00269 |
數(shù)據(jù)文件 |
qfAA00269 |
控制文件 |
tfAA00269 |
臨時(shí)文件 |
xfAA00269 |
記錄文件 |
q 控制文件
q 控制文件包括一系列行,每一行都以一個(gè)代碼字母開始:
B |
指定 body type。該行其余部分是定義 body type 的文本字符串。如果缺失該項(xiàng)字段,則缺省情況下 body type 是 7 位的,而且不會(huì)嘗試特殊的處理。合法值是 7BIT 和 8BITMIME。 |
C |
包括控制用戶。對(duì)于以文件或程序作收件人的地址,sendmail 作為該文件或程序的所有者來執(zhí)行傳送??刂朴脩舯辉O(shè)置為文件或程序的所有者。由 .forward 或 :include: 文件讀取的收件人地址也將使控制用戶被設(shè)置為文件所有者。當(dāng) sendmail 傳送郵件到這些收件人時(shí),sendmail 作為控制用戶傳送,然后轉(zhuǎn)換回 root 用戶。 |
F |
包括信包標(biāo)志。標(biāo)志是以下的任意組合:w(設(shè)置 EF_WARNING 標(biāo)志)、r(設(shè)置 EF_RESPONSE 標(biāo)志)、8(設(shè)置 EF_HAS8BIT 標(biāo)志)和 b(設(shè)置 EF_DELETE_BCC 標(biāo)志)。其它字母則被忽略而無提示。 |
H |
包括一個(gè)標(biāo)題定義。此類行的數(shù)量任意。H 行出現(xiàn)的順序確定了它們?cè)谧罱K消息里的出現(xiàn)順序。這些行使用的語法與 /etc/mail/sendmail.cf 配置文件中的標(biāo)題定義相同。(對(duì)于早于 AIX 5.1 的版本,該文件是 /etc/sendmail.cf。) |
I |
為 df 文件指定內(nèi)節(jié)點(diǎn)和設(shè)備信息;這可以在磁盤崩潰后用來恢復(fù)郵件隊(duì)列。 |
K |
指定上一次傳輸嘗試的時(shí)間(以秒為單位)。 |
M |
當(dāng)一條消息由于在傳送嘗試中出現(xiàn)了錯(cuò)誤而放入隊(duì)列時(shí),錯(cuò)誤的性質(zhì)就存儲(chǔ)在 M 行。 |
N |
指定傳送嘗試的總數(shù)。 |
O |
指定 ESMTP 的消息傳輸系統(tǒng)(MTS)的原始值。它只用于傳送狀態(tài)通知。 |
P |
包括當(dāng)前消息的優(yōu)先級(jí)。優(yōu)先級(jí)用來對(duì)隊(duì)列排序。數(shù)字越大表示優(yōu)先級(jí)越低。當(dāng)消息位于隊(duì)列中時(shí)優(yōu)先級(jí)增加。初始優(yōu)先級(jí)取決于消息的類和消息的大小。 |
Q |
包含初始收件人,由 ESMTP 事務(wù)中的 ORCPT= 字段指定。僅用于傳送狀態(tài)通知。只應(yīng)用于緊接著的 R 行。 |
R |
包含收件人地址。每個(gè)收件人占一行。 |
S |
包含發(fā)送方地址。此類行只有一行。 |
T |
包含消息創(chuàng)建時(shí)間,用來計(jì)算何時(shí)消息超時(shí)。 |
V |
指定隊(duì)列文件格式版本號(hào)(該隊(duì)列文件格式用來允許新的 sendmail 二進(jìn)制文件讀取舊版本創(chuàng)建的隊(duì)列文件)。缺省時(shí)指版本 0。如果存在,必須是文件的第一行。 |
Z |
指定原始信包標(biāo)識(shí)(從 ESMTP 事務(wù)中)。只用于傳送狀態(tài)通知。 |
$ |
包含宏定義。某些宏($r 和 $s)的值會(huì)傳遞到隊(duì)列運(yùn)行階段。 |
傳送到 amy@zeus 的消息的 q 文件類似于:
P217031
T566755281
MDeferred: Connection timed out during user open with zeus
Ramy@zeus
H?P?return-path: <geo>
Hreceived: by george (0.13 (NL support)/0.01)
id AA00269; Thu, 17 Dec 87 10:01:21 CST
H?D?date: Thu, 17 Dec 87 10:01:21 CST
H?F?From: geo
Hmessage-id: <8712171601.AA00269@george>
HTo: amy@zeus
Hsubject: test
其中:
P217031 |
消息的優(yōu)先級(jí) |
T566755281 |
提交時(shí)間(秒) |
MDeferred: Connection timed out during user open with zeus |
狀態(tài)消息 |
Sgeo |
發(fā)送方標(biāo)識(shí) |
Ramy@zeus |
收件人標(biāo)識(shí) |
Hlines |
消息的報(bào)頭信息 |
在 sendmail 中指定時(shí)間值
要設(shè)置消息超時(shí)和隊(duì)列處理間隔,必須用特定的時(shí)間值格式。時(shí)間值的格式是:
-qNumberUnit
其中 Number 是一個(gè)整數(shù)值,Unit 是單位字母。Unit 可以是以下值中的一個(gè):
s |
秒 |
m |
分 |
h |
小時(shí) |
d |
天 |
w |
周 |
如果沒有指定 Unit,sendmail 守護(hù)程序使用分(m)作為缺省值。下面三個(gè)示例說明時(shí)間值的規(guī)范:
/usr/sbin/sendmail -q15d
該命令使得 sendmail 守護(hù)程序每 15 天處理一次隊(duì)列。
/usr/sbin/sendmail -q15h
該命令使得 sendmail 守護(hù)程序每 15 小時(shí)處理一次隊(duì)列。
/usr/sbin/sendmail -q15
該命令使得 sendmail 守護(hù)程序每 15 分鐘處理一次隊(duì)列。
強(qiáng)制郵件隊(duì)列
在某些情況下,您可能發(fā)現(xiàn)隊(duì)列由于某種原因阻塞。您可以使用 -q 標(biāo)志(沒有值)強(qiáng)制一個(gè)隊(duì)列運(yùn)行。您也可以用 -v 標(biāo)志(詳細(xì))來觀察發(fā)生了什么:
/usr/sbin/sendmail -q -v
使用一個(gè)隊(duì)列修飾符,您也可以將作業(yè)限制在具有特定隊(duì)列標(biāo)識(shí)符、發(fā)送方或收件人的范圍中。例如,-qRsally 將隊(duì)列運(yùn)行限制為收件人地址之一中有字符串 sally 的作業(yè)。同樣,-qS 字符串會(huì)將運(yùn)行限制為特定的發(fā)送方,而 -qI 字符串將它限制為特定的隊(duì)列標(biāo)識(shí)。
設(shè)置隊(duì)列處理時(shí)間間隔
守護(hù)程序啟動(dòng)時(shí) -q 標(biāo)志的值確定 sendmail 守護(hù)程序處理郵件隊(duì)列的時(shí)間間隔。
sendmail 守護(hù)程序通常由 /etc/rc.tcpip 文件在系統(tǒng)啟動(dòng)時(shí)啟動(dòng)。/etc/rc.tcpip 文件包含一個(gè)稱為隊(duì)列處理間隔(QPI)的變量,該變量在該文件啟動(dòng) sendmail 守護(hù)程序時(shí)用來指定 -q 標(biāo)志的值。缺省情況下,qpi 的值是 30 分鐘。要指定不同的隊(duì)列處理間隔:
- 用您喜歡的編輯器編輯 /etc/rc.tcpip 文件。
- 查找給 qpi 變量指定值的行,例如:
qpi=30m
- 將指定給變量 qpi 的值更改為希望的時(shí)間值。
這些變化會(huì)在下一次系統(tǒng)重新啟動(dòng)時(shí)生效。如果您想讓這些變化立刻生效,請(qǐng)停止并重新啟動(dòng) sendmail 守護(hù)程序,指定新的 -q 標(biāo)志值。更多相關(guān)信息,請(qǐng)參閱停止 sendmail 守護(hù)程序和啟動(dòng) sendmail 守護(hù)程序。
移動(dòng)郵件隊(duì)列
當(dāng)一個(gè)主機(jī)長期關(guān)閉時(shí),路由到(或通過)該主機(jī)的很多消息可能存儲(chǔ)在郵件隊(duì)列中。結(jié)果 sendmail 命令要花費(fèi)很長時(shí)間對(duì)隊(duì)列排序,這嚴(yán)重降低了系統(tǒng)性能。如果您移動(dòng)隊(duì)列到一個(gè)臨時(shí)空間并創(chuàng)建一個(gè)新的隊(duì)列,舊隊(duì)列可以稍后在該主機(jī)恢復(fù)服務(wù)后運(yùn)行。要移動(dòng)隊(duì)列到一個(gè)臨時(shí)空間并創(chuàng)建一個(gè)新的隊(duì)列,請(qǐng):
- 按停止 sendmail 守護(hù)程序中的指示信息停止 sendmail 守護(hù)程序。
- 輸入以下內(nèi)容移動(dòng)整個(gè)隊(duì)列目錄:
cd /var/spool
mv mqueue omqueue
- 按啟動(dòng) sendmail 守護(hù)程序中的指示信息重新啟動(dòng) sendmail 守護(hù)程序。
- 輸入以下內(nèi)容處理舊郵件隊(duì)列:
/usr/sbin/sendmail -oQ/var/spool/omqueue -q
-oQ 標(biāo)志指定一個(gè)備用隊(duì)列目錄。 -q 標(biāo)志指定運(yùn)行隊(duì)列中的每一項(xiàng)作業(yè)。要獲取操作過程的報(bào)告,請(qǐng)使用 -v 標(biāo)志。
注:
此操作可能要花些時(shí)間。
- 當(dāng)隊(duì)列為空時(shí),輸入以下內(nèi)容除去日志文件和臨時(shí)目錄:
rm /var/spool/omqueue/*
rmdir /var/spool/omqueue
啟動(dòng) sendmail 守護(hù)程序
要啟動(dòng) sendmail 守護(hù)程序,請(qǐng)輸入以下命令中的一個(gè):
startsrc -s sendmail -a "-bd -q15"
/usr/lib/sendmail -bd -q15
如果 sendmail 守護(hù)程序在輸入這些命令中的一個(gè)時(shí)已經(jīng)激活,請(qǐng)參閱屏幕上的以下消息:
sendmail 子系統(tǒng)已經(jīng)激活。不支持多實(shí)例。
如果 sendmail 守護(hù)程序沒有被激活,您將會(huì)看到一條消息表示 0sendmail 守護(hù)程序已經(jīng)啟動(dòng)。
停止 sendmail 守護(hù)程序
要停止 sendmail 守護(hù)程序,請(qǐng)運(yùn)行 stopsrc -s sendmail 命令。
如果 sendmail 守護(hù)程序沒有隨 startsrc 命令啟動(dòng),請(qǐng):
- 查找 sendmail 進(jìn)程標(biāo)識(shí)。
- 輸入 kill sendmail_pid 命令。(其中 sendmail_pid 是 sendmail 過程的處理標(biāo)識(shí))。