Milter介绍
功能
SMTP 和milter对应
SMTP Commands |
Milter Callbacks |
(open SMTP connection) |
xxfi_connect |
HELO ... |
xxfi_helo |
MAIL From: ... |
xxfi_envfrom |
RCPT To: ... |
xxfi_envrcpt |
[more RCPTs] |
[xxfi_envrcpt] |
DATA |
xxfi_data |
Header: ... |
xxfi_header |
[more headers] |
[xxfi_header] |
xxfi_eoh | |
body... |
xxfi_body |
[more body...] |
[xxfi_body] |
. |
xxfi_eom |
QUIT |
xxfi_close |
工作原理
For each of N connections
{
For each filter
processconnection (xxfi_connect)
For each filter
processhelo (xxfi_helo)
MESSAGE:For each message in thisconnection (sequentially)
{
Foreach filter
process sender (xxfi_envfrom)
Foreach recipient
{
For each filter
processrecipient (xxfi_envrcpt)
}
Foreach filter
{
process DATA (xxfi_data)
For each header
process header(xxfi_header)
process end of headers (xxfi_eoh)
For each body block
process thisbody block (xxfi_body)
process end of message (xxfi_eom)
}
}
For each filter
processend of connection (xxfi_close)
}
API
Function |
Description |
smfi_opensocket |
Try to create the interface socket. |
smfi_register |
Register a filter. |
smfi_setconn |
Specify socket to use. |
smfi_settimeout |
Set timeout. |
smfi_setbacklog |
Define the incoming listen(2) queue size. |
smfi_setdbg |
Set the milter library debugging (tracing) level. |
smfi_stop |
Cause an orderly shutdown. |
smfi_main |
Hand control to libmilter. |
Function |
Description |
smfi_getsymval |
Return the value of a symbol. |
smfi_getpriv |
Get the private data pointer. |
smfi_setpriv |
Set the private data pointer. |
smfi_setreply |
Set the specific reply code to be used. |
smfi_setmlreply |
Set the specific multi-line reply to be used. |
Function |
Description |
SMFIF_* flag |
smfi_addheader |
Add a header to the message. |
SMFIF_ADDHDRS |
smfi_chgheader |
Change or delete a header. |
SMFIF_CHGHDRS |
smfi_insheader |
Insert a header into the message. |
SMFIF_ADDHDRS |
smfi_chgfrom |
Change the envelope sender address. |
SMFIF_CHGFROM |
smfi_addrcpt |
Add a recipient to the envelope. |
SMFIF_ADDRCPT |
smfi_addrcpt_par |
Add a recipient including ESMTP parameter to the envelope. |
SMFIF_ADDRCPT_PAR |
smfi_delrcpt |
Delete a recipient from the envelope. |
SMFIF_DELRCPT |
smfi_replacebody |
Replace the body of the message. |
SMFIF_CHGBODY |
Function |
Description |
xxfi_connect |
connection info |
xxfi_helo |
SMTP HELO/EHLO command |
xxfi_envfrom |
envelope sender |
xxfi_envrcpt |
envelope recipient |
xxfi_data |
DATA command |
xxfi_unknown |
Unknown SMTP command |
xxfi_header |
header |
xxfi_eoh |
end of header |
xxfi_body |
body block |
xxfi_eom |
end of message |
xxfi_abort |
message aborted |
xxfi_close |
connection cleanup |
xxfi_negotiate |
option negotiattion |
Function |
Description |
smfi_progress |
Report operation in progress. |
smfi_quarantine |
Quarantine a message. |
Function |
Description |
smfi_version |
libmilter (runtime) version info |
smfi_setsymlist |
Set the list of macros that the milter wants to receive from the MTA for a protocol stage. |
return value
Return value |
SMFIS_CONTINUE |
Continue processing the current connection, message, or recipient. |
SMFIS_REJECT |
For a connection-oriented routine, reject this connection; callxxfi_close. |
For a message-oriented routine (except xxfi_eom orxxfi_abort), reject this message. |
For a recipient-oriented routine, reject the current recipient (but continue processing the current message). |
SMFIS_DISCARD |
For a message- or recipient-oriented routine, accept this message, but silently discard it. |
SMFIS_DISCARD should not be returned by a connection-oriented routine. |
SMFIS_SKIP |
Skip further callbacks of the same type in this transaction. Currently this return value is only allowed in xxfi_body(). It can be used if a milter has received sufficiently many body chunks to make a decision, but still wants to invoke message modification functions that are only allowed to be called from xxfi_eom(). Note: the milter must negotiate this behavior with the MTA, i.e., it must check whether the protocol action SMFIP_SKIP is available and if so, the milter must request it. |
SMFIS_NOREPLY |
Do not send a reply back to the MTA. The milter must negotiate this behavior with the MTA, i.e., it must check whether the appropriate protocol action SMFIP_NR_* is available and if so, the milter must request it. If you set the SMFIP_NR_* protocol action for a callback, that callback must always reply with SMFIS_NOREPLY. Using any other reply code is a violation of the API. If in some cases your callback may return another value (e.g., due to some resource shortages), then you must not set SMFIP_NR_* and you must use SMFIS_CONTINUE as the default return code. (Alternatively you can try to delay reporting the problem to a later callback for which SMFIP_NR_* is not |
SMFIS_ACCEPT |
For a connection-oriented routine, accept this connection without further filter processing; call xxfi_close. |
For a message- or recipient-oriented routine, accept this message without further filtering. |
SMFIS_TEMPFAIL |
Return a temporary failure, i.e., the corresponding SMTP command will return an appropriate 4xx status code. For a message-oriented routine (except xxfi_envfrom), fail for this message. |
For a connection-oriented routine, fail for this connection; call xxfi_close. |
For a recipient-oriented routine, only fail for the current recipient; continue message processing. |