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