qmail是乙個模組化設計的郵件系統,每乙個子功能都是由乙個執行程式來實現的,而每個程式的屬性以及執行方式由乙個或多個配置檔案和環境變數來控制的。在qmail安裝成功和啟動以後,qmail的相關程序一直在記憶體中駐留,qmail會不斷掃瞄郵件佇列,並且把郵件投遞到正確的目的位址。
qmail所有的執行程式都安裝在/var/qmail/bin目錄下。比較重要的執行程式如下:
1. qmail-smtpd
它的作用是接收遠端主機投遞的郵件,然後將郵件傳遞給qmail-queue進行處理。qmail-smtpd是通過smtp協議和遠端主機驚醒通訊的。qmail-smtpd並不是常駐記憶體的,他需要乙個外部程式來啟用,本文所做的系統是使用tcpserver來啟用的。tcpserver監視著系統的ip連線請求,如果檢測到有smtp的連線請求,tcpserver就會自動的啟用qmail-smtpd,然後將ip連線的控制權交給qmail-smtpd,一旦qmail-smtpd和遠端主機建立起smtp連線後,遠端主機就可以將郵件投遞到本地的郵件伺服器了。
2. qmail-inject
它的作用是接收本地生成並投遞的郵件,並把郵件傳遞給qmail-queue來處理。在郵件傳遞給qmail-queue之前,qmail-inject先掃面郵件的郵件頭,來檢視郵件頭是否符合rfc822標準,如果不符合它將會自動的更改和修正這個郵件的郵件頭。
3. qmail-send
當乙個郵件被放入郵件佇列之後,qmail-send就開始對該郵件進行處理,。它會檢查郵件佇列中的每乙個郵件的狀態,對於沒有投遞過的和投遞暫時失敗的郵件,對於沒有投遞過和投遞暫時失敗的郵件,qmail-send會將目標位址是本地主機的傳遞給qmail-lspawn,目標位址是遠端主機的傳遞給qmail-rspawn,對於投遞永久失敗的郵件,qmail-send將會把該郵件傳遞給qmail-clear,讓這個程式永久刪除這個郵件。qmail-send是乙個常駐記憶體程序程式,如果qmail-send中止,qmail的其他程序將會自動中止。
4. qmail-clean
它的作用是從郵件佇列中刪除投遞永久失敗的郵件。qmail使用多種狀態標示來標記郵件,每個郵件在每一次被處理後它的狀態表示都會被改變。如果系統當機,系統重新啟動以後,qmail-send仍然可以找到郵件佇列中上次最後一次成功處理過的郵件的位置,並且從這裡重新開始處理郵件佇列。如果由於其他原因造成qmail-send不能處理的郵件佇列,qmail-send會呼叫qmail-clean從郵件佇列中刪除郵件。qmail-clean也是常駐記憶體的程序。
5. qmail-rspawn
當qmail-send判明郵件目標位址是遠端郵件伺服器時,qmail-send就會將郵件交給qmail-rspawn,qmail-rspawn的作用是排程郵件的投遞時間和順序,然後啟用qmail-remote來進行投遞。qmail-rspawn還有乙個作用是決定每乙個郵件的目標郵件伺服器,每次和遠端郵件伺服器的連線都會呼叫qmail-remote一次。qmail-rspawn也是常駐記憶體的程序。
6. qmail-lspawn
功能和qmail-rspawn類似,qmail-lspawn也是被qmail-send排程來投遞郵件的,不過qmail-lspawn是負責目標位址是為本地郵件伺服器的郵件。
7. qmail-remote
它的作用是通過smtp協議將郵件投遞到遠端的使用者。郵件是通過qmail-rspawn傳遞過來的,qmail-remote每次只可以同乙個遠端主機連線,不過在連線時qmail-remote可以投遞這個遠端主機上的多個接收者的郵件。投遞當中的排程是由qmail-rspamwn來負責的。
8. qmail-local
它的作用是投遞本地郵件伺服器的郵件。這個程式通常是用來檢測因為**命令使用不當造成的郵件迴圈故障。
9. qmail-queue
他處理從qmail-inject和qmail-smtpd傳遞過來的郵件,並把這些郵件傳遞到郵件佇列中,它會掃瞄每個郵件的傳送者和接收者的位址,一般傳遞給qmail-queue的郵件的標示都是為0,如果為1時,它會認為這個郵件的傳送者和接收者的位址要經過特殊格式的處理。
qmail的執行程式
qmail是乙個模組化設計的郵件系統,每乙個子功能都是由乙個執行程式來實現的,而每個程式的屬性以及執行方式由乙個或多個配置檔案和環境變數來控制的。在qmail安裝成功和啟動以後,qmail的相關程序一直在記憶體中駐留,qmail會不斷掃瞄郵件佇列,並且把郵件投遞到正確的目的位址。qmail所有的執行...
python 執行可執行程式
python do exe.pyw coding utf 8 import os exe dir c program files q dir exe file q dir.exe def do cmd dir,file if os.access dir,os.f ok os.chdir dir if...
利用rundll32執行程式的函式執行程式
無意間發現hexacorn這個國外大佬,給出了很多通過rundll32執行dll中的函式執行程式的方法,思路很靈巧。用法 rundll32 引數代表傳入dll的匯出函式名,在dll中定義如下 void callback entrypoint hwnd hwnd,hinstance hinst,lps...