在milter过滤spam和virus涉及函数
- milter_conn_event
- milter_helo_event
- milter_mail_event
- milter_rcpt_event
- milter_data_event
- milter_unknown_event
- milter_other_event
- check_milter_reply
milter_conn_event() —— report connect event
将一个SMTP客户端连接事件报告给指定的milter实例,函数返回一个SMTP回复(45 XX后面跟着增强的状态码和文本)、“D”(丢弃)、“H”(隔离)、“S”(关闭连接)或空指针。
函数原型:
const char *milter_conn_event(MILTERS *milters, const char *client_name, const char *client_addr, const char *client_port, unsigned addr_family)
milter_helo_event() —— report helo event
将HELO或EHLO事件报告给指定的milter实例,函数返回一个SMTP回复(45 XX后面跟着增强的状态码和文本)、“D”(丢弃)、“H”(隔离)、“S”(关闭连接)或空指针。
函数原型:
const char *milter_helo_event(MILTERS *milters, const char *helo_name,int esmtp_flag
milter_mail_event() —— report mail from event
将MAIL事件报告给指定的milter实例,函数返回一个SMTP回复(45 XX后面跟着增强的状态码和文本)、“D”(丢弃)、“H”(隔离)、“S”(关闭连接)或空指针。
函数原型:
const char *milter_mail_event(MILTERS *milters, const char **argv)
milter_rcpt_event() —— report rcpt to event
将RCPT事件报告给指定的milter实例,函数返回一个SMTP回复(45 XX后面跟着增强的状态码和文本)、“D”(丢弃)、“H”(隔离)、“S”(关闭连接)或空指针。
函数原型:
const char *milter_rcpt_event(MILTERS *milters, int flags, const char **argv)
milter_data_event() —— report data event
将DATA事件报告给指定的milter实例,函数返回一个SMTP回复(45 XX后面跟着增强的状态码和文本)、“D”(丢弃)、“H”(隔离)、“S”(关闭连接)或空指针。
函数原型:
const char *milter_data_event(MILTERS *milters)
milter_unknow_event() —— report unknown command
将UNKOWN COMMAND事件报告给指定的milter实例,函数返回一个SMTP回复(45 XX后面跟着增强的状态码和文本)、“D”(丢弃)、“H”(隔离)、“S”(关闭连接)或空指针。
函数原型:
const char *milter_unknown_event(MILTERS *milters, const char *command)
milter_other_event()——other SMTP event
返回当前的SMTP连接状态的缺省邮件过滤器回复;它不会改变milter状态。返回空指针结果标识一切正常。该函数可用于诸如身份验证、没有自己的milter事件例程的STARTTLS等SMTP命令。
函数原型:
const char *milter_other_event(MILTERS *milters)
check_milter_reply() —— process reply from Milter
检查MILTER返回的状态,该函数返回处理信息。
函数原型:
static const char *check_milter_reply(SMTPD_STATE *state, const char *reply)
milter过滤spam和virus说明
在上述函数中,都调用milter8_event函数向Rspamd报告事件和接收回复命令。
static const char *milter8_event(MILTER8 *milter, int event, int skip_event_flag,int skip_reply,ARGV *macros,...);
在milter8_event函数中调用vmilter8_write_cmd(1047-1054)函数向Rspamd报告事件。
/*
* Send the command and data.
*/
va_start(ap, macros);
err = vmilter8_write_cmd(milter, event, data_len, ap);
va_end(ap);
if (err != 0)
return (milter->def_reply);
调用milter8_read_resp()(1106)函数接收回复命令。
if (milter8_read_resp(milter, event, &cmd, &data_size) != 0)
然后根据接收到的命令cmd判断做出处理返回并返回:4、5、“D”、“H”、“S”、空指针。
Rmilter
main.c中的main函数连接、注册、打开smfi过滤器(321-330)。
smfi_setconn (cfg->sock_cred);
if (smfi_register (smfilter) == MI_FAILURE) {
msg_err("smfi_register failed");
exit (EX_UNAVAILABLE);
}
if (smfi_opensocket (true) == MI_FAILURE) {
msg_err("Unable to open listening socket");
exit (EX_UNAVAILABLE);
}
smfi_register的参数smfilter参数注册milter回调函数.在rmilter.c(69-89)。
struct smfiDesc smfilter =
{
"rmilter", /* filter name */
SMFI_VERSION, /* version code -- do not change */
SMFIF_ADDHDRS | SMFIF_CHGHDRS | SMFIF_ADDRCPT | SMFIF_DELRCPT, /* flags */
mlfi_connect, /* connection info filter */
mlfi_helo, /* SMTP HELO command filter */
mlfi_envfrom, /* envelope sender filter */
mlfi_envrcpt, /* envelope recipient filter */
mlfi_header, /* header filter */
mlfi_eoh, /* end of header */
mlfi_body, /* body block filter */
mlfi_eom, /* end of message */
mlfi_abort, /* message aborted */
mlfi_close, /* connection cleanup */
#if (SMFI_PROT_VERSION >= 4)
NULL, /* unknown situation */
mlfi_data, /* SMTP DATA callback */
NULL /* Negotiation callback */
#endif
};
然后根据不同的事件调用不同的callback进行处理。