hmailserver
郵件使用者的收信送信的規則
作者:cschen33.tw@gmail.com
建立日期:2010/01/25
最後日期:2010/01/25

有一些公司的"主管" 要求限制某一些人只可以收送公司內部郵件,其它的郵件一律禁止,然而這一些功能並不是一般的 mail server 可以做的到,而且不是基本功能,因此可能需要借助別的程式的功能.

本來想沿用postfix或sendmail 的功能,但是似乎做不到,因為原來的porcmail是local delivery agent ,只能針對進入本機的郵件做處理,而一般我們可以使用別名取代其部份功能,若是外寄的郵件就無法處理,而sendmail 的 ruleset似乎不是那麼好懂,因此最後就尋找別的軟體
測試過無數的軟體最後可以用的如下
1.hmailserver  一個不錯的mail server 畫面很乾淨,5.0版已經不是開源的軟體,整合了防spam,防毒的功能
                      其文件的->安裝->系統要求,中提到最大的 hMailServer主機包含了 20 000 個以上的帳號.
2.rainbower mail server   -全中文化的軟體,一看就覺得是商業軟體,但是其有上述的兩項功能,限制外寄,及郵件審核,而且只要勾選就可以了,但是似乎是中小型的mail server 不知其效能如何

最後選擇了hmailserver

環境
若是單純的限制部份使用者外寄郵件,使用2.可以很簡單的達到,然而公司是跨集團,因此有不同的網域,也不是每一個公司都有vpn 可以使用內部連線,來收送郵件,因此有了這個因素就無法單純使用一般的設定
假設有三家公司
1.a.com.tw
2.b.com.tw
3.c.com.tw
這三家是使用外部來寄信,因此是外部郵件,但是對集團來說它們是內部郵件

實作(使用rule規則)
雖然可以成功針對進來的郵件作限制,但對外送的郵件似乎不是那麼直覺,而郵件的動作只有轉信或是刪除,回覆等功能和我需要寫一封信來
通知寄件者似乎做不到
#必須使用者驗證寄信-不驗證就無法得知寄件者
#寄信要使用全域規則來設定
#收信使用個人帳號的規則

限制user1來收寄外部郵件
考慮
寄信,限制寄外部郵件
   寄件者是user1@a.com.tw   收件者不是a.com.tw,b.com.tw,c.com.tw三家公司刪除
收信,限制收外部郵件
   收信者是user1@a.com.tw   寄件者不是a.com.tw,b.com.tw,c.com.tw三家公司刪除

寄信
全域規則 寄件者 user1@a.com.tw 收件者不含a.com.tw b.com.tw,c.com.tw (以and來運算)
動作刪除

收信
個人規則 收信者是user1@a.com.tw   寄件者不含a.com.tw,b.com.tw,c.com.tw(以and來運算)

#剛開始不要使用刪除而是使用轉寄到某一個使用者,來確認
#啟用驗證的方法 :hmailserver->進階->ip範圍  可以設定 內寄/外送 使用驗證模式,來限制寄到外部

實作(vbscript)
是討論區中有談到限制本地使用者寄信,但不合乎我的需求因此被我改寫如下,可以運用在集團間

