6.3.4 trivial-rewrite模块

来源:互联网 发布:淘宝上进货 编辑:程序博客网 时间:2024/05/17 20:30

由于各种地址改写机制的存在,发往zhangsan@abc.com的邮件地址可能会被改写,同时用户也可能没有提供完整的邮件地址(如2.1.2的示例),所以需要专门处理地址改写和解析的模块,这就是trivial-rewrite模块。

 

         解析可以分为两种:

 

         一种是采用5.4节的extract_addr函数,在smtp会话中(mail_cmd、rcpt_cmd函数)解析邮件地址:我们需要在smtp会话中将邮件地址从复杂的“文本”格式中找出来。

 

         另一种是通过trivial-rewrite模块得到RESOLVE_REPLY结构体,该结构体包含MDA(transport)、转发地址(nexthop)等信息。这些信息需要构建成内部结构体,而不能用“文本”(字符串)来表示。由于传输表和内容过滤等机制使得邮件可能不会被简单的发往它所声明的地址,所以更加需要对地址进行解析。

 

MDA选用的一般原则是:

1 本地邮件,即收信域在mydestination参数中列出的邮件,使用localMDA发送。

2 发往虚拟邮箱的邮件,即收信域在virtual_mailbox_domains参数中列出的邮件,使用virtualMDA发送。

3 转发邮件,即收信域在relay_domains参数中列出的邮件,和发往外域的邮件,使用smtp MDA发送。

trivial-rewrite模块通过比对发信人域名和上述各参数值确定使用的MDA。

 

         重写也分为两种:

 

         一种是cleanup模块对邮件地址“格式”的重写,如补全发件人地址zhangsan@163.com为From :zhangsan@163.com。

 

另一种是trivial-rewrite模块对邮件地址的重写。postfix查询表中的地址是用户手写的,可能并不完整,所以可能会需要重写。重写分为local和remote两种情况:

#define MAIL_ATTR_RWR_LOCAL  "local"

#define MAIL_ATTR_RWR_REMOTE       "remote"

 

local类型的重写将邮件地址的域名部分设置为$myorigin或$mydomain参数的值。remote类型的重写将邮件地址域名设置为$remote_header_rewrite_domain参数的值,该参数设定remote模式下的重写规则。

 

/global/rewrite_clnt.c和/global/resolve_clnt.c分别与trivial-rewrite模块通信完成地址的重写与解析功能,这两个程序附带单元测试函数。

local模式下的重写测试(见图6-8):


图6-8 local模式下的地址重写测试

 

可见local方式的重写将为残缺地址补充本地域名。

 

         remote模式下的重写测试(见图6-9):


图6-9 remote模式下的地址重写测试

 

         也就是如果我们在提供了命令mail from:zhangsan,cleanup和trivial-rewrite模块将合力构造地址形式From :zhangsan@域名。
0 0
原创粉丝点击