13.2.2 邮件类模块的定义

在第8章说过,每一个Nginx模块都会使用ngx_module_t结构体来表示,而ngx_module_t中的ctx成员将指向各种模块的特有接口。

首先介绍的邮件模块是NGX_CORE_MODULE类型的ngx_mail_module模块,它定义了一种新的模块类型,叫做NGX_MAIL_MODULE。同时,它会管理所有NGX_MAIL_MODULE类型的邮件模块。这些邮件模块的ctx成员指向的抽象接口叫做ngx_mail_module_t,如下所示。


typedef struct{

//POP3、SMTP、IMAP邮件模块提取出的通用接口ngx_mail_protocol_t*protocol;

/创建用于存储main级别配置项的结构体,该结构体中的成员将保存直属于mail{}块的配置项参数/

voidcreate_main_conf)(ngx_conf_t*cf);

/解析完main级别配置项后被回调/

charinit_main_conf)(ngx_conf_tcf,voidconf);

/创建用于存储srv级别配置项的结构体,该结构体中的成员将保存直属于server{}块的配置项参数/

voidcreate_srv_conf)(ngx_conf_t*cf);

/svr级别可能存在与main级别同名的配置项,该回调方法会给具体的邮件模块提供一个手段,以便从prev和conf参数中获取到已经解析完毕的main和srv配置项结构体,自由地重新修改它们的值/

charmerge_srv_conf)(ngx_conf_tcf,voidprev,void*conf);

}ngx_mail_module_t;


每一个邮件模块都会实现ngx_mail_module_t接口。除了最上面的protocol成员以外,其实ngx_mail_module_t与ngx_http_module_t非常相似,当然,那些同名成员的功能也是相似的。下面看一下这个protocol接口定义了哪些内容。


typedef struct ngx_mail_protocol_s ngx_mail_protocol_t;

//4个POP3、SMTP、IMAP等应用级别的邮件模块所要实现的接口方法

typedef void(ngx_mail_init_session_pt)(ngx_mail_session_ts,

ngx_connection_t*c);

typedef void(ngx_mail_init_protocol_pt)(ngx_event_trev);

typedef void(ngx_mail_auth_state_pt)(ngx_event_trev);

typedef ngx_int_t(ngx_mail_parse_command_pt)(ngx_mail_session_ts);

struct ngx_mail_protocol_s{

//邮件模块名称

ngx_str_t name;

//当前邮件模块中所要监听的最常用的4个端口

in_port_t port[4];

/邮件模块类型。目前type仅可以取值为:NGX_MAIL_POP3_PROTOCOL、NGX_MAIL_IMAP_PROTOCOL、NGX_MAIL_SMTP_PROTOCOL/

ngx_uint_t type;

//与客户端建立起TCP连接后的初始化方法

ngx_mail_init_session_pt init_session;

//接收、解析客户端请求的方法

ngx_mail_init_protocol_pt init_protocol;

//解析客户端邮件协议的接口方法,由POP3、SMTP、IMAP等邮件模块实现

ngx_mail_parse_command_pt parse_command;

//认证客户端请求的方法

ngx_mail_auth_state_pt auth_state;

/当处理过程中出现没有预见到的错误时,将会返回internal_server_error指定的响应到客户端/

ngx_str_t internal_server_error;

};


可以看到,ngx_mail_protocol_t接口定义了POP3、SMTP、IMAP等应用级别的邮件模块加入到邮件框架时所要实现的接口以及需要遵循的规则。

关于POP3、SMTP、IMAP模块的定义,这里不再介绍,读者可以自行查看Nginx源代码。在下面的章节中,读者将看到它们如何结合邮件框架来实现邮件代理功能。