Ruby 写的 Mail Proxy
关键字: ruby
光缆还没修好,公司内部系统有些是放在美国的,不能访问就不能工作。而且因为是内部系统,web proxy也不能用。受
这位亚洲Geek的启发,用
ruby做了一个
mail proxy,用gmail做桥梁,deploy在美国office,从上海office发
mail去访问。
使用效果附图
1. 发 mail
2. 收到的 mail(这是上一版的回复 mail,现在code是把html文件作为附件的)
主要用到
目前这个程序可以解决一些GET的请求,和GET的form,下一步要做的是,都是些不很紧迫的需求:
共享一下代码。理论上可以访问任何网站。出于安全,code里面的公司网站, mail地址都只是例子。code只管拿去用,不要干坏事。
使用效果附图
1. 发 mail
2. 收到的 mail(这是上一版的回复 mail,现在code是把html文件作为附件的)
主要用到
- Watir 用来在那里打开IE,login,goto link,get html
- Gmailer 用来收发gmail
- 还有些小trick,在code里面都commment说明了一下
目前这个程序可以解决一些GET的请求,和GET的form,下一步要做的是,都是些不很紧迫的需求:
- form method=post,应该也可以用watir实现。
- 直接在mail里面click或者submit,就可以自动发一封request mail出去,把outlook当浏览器使。
共享一下代码。理论上可以访问任何网站。出于安全,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
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]