'限制使用者寄發非許可網域的信,若是使用 者寄 發時會通知他,針對寄信
'郵件寄件者 oMessage.FromAddress
'收件者數量 oMessage.recipients.count
'清除原有的收件者 oMessage.clearrecipients()
'寫一封信oApp= CreateObject("hMailServer.Application")
Sub OnDeliverMessage(oMessage)
   Dim LocalOnlyAccounts(100) '只允許本地帳號
   Dim temprecipients(100)    '收件者帳號
   Dim varDomain              '本地網域
   Dim varAddress            
   Dim RejectedAddress        '拒絕位址
   Dim GroupDomains(10)       '集團網域
  

   varDomain = "a.com.tw"       '網域的名稱
   GroupDomains(0) = "b.com.tw" '公司集團網域1
   GroupDomains(1) = "c.com.tw" '公司集團網域2
  
   LocalOnlyAccounts(0)= "abc" & "@" & varDomain      '限制使用者1
   'LocalOnlyAccounts(1)= "user2" & "@" & varDomain   '限制使用者2

   RejectedAddress = ""
   For i = 0 to uBound(LocalOnlyAccounts)
      If oMessage.FromAddress = LocalOnlyAccounts(i) then '寄件者,如果是被限制的帳號
         for j = 0 to oMessage.recipients.count -1        '將收件者寫入陣列temprecipients
            temprecipients(j) = oMessage.recipients.item(j).address
         next 'j
         j = 0
         k = oMessage.recipients.count -1
         while j <= k                                 
            If instr(temprecipients(j),"@"& VarDomain) = 0 and _
               instr(temprecipients(j),"@"&GroupDomains(0)) = 0 and _
               instr(temprecipients(j),"@"&GroupDomains(1)) = 0  then '收件者,如果未包含本地的使用者
               l= j              
               RejectedAddress = RejectedAddress & temprecipients(l) & VBNewLine
               while l < k
                  temprecipients(l) = temprecipients(l+1)
                  l=l+1
               wend
               temprecipients(k) = ""
               k=k-1
            else
               j=j+1                 
            end if
         wend        
         oMessage.clearrecipients()
         For j = 0 to k
            varAddress = temprecipients(j)
            oMessage.AddRecipient "", varAddress
         Next 'j
         oMessage.save

      End if
   Next 'i

   If RejectedAddress <> "" then      '當發現一些不合法的收件者時,寫一封信告訴他
      dim oApp, newMessage
      dim MessageSubject
      dim MessageRecipientAddress

      Set oApp = CreateObject("hMailServer.Application")

      ' Give this script permission to access all
      ' hMailServer settings.
      Call oApp.Authenticate("Administrator", "AdminPassword")        '使用管理者來驗證

      MessageRecipientAddress = oMessage.FromAddress
      MessageSubject = "自動拒絕的郵件"                   '設定郵件的主旨

      Set newMessage = CreateObject("hMailServer.Message")
      newMessage.From = "自動系統郵件 <admin@a.com.tw>"     '寄件者
      newMessage.FromAddress = "admin@a.com.tw"            '寄件者
      newMessage.Subject = MessageSubject
      newMessage.AddRecipient "", MessageRecipientAddress
      newMessage.Body = "你的郵件主旨: " & oMessage.subject & " 因為你的帳號被限制只能寄信給集團內部的使用者"
      newMessage.Body = NewMessage.body & "所有位於:" & vbNewLine & VarDomain
      for i = 0 to  ubound(GroupDomains)
          newMessage.Body = NewMessage.body & GroupDomains(i)        
      next
      
      newMessage.Body = NewMessage.body & vbNewLine & vbNewLine
      newMessage.Body = NewMessage.body & "下面的收寄者不會收到你的信"
      newMessage.Body = NewMessage.body & RejectedAddress
      newMessage.Save
   End if
End Sub
將程式存起來放在hmailserver安裝程式\Events\EventHandlers.vbs下就可以了
當然要變更你的上述紅字部份,藍色可能不需要變更,因為localhost預設寄內部不需要驗證
記得檔案格式utf-16 lf
在設定->進階->腳本->檢查語法  如果正確
                                       重新載入
如此設定就會套用

中文化 我已經更新hmailserver上的taiwanese語言為100%
http://www.hmailserver.com/devnet/?page=translation_status
點選taiwanese
全選複製,開啟一個可以存成utf-16 LF格式的編輯軟體(我使用pspad)
將檔案存到安裝目錄下的Languages目錄下檔名taiwanese.ini
到到安裝目錄的bin目錄打開hMailServer.INI
在[GUILanguages]段落加入下面藍色的字
ValidLanguages=english,swedish,taiwanese
停用再重啟服務
進入hmailserver 選擇 file ->language