由于工作需要,需要改写用户邮件header头地址与邮件路由地址。整理笔录
改写邮件地址是postfix的核心,在收到邮件后就会进行相应地址修改,地址补充等工作,其流程如下:以下来自postfix官网说明
Postfix address rewriting overview
|
trivial- rewrite(8) (std form) |
|
trivial- rewrite(8) (resolve) |
|
|
|
|
|
smtpd(8) |
>- |
cleanup(8) |
-> |
incoming |
-> |
active |
-> |
qmgr(8) |
-< |
smtp(8) |
qmqpd(8) |
lmtp(8) |
pickup(8) |
local(8) |
|
^ | |
|
|
|
|
bounces forwarding notices |
|
deferred |
|
|
|
由于工作只需要修改邮件header地址,着重只测试了canonical_maps,smtp_generic_maps,header_checke部分修改邮件头地址的方法
。
1.用header_checker检查头文件,用正则匹配替换发件人地址From
Vim main.cf
添加如下开启头检查,使用的是pcre方式。
header_checks = pcre:/etc/postfix/my_header_checks
建立my_header_checks文件
记得每次修改完my_header_checks文件要重新加载postfix否则出现正则是对的,而匹配出的地址格式显示是错误的
Service postfix reload
以上方法只配置了From:部分,而To:部分如何写正则,真的不好写。
2.第二种方法则是postfix的smtp_generic_maps
参数设置。
类似于sendmail的地址伪装功能,可以将本地网域的邮件地址改写成internet上合法的邮件域名地址。
smtp_generic_maps
只作用于外发的需要SMTP的邮件,本地域的内邮件收发,地址是不会修改的。
smtp_generic_maps
文件设置如下
配置postfix添加
Vim main.cf
smtp_generic_maps = hash:/etc/postfix/my_generic_maps
vim my_generic_maps
@localdomain.local
@hisisp.example
建立文件后需要postmap生产hash数据文件
postmap /etc/postfix/my_generic_maps
service postfix reload
该参数会修改掉邮件header的路由、From:、To:相关邮件地址信息
它作用范围,只会修改掉需要发送出去到别台邮件服务器的邮件地址相关信息,local邮件不影响。
3.还可以使用邮件地址规范改写参数canonical_maps实现邮件地址改写:
Canonical_maps的作用区域local与smtp所有邮件,可以用来规范邮件地址,
Firstname.Lastname 风格的地址以及清除无效的域。
缺省postfix是不进行规范地址改写的,你可以通过指定canonical_maps参数的值来使其生效。如:
canonical_maps = hash:/etc/postfix/canonical
Vim canonical
@testmail.com
@test.com
地址改写可以基于单个邮件地址,也可以基于整个域设定。
也可以分别为收件人和发件人地址分别指定不同的改写规范,这时参数sender_canonical_maps和recipient_canonical_maps的优先级比canonical_maps高。如:
sender_canonical_maps = hash:/etc/postfix/sender_canonical
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical
注意:基于以上测试时我发现,用webmail发送的邮件,对方收到的邮件显示地址为改写后的地址(改写成功),但我用OUTLOOK2007发送的邮件对方收到的邮件显示地址并没有被改写。查看header头文件路由Delivered-To:路由信息已被修改但是From:与To:部分的地址没有被改。,
查阅postfix 官网有提到如下注意,而网上与postfix指南都没有这个说明,导致这个问题折腾了我很久。
NOTE: Postfix versions 2.2 and later rewrite message headers from remote SMTP clients only if the client matches the local_header_rewrite_clients parameter, or if the remote_header_rewrite_domain configuration parameter specifies a non-empty value. To get the behavior before Postfix 2.2, specify "local_header_rewrite_clients = static:all".
邮件地址改写作用范围是受local_header_rewrite_clients 设定控制的。默认只是改写
local_header_rewrite_clients
(default: permit_inet_interfaces)
permit_inet_interfaces只作用于
Append the domain name in $
myorigin or $
mydomain when the client IP address matches $
inet_interfaces. This is enabled by default.
我们可以自定义可以邮件地址改写的作用范围:
local_header_rewrite_clients = permit_mynetworks,
permit_sasl_authenticated permit_tls_clientcerts
check_address_map hash:/etc/postfix/pop-before-smtp
我想任何符合canonical表的邮件无论谁发送的都改写,只需在main.cf添加上,就可以了。
local_header_rewrite_clients = static:all