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 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
- return this.loadMessageBody($('#messages tr.selected').attr('data-message-id'), $(e.currentTarget).attr('data-message-format'));
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
- return this.loadMessageBody();
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 = $('#messages tr.selected').attr('data-message-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
- #message > header .views .tab:not(.selected):hover {
284
- background-color: #eeeeee; }
285
- #message > header .views .tab.selected {
286
- background: white;
287
- color: black;
288
- height: 13px;
289
- -moz-box-shadow: 1px 1px 0 #cccccc;
290
- -webkit-box-shadow: 1px 1px 0 #cccccc;
291
- -o-box-shadow: 1px 1px 0 #cccccc;
292
- box-shadow: 1px 1px 0 #cccccc;
293
- margin-bottom: -2px;
294
- cursor: default; }
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
- #message .body {
306
- display: -moz-box;
307
- display: -webkit-box;
308
- display: box;
309
- -moz-box-flex: 1;
310
- -webkit-box-flex: 1;
311
- box-flex: 1;
312
- width: 100%;
313
- background: white; }
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'} HTML
46
- %li.format.tab.plain{'data-message-format' => 'plain'} Plain Text
47
- %li.format.tab.source{'data-message-format' => 'source'} Source
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
- date: 2011-06-24 00:00:00 Z
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
- prerelease: false
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: "3.0"
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
- requirement: &id002 !ruby/object:Gem::Requirement
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: "0.12"
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
- requirement: &id003 !ruby/object:Gem::Requirement
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: "2.3"
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
- requirement: &id004 !ruby/object:Gem::Requirement
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: "1.3"
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
- requirement: &id005 !ruby/object:Gem::Requirement
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: "1.2"
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
- requirement: &id006 !ruby/object:Gem::Requirement
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: "0.1"
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
- requirement: &id007 !ruby/object:Gem::Requirement
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: "1.2"
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
- requirement: &id008 !ruby/object:Gem::Requirement
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: "3.1"
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
- requirement: &id009 !ruby/object:Gem::Requirement
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: "3.1"
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
- requirement: &id010 !ruby/object:Gem::Requirement
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
- requirement: &id011 !ruby/object:Gem::Requirement
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: "2.2"
131
+ - !ruby/object:Gem::Version
132
+ version: '2.2'
134
133
  type: :development
135
- version_requirements: *id011
136
- description: " MailCatcher runs a super simple SMTP server which catches any\n message sent to it to display in a web interface. Run\n mailcatcher, set your favourite app to deliver to\n smtp://127.0.0.1:1025 instead of your default SMTP server,\n then check out http://127.0.0.1:1080 to see the mail.\n"
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: "0"
181
+ requirements:
182
+ - - ! '>='
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
184
185
  requirements: []
185
-
186
186
  rubyforge_project:
187
- rubygems_version: 1.8.4
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
-