由于工作需要,需要改写用户邮件header头地址与邮件路由地址。整理笔录
改写邮件地址是postfix的核心,在收到邮件后就会进行相应地址修改,地址补充等工作,其流程如下:以下来自postfix官网说明
Postfix address rewriting overview
 

 

trivial-
rewrite(8)

(std form)

 

trivial-
rewrite(8)

(resolve)

 

^
|

|
v

 

^
|

|
v

 

smtpd(8)

>-

cleanup(8)

->

incoming

->

active

->

qmgr(8)

-<

smtp(8)

qmqpd(8)

lmtp(8)

pickup(8)

local(8)

 

^
|

 

^
|

|
v

 
 

bounces
forwarding
notices

 

deferred

     
 

 
由于工作只需要修改邮件header地址,着重只测试了canonical_maps,smtp_generic_maps,header_checke部分修改邮件头地址的方法
1.用header_checker检查头文件,用正则匹配替换发件人地址From
如将[email protected]发件地址替换成[email protected]
Vim main.cf
添加如下开启头检查,使用的是pcre方式。
header_checks = pcre:/etc/postfix/my_header_checks
建立my_header_checks文件
/^From:(.*)[<]([\w\.\-]+)\@test\.com[>]/i     REPLACEFrom:$1< [email protected]>
记得每次修改完my_header_checks文件要重新加载postfix否则出现正则是对的,而匹配出的地址格式显示是错误的
Service postfix reload
以上方法只配置了From:部分,而To:部分如何写正则,真的不好写。
 
2.第二种方法则是postfix的smtp_generic_maps 参数设置。 类似于sendmail的地址伪装功能,可以将本地网域的邮件地址改写成internet上合法的邮件域名地址。 smtp_generic_maps
只作用于外发的需要SMTP的邮件,本地域的内邮件收发,地址是不会修改的。 smtp_generic_maps
如将[email protected]转换改写成[email protected]邮件网关网域地址
文件设置如下
配置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