由于工作需要,需要改寫用戶郵件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
如將user01@test.com發件地址替換成user01@ct.com
Vim main.cf
添加如下開啟頭檢查,使用的是pcre方式。
header_checks = pcre:/etc/postfix/my_header_checks
建立my_header_checks文件
/^From:(.*)[<]([\w\.\-]+)\@test\.com[>]/i REPLACeFrom:$1<$2@ct.com>
記得每次修改完my_header_checks文件要重新加載postfix否則出現正則是對的,而匹配出的地址格式顯示是錯誤的
Service postfix reload
以上方法只配置了From:部分,而To:部分如何寫正則,真的不好寫。
2.第二種方法則是postfix的smtp_generic_maps參數設置。類似于sendmail的地址偽裝功能,可以將本地網域的郵件地址改寫成internet上合法的郵件域名地址。smtp_generic_maps
只作用于外發的需要SMTP的郵件,本地域的內郵件收發,地址是不會修改的。smtp_generic_maps
如將user01@domain.local轉換改寫成user01@domain.com郵件網關網域地址
文件設置如下
配置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