13.6 与上游邮件服务器间的认证交互

对于POP3、SMTP、IMAP来说,客户端与邮件服务器之间最初的交互目的都不太相同。例如,对于POP3和IMAP来说,与邮件服务器间的TCP连接一旦建立成功,邮件服务器会发送一个欢迎信息,接着客户端(此时,Nginx是邮件服务器的客户端)发送用户名,在邮件服务器返回成功后再发送密码,等邮件服务器验证通过后,才会进入到邮件处理阶段:对于Nginx这个邮件代理服务器来说,就是进入到纯粹地透传Nginx与上、下游间两个TCP连接之间的数据流(见13.7节)。但对于SMTP来说,这个交互过程又有所不同,进入邮件处理阶段前需要交互传输邮件来源地址、邮件目标地址(也就是From……To……)等信息。

无论如何,Nginx作为邮件代理服务器在接收到客户端的请求,并且收集到足够进行认证的信息后,将会由Nginx与上游的邮件服务器进行独立的交互,直到邮件服务器认为可以进入到处理阶段时,才会开始透传协议。这一阶段将围绕着ngx_mail_proxy_ctx_t结构体中的成员进行。下面以POP3协议为例简单地说明Nginx是如何与邮件服务器交互的。

13.6.1 ngx_mail_proxy_ctx_t结构体

ngx_mail_session_t结构体中的proxy成员指向ngx_mail_proxy_ctx_t结构体,该结构体含有Nginx与上游间的连接upstream,以及与上游通信时接收上游TCP消息的缓冲区,如下所示。


typedef struct{

//与上游邮件服务器间的连接

ngx_peer_connection_t upstream;

/*用于缓存上、下游间TCP消息的内存缓冲区,内存大小由nginx.conf文件中的proxy_buffer配

置项决定*/

ngx_buf_t*buffer;

}ngx_mail_proxy_ctx_t;


注意 proxy成员最初也是NULL空指针,直到调用ngx_mail_proxy_init方法后才会为proxy指针分配内存。