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@域名。
- 6.3.4 trivial-rewrite模块
- Apache2.4开启Rewrite模块
- rewrite.so模块安装
- Apache 2.4 Rewrite 模块
- Apache开启Rewrite模块
- ningx的rewrite模块
- linux 给没有Rewrite模块的Apache增加Rewrite模块
- ubuntu php 开启rewrite 模块
- Apache Rewrite模块的调用
- 在 Ubuntu 中开启rewrite 模块
- Ubuntu下apache rewrite模块开启
- 配置Apache的Mode Rewrite模块
- 开启apache rewrite模块的方法
- 有关nginx rewrite模块的问号
- 开启apache的url rewrite模块
- IIS6/7安装配置Rewrite扩展模块
- Apache Rewrite模块的简单应用
- IIS Rewrite 模块实现伪静态
- iOS 使用AFNetWorking监听APP网络状态变化(可用于更改缓存策略、提示网络等)
- Linux 安装Nginx详细图解教程
- 学会优化你的程序
- jquery Ajax提交表单(使用jquery Ajax上传附件)
- cell 相对于当前屏幕坐标
- 6.3.4 trivial-rewrite模块
- 浅析Android Activity的启动过程
- Servlet —— 3.0新特性
- zz:Android 测试工具Monkey & Monkeyrunner 使用方法
- ReactNative学习十三-Props和State
- Django REST framework教程一:序列化
- STL学习笔记— —容器deque
- 一个产品的完整生命周期
- [疯狂Java]SQL-DML:插入、修改、删除记录