Ruby 寫的 Mail Proxy

光纜還沒修好,公司內部系統有些是放在美國的,不能訪問就不能工作。而且因爲是內部系統,web proxy也不能用。受[url=http://developers.slashdot.org/developers/06/12/31/2321235.shtml]這位亞洲Geek[/url]的啓發,用ruby做了一個mail proxy,用gmail做橋樑,deploy在美國office,從上海office發mail去訪問。

使用效果附圖
1. 發mail
[img]http://cvu.iteye.com/upload/attachment/pic/3463/d63332a8-875f-441d-b769-96f883ee0af5-thumb.jpg[/img]
2. 收到的mail(這是上一版的回覆mail,現在code是把html文件作爲附件的)
[img]http://cvu.iteye.com/upload/attachment/pic/3464/cc83afcd-fe30-4dc7-95a7-d812a92d049c-thumb.jpg[/img]

主要用到
[list=1]
[*] [b]Watir[/b] 用來在那裏打開IE,login,goto link,get html
[*] [b]Gmailer[/b] 用來收發gmail
[*] 還有些小trick,在code裏面都commment說明了一下
[/list]

目前這個程序可以解決一些GET的請求,和GET的form,下一步要做的是,都是些不很緊迫的需求:
[list=1]
[*] form method=post,應該也可以用watir實現。
[*] 直接在mail裏面click或者submit,就可以自動發一封request mail出去,把outlook當瀏覽器使。
[/list]

共享一下代碼。理論上可以訪問任何網站。出於安全,code裏面的公司網站,mail地址都只是例子。code只管拿去用,不要幹壞事。

require 'gmailer'
require 'watir'
include Watir

host = "http://app.company.com"
login = "sa"
pwd = "secret"

gmail_account = 'mail.proxy'
gmail_pwd = 'secret'

msgerr = ""
GMailer.connect(gmail_account, gmail_pwd) do |g|
g.messages(:read => false).each_msg do |msg|
body = msg.body.gsub("<WBR>", "").gsub("u003d", "=") # to fix MIME format

unless body
# the same subject mails will be regarded as a conversation,
# we define a rule to avoid that.
msgerr = "Please do not use the subject that has been used."
else
urls = body.scan(/<a href="(.*)".*>\1<\/a>/i).flatten!

if urls.empty?
# if get no url, return a error msg.
msgerr = "Cannot find any URL in the request mail."
else
# browser
browser = IE.new
browser.goto( host + '/login.asp' )
browser.text_field( :name, 'loginname' ).set( login )
browser.text_field( :name, 'password' ).set( pwd )
browser.button( :name, 'submit2' ).click

files = []
for url in urls
browser.goto(url) # visit the url
html = browser.html.gsub("href=\"", "href=\"#{/.*\//.match(url)[0]}") # rewrite links
html = html.gsub("action=", "action=#{/.*\//.match(url)[0]}") # rewrite form actions, assume method=get
filename = url.split("/").last + ".htm"
File.open(filename, 'w') {|f| f.puts html}
files << filename
end
g.send(:to => msg.sender_email,:subject => "Re: " + msg.subject,:files => files)
files.each {|f| File.delete(f)}
browser.close
end
end

if msgerr
puts msgerr
g.send(:to => msg.sender,:subject => "Re: " + msg.subject,:body => msgerr)
end
end
end
[img]
發佈了0 篇原創文章 · 獲贊 0 · 訪問量 2240
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章