mailcatcher 0.4.7 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +4 -1
- data/public/javascripts/application.js +52 -6
- data/public/stylesheets/application.css +66 -34
- data/views/index.haml +11 -4
- metadata +102 -103
data/README.md
CHANGED
@@ -11,6 +11,7 @@ MailCatcher runs a super simple SMTP server which catches any message sent to it
|
|
11
11
|
* Catches all mail and stores it for display.
|
12
12
|
* Shows HTML, Plain Text and Source version of messages, as applicable.
|
13
13
|
* Rewrites HTML enabling display of embedded, inline images/etc and open links in a new window. (currently very basic)
|
14
|
+
* Can send HTML for analysis by [Fractal][fractal].
|
14
15
|
* Lists attachments and allows separate downloading of parts.
|
15
16
|
* Download original email to view in your native mail client(s).
|
16
17
|
* Command line options to override the default SMTP/HTTP IP and port settings.
|
@@ -61,7 +62,7 @@ A fairly RESTful URL schema means you can download a list of messages in JSON fr
|
|
61
62
|
|
62
63
|
## Caveats
|
63
64
|
|
64
|
-
* Mail processing is fairly basic but easily modified. If something doesn't work for you, fork and fix it or file an issue and let me know. Include the whole message you're having problems with.
|
65
|
+
* Mail processing is fairly basic but easily modified. If something doesn't work for you, fork and fix it or [file an issue][mailcatcher-issues] and let me know. Include the whole message you're having problems with.
|
65
66
|
* The interface is very basic and has not been tested on many browsers yet.
|
66
67
|
|
67
68
|
## TODO
|
@@ -93,8 +94,10 @@ Copyright © 2010-2011 Samuel Cochran (sj26@sj26.com). Released under the MIT Li
|
|
93
94
|
For dream catching, try [this](http://goo.gl/kgbh). OR [THIS](http://www.nyanicorn.com), OMG.
|
94
95
|
|
95
96
|
[donate]: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=522WUPLRWUSKE
|
97
|
+
[fractal]: http://getfractal.com
|
96
98
|
[license]: https://github.com/sj26/mailcatcher/blob/master/LICENSE
|
97
99
|
[mailcatcher-github]: https://github.com/sj26/mailcatcher
|
100
|
+
[mailcatcher-issues]: https://github.com/sj26/mailcatcher/issues
|
98
101
|
[tfg]: http://www.thefrontiergroup.com.au
|
99
102
|
[websockets]: http://www.whatwg.org/specs/web-socket-protocol/
|
100
103
|
[withphp]: http://webschuur.com/publications/blogs/2011-05-29-catchmail_for_drupal_and_other_phpapplications_the_simple_version
|
@@ -4,11 +4,35 @@
|
|
4
4
|
MailCatcher = (function() {
|
5
5
|
function MailCatcher() {
|
6
6
|
$('#messages tr').live('click', __bind(function(e) {
|
7
|
+
e.preventDefault();
|
7
8
|
return this.loadMessage($(e.currentTarget).attr('data-message-id'));
|
8
9
|
}, this));
|
9
|
-
$('#message .views .tab').live('click', __bind(function(e) {
|
10
|
-
|
10
|
+
$('#message .views .format.tab a').live('click', __bind(function(e) {
|
11
|
+
e.preventDefault();
|
12
|
+
return this.loadMessageBody(this.selectedMessage(), $($(e.currentTarget).parent('li')).data('message-format'));
|
11
13
|
}, this));
|
14
|
+
$('#message .views .analysis.tab a').live('click', __bind(function(e) {
|
15
|
+
e.preventDefault();
|
16
|
+
return this.loadMessageAnalysis(this.selectedMessage());
|
17
|
+
}, this));
|
18
|
+
$('#resizer').live({
|
19
|
+
mousedown: function(e) {
|
20
|
+
var events;
|
21
|
+
e.preventDefault();
|
22
|
+
return $(window).bind(events = {
|
23
|
+
mouseup: function(e) {
|
24
|
+
e.preventDefault();
|
25
|
+
return $(window).unbind(events);
|
26
|
+
},
|
27
|
+
mousemove: function(e) {
|
28
|
+
e.preventDefault();
|
29
|
+
return $('#messages').css({
|
30
|
+
height: e.clientY - $('#messages').offset().top
|
31
|
+
});
|
32
|
+
}
|
33
|
+
});
|
34
|
+
}
|
35
|
+
});
|
12
36
|
$('nav.app .clear a').live('click', __bind(function(e) {
|
13
37
|
if (confirm("You will lose all your received messages.\n\nAre you sure you want to clear all messages?")) {
|
14
38
|
return $.ajax({
|
@@ -45,7 +69,7 @@
|
|
45
69
|
MailCatcher.prototype.parseDate = function(date) {
|
46
70
|
var match;
|
47
71
|
if (match = this.parseDateRegexp.exec(date)) {
|
48
|
-
return new Date(match[1], match[2], match[3], match[4], match[5], match[6], 0);
|
72
|
+
return new Date(match[1], match[2] - 1, match[3], match[4], match[5], match[6], 0);
|
49
73
|
}
|
50
74
|
};
|
51
75
|
MailCatcher.prototype.formatDate = function(date) {
|
@@ -60,8 +84,11 @@
|
|
60
84
|
}
|
61
85
|
return $("#messages tbody tr[data-message-id=\"" + message + "\"]").length > 0;
|
62
86
|
};
|
87
|
+
MailCatcher.prototype.selectedMessage = function() {
|
88
|
+
return $('#messages tr.selected').data('message-id');
|
89
|
+
};
|
63
90
|
MailCatcher.prototype.addMessage = function(message) {
|
64
|
-
return $('#messages tbody').append($('<tr />').attr('data-message-id', message.id.toString()).append($('<td/>').text(message.sender)).append($('<td/>').text((message.recipients || []).join(', '))).append($('<td/>').text(message.subject)).append($('<td/>').text(this.formatDate(message.created_at))));
|
91
|
+
return $('#messages tbody').append($('<tr />').attr('data-message-id', message.id.toString()).append($('<td/>').text(message.sender || "No sender").toggleClass("blank", !message.sender)).append($('<td/>').text((message.recipients || []).join(', ') || "No receipients").toggleClass("blank", !message.recipients.length)).append($('<td/>').text(message.subject || "No subject").toggleClass("blank", !message.subject)).append($('<td/>').text(this.formatDate(message.created_at))));
|
65
92
|
};
|
66
93
|
MailCatcher.prototype.loadMessage = function(id) {
|
67
94
|
if ((id != null ? id.id : void 0) != null) {
|
@@ -81,6 +108,7 @@
|
|
81
108
|
$el = $(el);
|
82
109
|
format = $el.attr('data-message-format');
|
83
110
|
if ($.inArray(format, message.formats) >= 0) {
|
111
|
+
$el.find('a').attr('href', '/messages/' + id + '.' + format);
|
84
112
|
return $el.show();
|
85
113
|
} else {
|
86
114
|
return $el.hide();
|
@@ -100,12 +128,16 @@
|
|
100
128
|
$('#message .metadata .attachments').hide();
|
101
129
|
}
|
102
130
|
$('#message .views .download a').attr('href', "/messages/" + id + ".eml");
|
103
|
-
|
131
|
+
if ($('#message .views .tab.analysis.selected').length) {
|
132
|
+
return this.loadMessageAnalysis();
|
133
|
+
} else {
|
134
|
+
return this.loadMessageBody();
|
135
|
+
}
|
104
136
|
}, this));
|
105
137
|
}
|
106
138
|
};
|
107
139
|
MailCatcher.prototype.loadMessageBody = function(id, format) {
|
108
|
-
id || (id =
|
140
|
+
id || (id = this.selectedMessage());
|
109
141
|
format || (format = $('#message .views .tab.format.selected').attr('data-message-format'));
|
110
142
|
format || (format = 'html');
|
111
143
|
$("#message .views .tab[data-message-format=\"" + format + "\"]:not(.selected)").addClass('selected');
|
@@ -114,6 +146,20 @@
|
|
114
146
|
return $('#message iframe').attr("src", "/messages/" + id + "." + format);
|
115
147
|
}
|
116
148
|
};
|
149
|
+
MailCatcher.prototype.loadMessageAnalysis = function(id) {
|
150
|
+
var $iframe;
|
151
|
+
id || (id = this.selectedMessage());
|
152
|
+
$("#message .views .analysis.tab:not(.selected)").addClass('selected');
|
153
|
+
$("#message .views :not(.analysis).tab.selected").removeClass('selected');
|
154
|
+
if (id != null) {
|
155
|
+
$iframe = $('#message iframe').contents().children().html("<html class=\"mailcatcher\"><head>" + ($('link[rel="stylesheet"]')[0].outerHTML) + "</head><body><iframe></iframe></body></html>").find("head").append($('link[rel="stylesheet"]').clone()).end().find('iframe').contents().children().html("<html>\n<head>\n<title>Analysis</title>\n" + ($('link[rel="stylesheet"]')[0].outerHTML) + "\n</head>\n<body class=\"iframe\">\n<h1>Analyse your email with Fractal</h1>\n<p><a href=\"http://getfractal.com/\" target=\"_blank\">Fractal</a> is a really neat service that applies common email design and development knowledge from <a href=\"http://www.email-standards.org/\" target=\"_blank\">Email Standards Project</a> to your HTML email and tells you what you've done wrong or what you should do instead.</p>\n<p>Please note that this <strong>sends your email to the Fractal service</strong> for analysis. Read their <a href=\"http://getfractal.com/terms\" target=\"_blank\">terms of service</a> if you're paranoid.</p>\n<form action=\"http://getfractal.com/validate\" method=\"POST\">\n<input type=\"hidden\" name=\"html\" />\n<input type=\"submit\" value=\"Analyse\" disabled=\"disabled\" /><span class=\"loading\" style=\"color: #999\">Loading your email...</span>\n</form>\n</body>\n</html>");
|
156
|
+
return $.get("/messages/" + id + ".html", function(html) {
|
157
|
+
return $iframe.find('input[name="html"]').attr('value', html).end().find('.loading').hide().end().find('input[type="submit"]').attr('disabled', null).end().find('form').submit(function() {
|
158
|
+
return $(this).find('input[type="submit"]').attr('disabled', 'disabled').end().find('.loading').text('Analysing...').show();
|
159
|
+
});
|
160
|
+
});
|
161
|
+
}
|
162
|
+
};
|
117
163
|
MailCatcher.prototype.refresh = function() {
|
118
164
|
return $.getJSON('/messages', __bind(function(messages) {
|
119
165
|
return $.each(messages, __bind(function(i, message) {
|
@@ -66,6 +66,17 @@ body {
|
|
66
66
|
line-height: 2em; }
|
67
67
|
body html > body {
|
68
68
|
font-size: 12px; }
|
69
|
+
body.iframe {
|
70
|
+
background: white; }
|
71
|
+
body.iframe h1 {
|
72
|
+
font-size: 1.3em;
|
73
|
+
margin: 12px; }
|
74
|
+
body.iframe p, body.iframe form {
|
75
|
+
margin: 0 12px 12px 12px;
|
76
|
+
line-height: 1.25; }
|
77
|
+
body.iframe .loading {
|
78
|
+
color: #666666;
|
79
|
+
margin-left: 0.5em; }
|
69
80
|
|
70
81
|
.button {
|
71
82
|
padding: 0.5em 1em;
|
@@ -183,11 +194,13 @@ body > header {
|
|
183
194
|
#messages {
|
184
195
|
width: 100%;
|
185
196
|
height: 10em;
|
197
|
+
min-height: 3em;
|
186
198
|
overflow: auto;
|
187
199
|
background: white;
|
188
|
-
border-top: 1px solid white;
|
189
|
-
border-bottom: 1px solid #cccccc; }
|
200
|
+
border-top: 1px solid white; }
|
190
201
|
#messages table {
|
202
|
+
overflow: hidden;
|
203
|
+
*zoom: 1;
|
191
204
|
width: 100%; }
|
192
205
|
#messages table thead tr {
|
193
206
|
background: #eeeeee;
|
@@ -217,6 +230,16 @@ body > header {
|
|
217
230
|
color: HighlightText; }
|
218
231
|
#messages table tbody tr td {
|
219
232
|
padding: 0.25em; }
|
233
|
+
#messages table tbody tr td.blank {
|
234
|
+
color: #666666;
|
235
|
+
font-style: italic; }
|
236
|
+
|
237
|
+
#resizer {
|
238
|
+
padding-bottom: 5px;
|
239
|
+
cursor: ns-resize; }
|
240
|
+
#resizer .ruler {
|
241
|
+
border-top: 1px solid #cccccc;
|
242
|
+
border-bottom: 1px solid white; }
|
220
243
|
|
221
244
|
#message {
|
222
245
|
display: -moz-box;
|
@@ -227,15 +250,15 @@ body > header {
|
|
227
250
|
box-orient: vertical;
|
228
251
|
-moz-box-flex: 1;
|
229
252
|
-webkit-box-flex: 1;
|
230
|
-
box-flex: 1;
|
231
|
-
border-top: 1px solid white; }
|
253
|
+
box-flex: 1; }
|
232
254
|
#message > header {
|
233
255
|
overflow: hidden;
|
234
256
|
*zoom: 1; }
|
235
257
|
#message > header .metadata {
|
236
258
|
overflow: hidden;
|
237
259
|
*zoom: 1;
|
238
|
-
padding: 0.5em;
|
260
|
+
padding: 0.5em;
|
261
|
+
padding-top: 0; }
|
239
262
|
#message > header .metadata dt, #message > header .metadata dd {
|
240
263
|
padding: 0.25em; }
|
241
264
|
#message > header .metadata dt {
|
@@ -270,28 +293,37 @@ body > header {
|
|
270
293
|
-moz-box-orient: vertical;
|
271
294
|
display: inline-block;
|
272
295
|
vertical-align: middle;
|
273
|
-
*vertical-align: auto;
|
274
|
-
padding: 0.5em;
|
275
|
-
border: 1px solid #cccccc;
|
276
|
-
background: #dddddd;
|
277
|
-
color: #333333;
|
278
|
-
border-width: 1px 1px 0 1px;
|
279
|
-
cursor: pointer;
|
280
|
-
text-shadow: 0 1px 0 #eeeeee; }
|
296
|
+
*vertical-align: auto; }
|
281
297
|
#message > header .views .tab {
|
282
298
|
*display: inline; }
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
299
|
+
#message > header .views .tab a {
|
300
|
+
display: -moz-inline-box;
|
301
|
+
-moz-box-orient: vertical;
|
302
|
+
display: inline-block;
|
303
|
+
vertical-align: middle;
|
304
|
+
*vertical-align: auto;
|
305
|
+
padding: 0.5em;
|
306
|
+
border: 1px solid #cccccc;
|
307
|
+
background: #dddddd;
|
308
|
+
color: #333333;
|
309
|
+
border-width: 1px 1px 0 1px;
|
310
|
+
cursor: pointer;
|
311
|
+
text-shadow: 0 1px 0 #eeeeee;
|
312
|
+
text-decoration: none; }
|
313
|
+
#message > header .views .tab a {
|
314
|
+
*display: inline; }
|
315
|
+
#message > header .views .tab:not(.selected):hover a {
|
316
|
+
background-color: #eeeeee; }
|
317
|
+
#message > header .views .tab.selected a {
|
318
|
+
background: white;
|
319
|
+
color: black;
|
320
|
+
height: 13px;
|
321
|
+
-moz-box-shadow: 1px 1px 0 #cccccc;
|
322
|
+
-webkit-box-shadow: 1px 1px 0 #cccccc;
|
323
|
+
-o-box-shadow: 1px 1px 0 #cccccc;
|
324
|
+
box-shadow: 1px 1px 0 #cccccc;
|
325
|
+
margin-bottom: -2px;
|
326
|
+
cursor: default; }
|
295
327
|
#message > header .views .action {
|
296
328
|
display: -moz-inline-box;
|
297
329
|
-moz-box-orient: vertical;
|
@@ -302,12 +334,12 @@ body > header {
|
|
302
334
|
margin: 0 0.25em; }
|
303
335
|
#message > header .views .action {
|
304
336
|
*display: inline; }
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
337
|
+
|
338
|
+
iframe {
|
339
|
+
display: -moz-box;
|
340
|
+
display: -webkit-box;
|
341
|
+
display: box;
|
342
|
+
-moz-box-flex: 1;
|
343
|
+
-webkit-box-flex: 1;
|
344
|
+
box-flex: 1;
|
345
|
+
background: white; }
|
data/views/index.haml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
!!!
|
2
|
-
%html
|
2
|
+
%html.mailcatcher
|
3
3
|
%head
|
4
4
|
%title MailCatcher
|
5
5
|
%link{:rel => "stylesheet", :href => "/stylesheets/application.css"}
|
@@ -26,6 +26,8 @@
|
|
26
26
|
%th Subject
|
27
27
|
%th Received
|
28
28
|
%tbody
|
29
|
+
#resizer
|
30
|
+
.ruler
|
29
31
|
%article#message
|
30
32
|
%header
|
31
33
|
%dl.metadata
|
@@ -42,9 +44,14 @@
|
|
42
44
|
%ul
|
43
45
|
%nav.views
|
44
46
|
%ul
|
45
|
-
%li.format.tab.html.selected{'data-message-format' => 'html'}
|
46
|
-
|
47
|
-
%li.format.tab.
|
47
|
+
%li.format.tab.html.selected{'data-message-format' => 'html'}
|
48
|
+
%a{:href => '#'} HTML
|
49
|
+
%li.format.tab.plain{'data-message-format' => 'plain'}
|
50
|
+
%a{:href => '#'}Plain Text
|
51
|
+
%li.format.tab.source{'data-message-format' => 'source'}
|
52
|
+
%a{:href => '#'}Source
|
53
|
+
%li.tab.analysis
|
54
|
+
%a{:href => '#'}Analysis
|
48
55
|
%li.action.download
|
49
56
|
%a.button{:href => '#'}
|
50
57
|
%span Download
|
metadata
CHANGED
@@ -1,149 +1,151 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailcatcher
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.4.7
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Samuel Cochran
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-07-07 00:00:00.000000000 +08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &70095712625100 !ruby/object:Gem::Requirement
|
19
18
|
none: false
|
20
|
-
requirements:
|
19
|
+
requirements:
|
21
20
|
- - ~>
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.0'
|
24
23
|
type: :runtime
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: eventmachine
|
28
24
|
prerelease: false
|
29
|
-
|
25
|
+
version_requirements: *70095712625100
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: eventmachine
|
28
|
+
requirement: &70095712624620 !ruby/object:Gem::Requirement
|
30
29
|
none: false
|
31
|
-
requirements:
|
30
|
+
requirements:
|
32
31
|
- - ~>
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version:
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.12'
|
35
34
|
type: :runtime
|
36
|
-
version_requirements: *id002
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: mail
|
39
35
|
prerelease: false
|
40
|
-
|
36
|
+
version_requirements: *70095712624620
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: mail
|
39
|
+
requirement: &70095712624140 !ruby/object:Gem::Requirement
|
41
40
|
none: false
|
42
|
-
requirements:
|
41
|
+
requirements:
|
43
42
|
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version:
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '2.3'
|
46
45
|
type: :runtime
|
47
|
-
version_requirements: *id003
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: sqlite3
|
50
46
|
prerelease: false
|
51
|
-
|
47
|
+
version_requirements: *70095712624140
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: sqlite3
|
50
|
+
requirement: &70095712623640 !ruby/object:Gem::Requirement
|
52
51
|
none: false
|
53
|
-
requirements:
|
52
|
+
requirements:
|
54
53
|
- - ~>
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version:
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.3'
|
57
56
|
type: :runtime
|
58
|
-
version_requirements: *id004
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: thin
|
61
57
|
prerelease: false
|
62
|
-
|
58
|
+
version_requirements: *70095712623640
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: thin
|
61
|
+
requirement: &70095712623160 !ruby/object:Gem::Requirement
|
63
62
|
none: false
|
64
|
-
requirements:
|
63
|
+
requirements:
|
65
64
|
- - ~>
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version:
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.2'
|
68
67
|
type: :runtime
|
69
|
-
version_requirements: *id005
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name: skinny
|
72
68
|
prerelease: false
|
73
|
-
|
69
|
+
version_requirements: *70095712623160
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: skinny
|
72
|
+
requirement: &70095712622700 !ruby/object:Gem::Requirement
|
74
73
|
none: false
|
75
|
-
requirements:
|
74
|
+
requirements:
|
76
75
|
- - ~>
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version:
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0.1'
|
79
78
|
type: :runtime
|
80
|
-
version_requirements: *id006
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
|
-
name: sinatra
|
83
79
|
prerelease: false
|
84
|
-
|
80
|
+
version_requirements: *70095712622700
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: sinatra
|
83
|
+
requirement: &70095712622240 !ruby/object:Gem::Requirement
|
85
84
|
none: false
|
86
|
-
requirements:
|
85
|
+
requirements:
|
87
86
|
- - ~>
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version:
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '1.2'
|
90
89
|
type: :runtime
|
91
|
-
version_requirements: *id007
|
92
|
-
- !ruby/object:Gem::Dependency
|
93
|
-
name: haml
|
94
90
|
prerelease: false
|
95
|
-
|
91
|
+
version_requirements: *70095712622240
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: haml
|
94
|
+
requirement: &70095712621780 !ruby/object:Gem::Requirement
|
96
95
|
none: false
|
97
|
-
requirements:
|
96
|
+
requirements:
|
98
97
|
- - ~>
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
version:
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '3.1'
|
101
100
|
type: :runtime
|
102
|
-
version_requirements: *id008
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: sass
|
105
101
|
prerelease: false
|
106
|
-
|
102
|
+
version_requirements: *70095712621780
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: sass
|
105
|
+
requirement: &70095712621300 !ruby/object:Gem::Requirement
|
107
106
|
none: false
|
108
|
-
requirements:
|
107
|
+
requirements:
|
109
108
|
- - ~>
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
version:
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.1'
|
112
111
|
type: :development
|
113
|
-
version_requirements: *id009
|
114
|
-
- !ruby/object:Gem::Dependency
|
115
|
-
name: compass
|
116
112
|
prerelease: false
|
117
|
-
|
113
|
+
version_requirements: *70095712621300
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: compass
|
116
|
+
requirement: &70095712620840 !ruby/object:Gem::Requirement
|
118
117
|
none: false
|
119
|
-
requirements:
|
118
|
+
requirements:
|
120
119
|
- - ~>
|
121
|
-
- !ruby/object:Gem::Version
|
120
|
+
- !ruby/object:Gem::Version
|
122
121
|
version: 0.11.1
|
123
122
|
type: :development
|
124
|
-
version_requirements: *id010
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: coffee-script
|
127
123
|
prerelease: false
|
128
|
-
|
124
|
+
version_requirements: *70095712620840
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: coffee-script
|
127
|
+
requirement: &70095712620360 !ruby/object:Gem::Requirement
|
129
128
|
none: false
|
130
|
-
requirements:
|
129
|
+
requirements:
|
131
130
|
- - ~>
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version:
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '2.2'
|
134
133
|
type: :development
|
135
|
-
|
136
|
-
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: *70095712620360
|
136
|
+
description: ! " MailCatcher runs a super simple SMTP server which catches any\n
|
137
|
+
\ message sent to it to display in a web interface. Run\n mailcatcher, set
|
138
|
+
your favourite app to deliver to\n smtp://127.0.0.1:1025 instead of your default
|
139
|
+
SMTP server,\n then check out http://127.0.0.1:1080 to see the mail.\n"
|
137
140
|
email: sj26@sj26.com
|
138
|
-
executables:
|
141
|
+
executables:
|
139
142
|
- mailcatcher
|
140
143
|
- catchmail
|
141
144
|
extensions: []
|
142
|
-
|
143
|
-
extra_rdoc_files:
|
145
|
+
extra_rdoc_files:
|
144
146
|
- README.md
|
145
147
|
- LICENSE
|
146
|
-
files:
|
148
|
+
files:
|
147
149
|
- README.md
|
148
150
|
- LICENSE
|
149
151
|
- bin/catchmail
|
@@ -161,32 +163,29 @@ files:
|
|
161
163
|
- public/javascripts/modernizr.js
|
162
164
|
- public/stylesheets/application.css
|
163
165
|
- views/index.haml
|
166
|
+
has_rdoc: true
|
164
167
|
homepage: http://github.com/sj26/mailcatcher
|
165
168
|
licenses: []
|
166
|
-
|
167
169
|
post_install_message:
|
168
170
|
rdoc_options: []
|
169
|
-
|
170
|
-
require_paths:
|
171
|
+
require_paths:
|
171
172
|
- lib
|
172
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
173
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
173
174
|
none: false
|
174
|
-
requirements:
|
175
|
-
- -
|
176
|
-
- !ruby/object:Gem::Version
|
175
|
+
requirements:
|
176
|
+
- - ! '>='
|
177
|
+
- !ruby/object:Gem::Version
|
177
178
|
version: 1.8.7
|
178
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
180
|
none: false
|
180
|
-
requirements:
|
181
|
-
- -
|
182
|
-
- !ruby/object:Gem::Version
|
183
|
-
version:
|
181
|
+
requirements:
|
182
|
+
- - ! '>='
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
184
185
|
requirements: []
|
185
|
-
|
186
186
|
rubyforge_project:
|
187
|
-
rubygems_version: 1.
|
187
|
+
rubygems_version: 1.6.2
|
188
188
|
signing_key:
|
189
189
|
specification_version: 3
|
190
190
|
summary: Runs an SMTP server, catches and displays email in a web interface.
|
191
191
|
test_files: []
|
192
|
-
|