2012-12-06 52 views
1

我使用Postfix MTA並從破損的MTA(我無法修復,因爲它不在我的控制下)中獲取重要郵件,該郵件以以下格式發送:postfix pcre正則表達式來匹配和替換子字符串

RCPT TO: <+49 (681) 12345678> 

我需要的是:

RCPT TO: 4968112345678 

所以我要尋找一個正則表達式,而如果該字符串開頭首先檢查「RCPT TO:」如果這是真的,它需要刪除所有特殊之後的字符,因此只剩下[a-zA-Z0-9]。

後綴船舶這樣regex'es一個例子:

# Work around clients that send RCPT TO:<'[email protected]'>. 
# WARNING: do not lose the parameters that follow the address. 
#/^RCPT\s+TO:\s*<'([^[:space:]]+)'>(.*)/  RCPT TO:<$1>$2 

但幾個小時後,我無法使它適應我的需要。

由於提前, 馬科

回答

2

這似乎是,它不可能在剝離通用箱子非字母數字字符的任意組合。但是,對於地址像例子中給出這個正則表達式應該是足夠了:

/^[^a-z0-9]*([a-z0-9]+)[^a-z0-9]*([a-z0-9]+)[^a-z0-9]*([a-z0-9]+)$/  $1$2$3 

您可以通過postmap命令來測試正則表達式的地圖:

$ postmap -q "+49 (681) 12345678" pcre:/path/to/regexp_map 
4968112345678 

要使用這個正則表達式的地圖添加到後綴配置

canonical_maps = prce:$config_directory/regexp_map 

閱讀關於canonical_maps的ADDRESS_REWRITING_README

+0

這按預期工作。非常感謝。我使用的是smtpd_command_filter,它是修改破損客戶端的smtp對話框的低級方法。 – mgabriel

+0

不幸的是,它不起作用。我以「RCPT TO:」開頭的輸入不匹配,只有沒有<>的號碼匹配。但這不起作用。 – mgabriel

+0

@mgabriel對於smtpd_command_filter試試這個正則表達式:'/^RCPT \ s + TO:\ s + <[^ a-z0-9] *([a-z0-9] +)[^ a-z0-9] *( [a-z0-9] +)[^ a-z0-9] *([a-z0-9] +)> $/RCPT TO:<$1$2$3>' – citrin

1

嘗試:/[^RCPT\sTO\:\s]([a-zA-Z0-9]+)/過濾掉所有導致49 681 12345678的字母數字值。 [1]

另一個更好的方法是黑名單所有不需要的字符也可以是一個選項,但聽起來並不理想。 /([^<+\)\(>]+)/結果在RCPT TO: 49 681 12345678[2]

或者最好的選擇是捕獲任何單詞字符(字母,數字,下劃線)/(\w+|:)/導致RCPT TO: 49 681 12345678[3]

所有這一切都與rubular測試,我不知道Postfix的MTA。但我希望這有助於。

永久鏈接:

  1. http://www.rubular.com/r/Uapn2m52yk
  2. http://www.rubular.com/r/015iyaNG3T
  3. http://www.rubular.com/r/mmJZBNbH99
+0

未測試,因爲我需要刪除空格太。謝謝你的幫助。 – mgabriel