mailcatcher 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/lib/mail_catcher.rb +22 -16
- metadata +2 -2
data/README.md
CHANGED
@@ -4,7 +4,7 @@ Catches mail and serves it through a dream.
|
|
4
4
|
|
5
5
|
MailCatcher runs a super simple SMTP server which catches any message sent to it to display in a web interface. Run mailcatcher, set your favourite app to deliver to smtp://127.0.0.1:1025 instead of your default SMTP server, then check out http://127.0.0.1:1080 to see the mail that's arrived so far.
|
6
6
|
|
7
|
-
![MailCatcher screenshot](http://
|
7
|
+
![MailCatcher screenshot](http://f.cl.ly/items/0w3m122B401k3Q2C373Q/Image%202011.06.01%202:06:25%20AM.png)
|
8
8
|
|
9
9
|
## Features
|
10
10
|
|
data/lib/mail_catcher.rb
CHANGED
@@ -1,25 +1,29 @@
|
|
1
1
|
require 'active_support/all'
|
2
|
-
require 'daemons'
|
3
2
|
require 'eventmachine'
|
3
|
+
require ‘rbconfig’
|
4
4
|
require 'thin'
|
5
5
|
|
6
|
+
def windows?
|
7
|
+
Config::CONFIG[‘host_os’] =~ /mswin|mingw/
|
8
|
+
end
|
9
|
+
|
6
10
|
module MailCatcher
|
7
11
|
extend ActiveSupport::Autoload
|
8
|
-
|
12
|
+
|
9
13
|
autoload :Events
|
10
14
|
autoload :Mail
|
11
15
|
autoload :Smtp
|
12
16
|
autoload :Web
|
13
|
-
|
17
|
+
|
14
18
|
@@defaults = {
|
15
19
|
:smtp_ip => '127.0.0.1',
|
16
20
|
:smtp_port => '1025',
|
17
21
|
:http_ip => '127.0.0.1',
|
18
22
|
:http_port => '1080',
|
19
23
|
:verbose => false,
|
20
|
-
:daemon => true
|
24
|
+
:daemon => true unless windows?,
|
21
25
|
}
|
22
|
-
|
26
|
+
|
23
27
|
def self.parse! arguments=ARGV, defaults=@@defaults
|
24
28
|
@@defaults.dup.tap do |options|
|
25
29
|
OptionParser.new do |parser|
|
@@ -45,8 +49,10 @@ module MailCatcher
|
|
45
49
|
options[:http_port] = port
|
46
50
|
end
|
47
51
|
|
48
|
-
|
49
|
-
|
52
|
+
unless windows?
|
53
|
+
parser.on('-f', '--foreground', 'Run in the foreground') do
|
54
|
+
options[:daemon] = false
|
55
|
+
end
|
50
56
|
end
|
51
57
|
|
52
58
|
parser.on('-v', '--verbose', 'Be more verbose') do
|
@@ -60,34 +66,34 @@ module MailCatcher
|
|
60
66
|
end.parse!
|
61
67
|
end
|
62
68
|
end
|
63
|
-
|
69
|
+
|
64
70
|
def self.run! options=nil
|
65
71
|
# If we are passed options, fill in the blanks
|
66
72
|
options &&= @@defaults.merge options
|
67
73
|
# Otherwise, parse them from ARGV
|
68
74
|
options ||= parse!
|
69
|
-
|
75
|
+
|
70
76
|
puts "Starting MailCatcher"
|
71
77
|
|
72
78
|
Thin::Logging.silent = true
|
73
|
-
|
79
|
+
|
74
80
|
# One EventMachine loop...
|
75
81
|
EventMachine.run do
|
76
82
|
# TODO: DRY this up
|
77
|
-
|
83
|
+
|
78
84
|
# Set up an SMTP server to run within EventMachine
|
79
85
|
rescue_port options[:smtp_port] do
|
80
86
|
EventMachine.start_server options[:smtp_ip], options[:smtp_port], Smtp
|
81
87
|
puts "==> smtp://#{options[:smtp_ip]}:#{options[:smtp_port]}"
|
82
88
|
end
|
83
|
-
|
89
|
+
|
84
90
|
# Let Thin set itself up inside our EventMachine loop
|
85
91
|
# (Skinny/WebSockets just works on the inside)
|
86
92
|
rescue_port options[:http_port] do
|
87
93
|
Thin::Server.start options[:http_ip], options[:http_port], Web
|
88
94
|
puts "==> http://#{options[:http_ip]}:#{options[:http_port]}"
|
89
95
|
end
|
90
|
-
|
96
|
+
|
91
97
|
# Daemonize, if we should, but only after the servers have started.
|
92
98
|
if options[:daemon]
|
93
99
|
EventMachine.next_tick do
|
@@ -97,17 +103,17 @@ module MailCatcher
|
|
97
103
|
end
|
98
104
|
end
|
99
105
|
end
|
100
|
-
|
106
|
+
|
101
107
|
def self.quit!
|
102
108
|
EventMachine.next_tick { EventMachine.stop_event_loop }
|
103
109
|
end
|
104
110
|
|
105
|
-
protected
|
111
|
+
protected
|
106
112
|
|
107
113
|
def self.rescue_port port
|
108
114
|
begin
|
109
115
|
yield
|
110
|
-
|
116
|
+
|
111
117
|
# XXX: EventMachine only spits out RuntimeError with a string description
|
112
118
|
rescue RuntimeError
|
113
119
|
if $!.to_s =~ /\bno acceptor\b/
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: mailcatcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.4.
|
5
|
+
version: 0.4.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Samuel Cochran
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-06-01 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|