由于(yu)工作需(xu)要(yao),需(xu)要(yao)改寫(xie)用戶(hu)郵件(jian)header頭地(di)址(zhi)與郵件(jian)路由地(di)址(zhi)。整理筆(bi)錄(lu)
改寫郵(you)(you)件(jian)地(di)址是postfix的核心,在收(shou)到郵(you)(you)件(jian)后就會(hui)進行(xing)相應地(di)址修改,地(di)址補(bu)充等(deng)工作,其流程(cheng)如下(xia):以下(xia)來自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部分(fen)修改郵件頭地址(zhi)的方法
。
1.用(yong)header_checker檢查頭文件,用(yong)正則匹配替換發件人地址From
如將user01@test.com發(fa)件地址替換成user01@ct.com
Vim main.cf
添加如下開(kai)啟頭檢查,使(shi)用的是pcre方式。
header_checks = pcre:/etc/postfix/my_header_checks
建立(li)my_header_checks文(wen)件
/^From:(.*)[<]([\w\.\-]+)\@test\.com[>]/i REPLACeFrom:$1<$2@ct.com>
記得每次修改完my_header_checks文(wen)件要重新加載postfix否則(ze)出現正(zheng)則(ze)是(shi)對(dui)的,而匹配出的地址格式顯(xian)示是(shi)錯誤(wu)的
Service postfix reload
以上(shang)方(fang)法只配(pei)置了From:部(bu)分,而To:部(bu)分如何寫正(zheng)則(ze),真(zhen)的不好寫。
2.第二(er)種方法(fa)則(ze)是(shi)postfix的smtp_generic_maps參數設(she)置。類似于sendmail的地址(zhi)偽裝功能,可以(yi)將本地網(wang)域的郵件地址(zhi)改寫成(cheng)internet上合法的郵件域名地址(zhi)。smtp_generic_maps
只作用于外發的(de)(de)需(xu)要SMTP的(de)(de)郵件,本地域的(de)(de)內郵件收發,地址是不會修改的(de)(de)。smtp_generic_maps
如將user01@domain.local轉換改寫成user01@domain.com郵件網關(guan)網域地址
文件設置如(ru)下
配置(zhi)postfix添加
Vim main.cf
smtp_generic_maps = hash:/etc/postfix/my_generic_maps
vim my_generic_maps
user01@domain.local user01@domain.com
@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
wyjos@test.com jos.wang@test.com
@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_inte-ces)
permit_inet_inte-ces只作用于
append the domain name in $
myorigin or $
mydomain when the client IP address matches $
inet_inte-ces. 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