Ruby 写的 Mail Proxy

 

Ruby 写的 Mail Proxy

关键字: ruby
光缆还没修好,公司内部系统有些是放在美国的,不能访问就不能工作。而且因为是内部系统,web proxy也不能用。受 这位亚洲Geek的启发,用 ruby做了一个 mail proxy,用gmail做桥梁,deploy在美国office,从上海office发 mail去访问。

使用效果附图
1. 发 mail

2. 收到的 mail(这是上一版的回复 mail,现在code是把html文件作为附件的)


主要用到
  1. Watir 用来在那里打开IE,login,goto link,get html
  2. Gmailer 用来收发gmail
  3. 还有些小trick,在code里面都commment说明了一下


目前这个程序可以解决一些GET的请求,和GET的form,下一步要做的是,都是些不很紧迫的需求:
  1. form method=post,应该也可以用watir实现。
  2. 直接在mail里面click或者submit,就可以自动发一封request mail出去,把outlook当浏览器使。


共享一下代码。理论上可以访问任何网站。出于安全,code里面的公司网站, mail地址都只是例子。code只管拿去用,不要干坏事。
Ruby代码 
  1. require 'gmailer'  
  2. require 'watir'  
  3. include Watir  
  4.   
  5. host = "http://app.company.com"  
  6. login = "sa"  
  7. pwd = "secret"  
  8.   
  9. gmail_account = 'mail.proxy'  
  10. gmail_pwd = 'secret'  
  11.   
  12. msgerr = ""  
  13. GMailer.connect(gmail_account, gmail_pwd) do |g|  
  14.   g.messages(:read => false).each_msg do |msg|  
  15.     body = msg.body.gsub("<WBR>""").gsub("u003d""="# to fix MIME format  
  16.       
  17.     unless body  
  18.       # the same subject mails will be regarded as a conversation,  
  19.       # we define a rule to avoid that.  
  20.       msgerr = "Please do not use the subject that has been used."  
  21.     else  
  22.       urls = body.scan(/<a href="(.*)".*>/1<//a>/i).flatten!  
  23.     
  24.       if urls.empty?  
  25.         # if get no url, return a error msg.  
  26.         msgerr = "Cannot find any URL in the request mail."  
  27.       else  
  28.         # browser  
  29.         browser = IE.new  
  30.         browser.goto( host + '/login.asp' )  
  31.         browser.text_field( :name'loginname' ).set( login )  
  32.         browser.text_field( :name'password' ).set( pwd )  
  33.         browser.button( :name'submit2' ).click  
  34.           
  35.         files = []  
  36.         for url in urls  
  37.           browser.goto(url) # visit the url  
  38.           html = browser.html.gsub("href=/"""href=/"#{/.*///.match(url)[0]}") # rewrite links   
  39.           html = html.gsub("action=""action=#{/.*///.match(url)[0]}") # rewrite form actions, assume method=get   
  40.           filename = url.split("/").last + ".htm"  
  41.           File.open(filename, 'w') {|f| f.puts html}  
  42.           files << filename  
  43.         end  
  44.         g.send(:to => msg.sender_email,:subject => "Re: " + msg.subject,:files => files)  
  45.         files.each {|f| File.delete(f)}  
  46.         browser.close                
  47.       end  
  48.     end  
  49.      
  50.     if msgerr  
  51.       puts msgerr  
  52.       g.send(:to => msg.sender,:subject => "Re: " + msg.subject,:body => msgerr)  
  53.     end   
  54.   end  
  55. 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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值