mailtrap 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,5 @@
1
+ == 1.0.0 / 2007-10-03
2
+
3
+ * 1 major enhancement
4
+ * Birthday!
5
+
@@ -0,0 +1,6 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/mailtrap
6
+ lib/mailtrap.rb
@@ -0,0 +1,58 @@
1
+ mailtrap
2
+ by Matt Mower <self@mattmower.com>
3
+ http://matt.blogs.it/
4
+
5
+ == DESCRIPTION:
6
+
7
+ Mailtrap is a mock SMTP server for use in Rails development. Mailtrap waits for
8
+ a client to connect and talks just enough SMTP for ActionMailer to send its message
9
+ which Mailtrap will write into a file for you to inspect. Mailtrap makes no
10
+ attempt to actually deliver anything (hence the name Mail*trap*).
11
+
12
+ You can configure the hostname (default: localhost) and port (default: 1025)
13
+ for the server and also where the messages get written (default: /tmp). Messages
14
+ will get written to files named smtp0001.msg, smtp0002.msg, and so on.
15
+
16
+ == FEATURES/PROBLEMS:
17
+
18
+ * Test with ActionMailer's SMTP delivery method
19
+ * Very, very, dumb ... might not work with an arbitrary Mail client
20
+
21
+ == SYNOPSIS:
22
+
23
+ mailtrap --host localhost --port 8025 --once
24
+
25
+ == REQUIREMENTS:
26
+
27
+ * Rubygems
28
+ * Daemons rubygem
29
+ * Trollop rubygem
30
+
31
+ == INSTALL:
32
+
33
+ * sudo gem install -y mailtrap
34
+
35
+ == LICENSE:
36
+
37
+ (The MIT License)
38
+
39
+ Copyright (c) 2007 Matt Mower, Software Heretics
40
+
41
+ Permission is hereby granted, free of charge, to any person obtaining
42
+ a copy of this software and associated documentation files (the
43
+ 'Software'), to deal in the Software without restriction, including
44
+ without limitation the rights to use, copy, modify, merge, publish,
45
+ distribute, sublicense, and/or sell copies of the Software, and to
46
+ permit persons to whom the Software is furnished to do so, subject to
47
+ the following conditions:
48
+
49
+ The above copyright notice and this permission notice shall be
50
+ included in all copies or substantial portions of the Software.
51
+
52
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
53
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
54
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
55
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
56
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
57
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
58
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,20 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/mailtrap.rb'
6
+
7
+ Hoe.new('mailtrap', Mailtrap::VERSION) do |p|
8
+ p.rubyforge_name = 'rubymatt'
9
+ p.author = 'Matt Mower'
10
+ p.email = 'self@mattmower.com'
11
+ p.summary = 'Mailtrap is a mock SMTP server for use in Rails development'
12
+ p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
13
+ p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
14
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
15
+ p.remote_rdoc_dir = 'mailtrap'
16
+ p.extra_deps << ['daemons','>= 1.0.8']
17
+ p.extra_deps << ['trollop','>= 1.7']
18
+ end
19
+
20
+ # vim: syntax=Ruby
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Run the mailtrap server
4
+ #
5
+
6
+ require 'rubygems'
7
+ require 'daemons'
8
+ require 'mailtrap'
9
+
10
+ opts = Trollop::options do
11
+ opt :host, "The host SMTP clients will connect to", :default => 'localhost'
12
+ opt :port, "The port SMTP clients will connect to", :default => 2525
13
+ opt :once, "Whether to terminate after serving the first client", :default => false
14
+ opt :msgdir, "Where messages get stored", :default => "/var/tmp"
15
+ end
16
+
17
+ options = {
18
+ :dir_mode => :normal,
19
+ :dir => '/var/tmp',
20
+ :multiple => true,
21
+ :mode => :exec,
22
+ :backtrace => true,
23
+ :log_output => true
24
+ }
25
+
26
+ Daemons.run_proc( 'mailtrap', options ) do
27
+ Mailtrap.new( opts[:host], opts[:port], opts[:once], opts[:msgdir] )
28
+ end
@@ -0,0 +1,121 @@
1
+
2
+ require 'rubygems'
3
+ require 'daemons'
4
+ require 'socket'
5
+ require 'trollop'
6
+
7
+ class Mailtrap
8
+ VERSION = '0.1.0'
9
+
10
+ def initialize( host, port, once, msgdir )
11
+ @host = host
12
+ @port = port
13
+ @once = once
14
+ @msgdir = msgdir
15
+
16
+ puts "Mailtrap starting at #{@host}:#{port} and writing to #{@msgdir}"
17
+ service = TCPServer.new( @host, @port )
18
+ accept( service )
19
+ end
20
+
21
+ def accept( service )
22
+ while session = service.accept
23
+
24
+ class << session
25
+ def get_line
26
+ line = gets
27
+ line.chomp! unless line.nil?
28
+ line
29
+ end
30
+ end
31
+
32
+ begin
33
+ serve( session )
34
+ rescue Exception => e
35
+ puts "Erk! #{e.message}"
36
+ end
37
+
38
+ break if @once
39
+ end
40
+ end
41
+
42
+ def write( from, to_list, message )
43
+
44
+ from.gsub!( /MAIL FROM:\s*/, "" )
45
+ to_list = to_list.map { |to| to.gsub( /RCPT TO:\s*/, "" ) }
46
+
47
+ n = 1
48
+ Dir.chdir( @msgdir ) do
49
+ files = Dir.glob( "smtp*.msg" )
50
+ if files.length > 0
51
+ n = 1 + Integer( files.last.gsub( /smtp(\d+)\.msg/, '\1' ) )
52
+ end
53
+ end
54
+
55
+ File.open( File.join( @msgdir, "smtp%04d.msg" % n ), "w" ) do |file|
56
+ file.puts "FROM: #{from}"
57
+ to_list.each do |to|
58
+ file.puts "TO: #{to}"
59
+ end
60
+ file.puts "----"
61
+ file.puts message
62
+ end
63
+
64
+ end
65
+
66
+ def serve( connection )
67
+ connection.puts( "220 #{@host} MailTrap ready ESTMP" )
68
+ helo = connection.get_line # whoever they are
69
+ puts "Helo: #{helo}"
70
+
71
+ if helo =~ /^EHLO\s+/
72
+ puts "Seen an EHLO"
73
+ connection.puts "250-#{@host} offers just ONE extension my pretty"
74
+ connection.puts "250 HELP"
75
+ end
76
+
77
+ from = connection.get_line
78
+ connection.puts( "250 OK" )
79
+ puts "From: #{from}"
80
+
81
+ to_list = []
82
+
83
+ loop do
84
+ to = connection.get_line
85
+ break if to.nil?
86
+
87
+ if to =~ /^DATA/
88
+ connection.puts( "354 Start your message" )
89
+ break
90
+ else
91
+ puts "To: #{to}"
92
+ to_list << to
93
+ connection.puts( "250 OK" )
94
+ end
95
+ end
96
+
97
+ puts "We know who we're sending to."
98
+
99
+ lines = []
100
+
101
+ loop do
102
+ line = connection.get_line
103
+ break if line.nil? || line == "."
104
+ lines << line
105
+ puts "+ #{line}"
106
+ end
107
+
108
+ puts "Message read"
109
+ connection.puts( "250 OK" )
110
+
111
+ connection.gets # Quit
112
+ connection.puts "221 Seeya"
113
+
114
+ connection.close
115
+ puts "And we're done with that bozo!"
116
+
117
+ write( from, to_list, lines.join( "\n" ) )
118
+
119
+ end
120
+
121
+ end
File without changes
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
4
+ name: mailtrap
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ date: 2007-10-04 00:00:00 +01:00
8
+ summary: Mailtrap is a mock SMTP server for use in Rails development
9
+ require_paths:
10
+ - lib
11
+ email: self@mattmower.com
12
+ homepage: " by Matt Mower <self@mattmower.com>"
13
+ rubyforge_project: rubymatt
14
+ description: "Mailtrap is a mock SMTP server for use in Rails development. Mailtrap waits for a client to connect and talks just enough SMTP for ActionMailer to send its message which Mailtrap will write into a file for you to inspect. Mailtrap makes no attempt to actually deliver anything (hence the name Mail*trap*). You can configure the hostname (default: localhost) and port (default: 1025) for the server and also where the messages get written (default: /tmp). Messages will get written to files named smtp0001.msg, smtp0002.msg, and so on. == FEATURES/PROBLEMS: * Test with ActionMailer's SMTP delivery method * Very, very, dumb ... might not work with an arbitrary Mail client == SYNOPSIS:"
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ - |
29
+ -----BEGIN CERTIFICATE-----
30
+ MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MQ0wCwYDVQQDDARzZWxm
31
+ MRkwFwYKCZImiZPyLGQBGRYJbWF0dG1vd2VyMRMwEQYKCZImiZPyLGQBGRYDY29t
32
+ MB4XDTA3MTAwMzIzMjkwN1oXDTA4MTAwMjIzMjkwN1owPzENMAsGA1UEAwwEc2Vs
33
+ ZjEZMBcGCgmSJomT8ixkARkWCW1hdHRtb3dlcjETMBEGCgmSJomT8ixkARkWA2Nv
34
+ bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQejbmmtJD6FfTwc9+
35
+ QsWEqNFgNL8+tbrpxUuT8J2j0O0Pvkhw3wGT3tzMdXlnaz+OwUz8qU6HGwDAiK/3
36
+ zWAGuBRApkIAooTryRWLYmkZfnZidG8A2msmRwQd84Rkzn6Vgad+46o6jQfJSgy1
37
+ pDsZVfsRcUZ0dWetp+ll7Lq/4HyecdNgRfmrQh6pmKwIUmh5cj91iBX3NEqx5TN6
38
+ AKkYIOBMuOnBMNrXvApH10ruvus1d/PiJIjAavvbgSih+vyB8NTXTF4kOhKXnF0w
39
+ Zx3CF5asJejopRGNUcY9Vmjr7WiRHhUnFjc8hs385MlQNKEdAirVwIIgWfkQwJO+
40
+ GQ0CAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFL99
41
+ Fuw4VZwExQog/QSr8zIFfj1WMA0GCSqGSIb3DQEBBQUAA4IBAQATHmiqgSFKeJQM
42
+ QZjefTiRH6q1TgnJEt0/ylb9gNUCBpIFC1QOtuf68NAt90n6q1CZ51W3EreOPmi2
43
+ k2UxzfnPH6av2HQxmC1Xwv+X/eKF65shy/D75XWeCKLwynlXbA0cSjkV8/jSDB9I
44
+ pPXX1PjTNmzS2oNGSBroG567Uod41eAjlFA2FQTSWu/lDaYvLBjupGzz59/lZfkl
45
+ oCvK+OORDtfJ/a8CdYuD7PltGIEGV9srqdsEsmcrXGHaZt+jGRLYi60h5ZEd7lOm
46
+ 1WEvMXOXF3ofp87Yw1MSpG7yQyr0i5DW6VM3v6AP0ABxoM4p80JDHhwAmKWRWWQk
47
+ yMQ/kUco
48
+ -----END CERTIFICATE-----
49
+
50
+ post_install_message:
51
+ authors:
52
+ - Matt Mower
53
+ files:
54
+ - History.txt
55
+ - Manifest.txt
56
+ - README.txt
57
+ - Rakefile
58
+ - bin/mailtrap
59
+ - lib/mailtrap.rb
60
+ test_files:
61
+ - test/test_mailtrap.rb
62
+ rdoc_options:
63
+ - --main
64
+ - README.txt
65
+ extra_rdoc_files:
66
+ - History.txt
67
+ - Manifest.txt
68
+ - README.txt
69
+ executables:
70
+ - mailtrap
71
+ extensions: []
72
+
73
+ requirements: []
74
+
75
+ dependencies:
76
+ - !ruby/object:Gem::Dependency
77
+ name: daemons
78
+ version_requirement:
79
+ version_requirements: !ruby/object:Gem::Version::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 1.0.8
84
+ version:
85
+ - !ruby/object:Gem::Dependency
86
+ name: trollop
87
+ version_requirement:
88
+ version_requirements: !ruby/object:Gem::Version::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: "1.7"
93
+ version:
94
+ - !ruby/object:Gem::Dependency
95
+ name: hoe
96
+ version_requirement:
97
+ version_requirements: !ruby/object:Gem::Version::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: 1.3.0
102
+ version:
Binary file