iT邦幫忙

DAY 8
9

Rails 的簡單任務系列 第 9

[RoR] 多人用虛擬轉址信箱的建置(3)

管理 mail server 常會被問到:信有沒有寄成功?為什麼沒收到信?等問題,本文提供簡單的方式可讓 user 從記錄檔自行查詢轉信結果。
利用 fromto.pl
先 chmod og+r /var/log/maillog ,才可讓 mail 的記錄檔被讀取,另外,請下載 [http:
//ring.u-toyama.ac.jp/archives/NetBSD/packages/distfiles/fromto-1.5](http:<br />
//ring.u-toyama.ac.jp/archives/NetBSD/packages/distfiles/fromto-1.5) 這個 perl
script檔案並放在 /var/log/,在此將檔名改成 fromto.pl 只要修改第一行到系統上 perl 的正確位置,然後 chmod +x fromto.pl,然後執行 perl fromto.pl 就可看到該類似這樣的結果:

Sep 21 04:48 root                       -> root
Sep 21 04:48 root@SITENAME       -> root@SITENAME
Sep 21 05:10 root                       -> root
Sep 21 05:10 root@SITENAME       -> root@SITENAME
UNKNOWN: CACHE sendmail[8427]: m8L5PoHt008427: ruleset=check_rcpt, arg1=<w92d463f@yahoo.com.tw>, relay=118-161-42-87.dynamic.hinet.net [118.161.42.87], reject=550 5.7.1 <w92d463f@yahoo.com.tw>... Relaying denied
UNKNOWN: CACHE sendmail[8427]: m8L5PoHt008427: lost input channel from 118-161-42-87.dynamic.hinet.net [118.161.42.87] to MTA after rcpt

加入看 log 的三種方式
在 app/controllers/vtables_controller.rb 新增個 action 透過參數的不同選擇,顯示出不同的記錄。由於只要從 mailllog 就可以看到其他轉址信箱的目的,就看要不要讓其他 user 看得到,而可以只選一種顯示方式,或者都可以。

  def viewlog
        email = params[:forward]
#只抓出有轉信信箱字串的 maillog 記錄
        if params[:detail] == 'some'
                cmd = "grep -i #{email} /var/log/maillog"
# 秀出最後10行的 mailllog 內容				
        elsif params[:detail] == 'tail'
                cmd = "tail -10 /var/log/maillog"
        else
# 透過 fromto.pl 只秀出有轉信信箱的筆數出來,且將 UNKNOWN 的記錄不顯示出來
                cmd = "/var/log/fromto.pl -to #{email} -ignore U"
        end
# 將 log 檔中有會與 HTML 標籤的符號,置換一下,避免造成顯示上的問題。
        @text = `#{cmd}`.gsub(/</,'<').gsub(/>/,'>').gsub(/\n/,"<br />\n")
#        render :text => @text
  end

編輯一個 app/views/vtables/viewlog.html.erb 檔案來對應 controller 的 viewlog 的template。

<% if @text.empty? %>
<h1>目前log中沒有 <%= params[:forward] -%> 的記錄!</h1>
<% else %>
<% if params[:detail] %>

<% if params[:detail] == 'some' %>
<h1>較詳細的記錄</h1>
<% elsif params[:detail] == 'tail' %>
<h1>maillog的最後 10 行記錄</h1>
<% end %>

<%= highlight(highlight(@text, params[:forward]), 'stat=Sent', highlighter = '<b style="color:black;background-color:#ffff66">\1</b>') -%>
<% else %>
<h1>Log View</h1>
<%= highlight(@text, params[:forward]) -%>
<% end %>
<% end %>

上述有「highlight」的字樣,是可讓要 match 的字串,可用較顯眼的顏色或加粗字體標示出來,讓 user 可一眼看到自己所定的名稱或已Sent的字樣。
修改 app/views/vtables/index.html.erb 讓登入的 user 可以有檢視 maillog 的連結。

<h1>您現有的虛擬信箱列表</h1>
<table border="1">
  <tr>
    <th>使用者</th>
    <th>虛擬信箱</th>
    <th>轉寄到您的真正信箱</th>
  </tr>

<% for vtable in @vtables -%>
  <tr>
    <td><%=h vtable.user.login -%></td>
    <td><%=h vtable.vname -%>@虛擬主機名</td>
    <td><%=h vtable.forward -%></td>
    <td><%= link_to 'Show', vtable -%></td>
    <td><%= link_to 'Edit', edit_vtable_path(vtable) -%></td>
    <td><%= link_to 'Destroy', vtable, :confirm => 'Are you sure?', :method => :delete -%></td>
    <td><%= link_to '查看記錄', "viewlog/#{vtable.vname}" -%></td>
    <td><%= link_to '查看是否寄成的記錄', "viewlog/#{vtable.vname}?detail=some" -%></td>
    <td><%= link_to '最後10行的maillog', "viewlog/#{vtable.vname}?detail=tail" -%></td>
  </tr>
<% end -%>
</table>
<br />
<%= link_to '新增虛擬信箱', new_vtable_path -%>

在 config/routes.rb 加上:
map.connect 'viewlog/:forward', :controller => 'vtables', :action => 'viewlog'
可讓新增的動作生效。另外要提醒的是,只要有更動到 config/routes.rb 後,最好再將 thin 或 mongrel 給重新啟動一下,才會認得所新增的路徑及所要做的動作。

小結論
這個虛擬轉址信箱的小計畫,主要是利用 RoR 結合外部程式的應用,及少許的 if else 的判斷,就可做到簡易的個人化項目功能;而資料庫方面,更是簡單地被處理掉,連個 select 的語法也沒看到,就可以完成 users 與 vtables 的關聯及操作的議題。在這樣可以暫時不管 RoR 怎麼運作的細節下,就可做出實際可用的服務,所以更可以發揮在「要做什麼事情」,而不至花太多心力在「要怎麼做出」的議題上。

截圖
登入後個人列表

新增一筆

查看記錄

查看是否寄成記錄

最後10行的maillog


上一篇
[RoR] 多人用虛擬轉址信箱的建置(2)(續)
下一篇
[RoR] 簡單完成分頁功能
系列文
Rails 的簡單任務33

1 則留言

0
gric
iT邦高手 1 級 ‧ 2009-03-13 21:35:26

謝謝分享咯!

我要留言

立即登入留言