Postfix邮件过滤spam和virus函数

来源:互联网 发布:华为mate9怎么样知乎 编辑:程序博客网 时间:2024/06/06 11:04

在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进行处理。

原创粉丝点击