received 0.1.0 → 0.2.0
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/README.md +3 -1
- data/lib/received/backend/base.rb +6 -3
- data/lib/received/connection.rb +1 -3
- data/lib/received/lmtp.rb +14 -9
- data/lib/received/version.rb +1 -1
- data/received.gemspec +0 -1
- data/spec/lmtp_spec.rb +11 -0
- metadata +9 -22
data/README.md
CHANGED
@@ -22,10 +22,12 @@ Installation
|
|
22
22
|
Modify your [Postfix][4] configuration to deliver mail via LMTP to TCP or UNIX socket.
|
23
23
|
|
24
24
|
Example main.cf:
|
25
|
+
|
25
26
|
virtual_transport = lmtp:192.168.2.106:1111
|
26
27
|
virtual_mailbox_domains = example.com
|
27
28
|
|
28
29
|
Create a YAML configuration file which has the following parameters:
|
30
|
+
|
29
31
|
{'production'=>{'host'=>hostname, 'database'=>db, 'collection'=>col}}
|
30
32
|
|
31
33
|
The mongoid.yml will do, just add the name of collection, i.e.
|
@@ -60,4 +62,4 @@ Bugs and missing features
|
|
60
62
|
[4]: http://www.postfix.org/
|
61
63
|
[5]: http://tools.ietf.org/html/rfc2034
|
62
64
|
|
63
|
-
Copyright (c) 2011 Roman Shterenzon, released under the MIT license
|
65
|
+
Copyright (c) 2011 Roman Shterenzon, released under the MIT license
|
@@ -4,10 +4,13 @@ module Received
|
|
4
4
|
# Stores the data
|
5
5
|
#
|
6
6
|
# @abstract
|
7
|
-
# @param [
|
8
|
-
|
7
|
+
# @param [Hash] mail
|
8
|
+
# @option mail [String] :from
|
9
|
+
# @option mail [Array] :rcpt
|
10
|
+
# @option mail [String] :body
|
11
|
+
def store(mail)
|
9
12
|
raise NotImplementedError
|
10
13
|
end
|
11
14
|
end
|
12
15
|
end
|
13
|
-
end
|
16
|
+
end
|
data/lib/received/connection.rb
CHANGED
@@ -33,9 +33,7 @@ module Received
|
|
33
33
|
# Callback, called by protocol handler
|
34
34
|
#
|
35
35
|
# @param [Hash] mail
|
36
|
-
# @
|
37
|
-
# @option mail [Array] :rcpt
|
38
|
-
# @option mail [String] :body
|
36
|
+
# @see Received::Backend::Base#store
|
39
37
|
def mail_received(mail)
|
40
38
|
begin
|
41
39
|
@backend.store(mail)
|
data/lib/received/lmtp.rb
CHANGED
@@ -4,30 +4,35 @@ module Received
|
|
4
4
|
|
5
5
|
def initialize(conn)
|
6
6
|
@conn = conn
|
7
|
+
@state = :start
|
8
|
+
@buf = ''
|
7
9
|
end
|
8
10
|
|
9
11
|
def on_data(data)
|
10
12
|
@buf += data
|
11
|
-
while line = @buf.slice!(
|
13
|
+
while line = @buf.slice!(/.*\r\n/)
|
12
14
|
line.chomp! unless @state == :data
|
13
15
|
event(line)
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
17
19
|
def start!
|
18
|
-
|
20
|
+
event(nil)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def reset!
|
19
25
|
@buf = ''
|
20
26
|
@from = nil
|
21
27
|
@rcpt = []
|
22
|
-
|
28
|
+
@body = []
|
23
29
|
end
|
24
30
|
|
25
|
-
private
|
26
31
|
def event(ev)
|
27
32
|
@conn.logger.debug {"state was: #{@state.inspect}"}
|
28
33
|
@state = case @state
|
29
34
|
when :start
|
30
|
-
|
35
|
+
reset!
|
31
36
|
banner
|
32
37
|
:banner_sent
|
33
38
|
when :banner_sent
|
@@ -39,7 +44,7 @@ module Received
|
|
39
44
|
error
|
40
45
|
end
|
41
46
|
when :lhlo_received
|
42
|
-
if ev =~
|
47
|
+
if ev =~ /^MAIL FROM:<?([^>]+)/
|
43
48
|
@from = $1
|
44
49
|
ok
|
45
50
|
:mail_from_received
|
@@ -47,7 +52,7 @@ module Received
|
|
47
52
|
error
|
48
53
|
end
|
49
54
|
when :mail_from_received
|
50
|
-
if ev =~
|
55
|
+
if ev =~ /^RCPT TO:<?([^>]+)/
|
51
56
|
@rcpt << $1
|
52
57
|
ok
|
53
58
|
:rcpt_to_received
|
@@ -55,7 +60,7 @@ module Received
|
|
55
60
|
error
|
56
61
|
end
|
57
62
|
when :rcpt_to_received
|
58
|
-
if ev =~
|
63
|
+
if ev =~ /^RCPT TO:<?([^>]+)/
|
59
64
|
@rcpt << $1
|
60
65
|
ok
|
61
66
|
elsif ev == "DATA"
|
@@ -107,7 +112,7 @@ module Received
|
|
107
112
|
# FIXME: RFC2033 requires ENHANCEDSTATUSCODES,
|
108
113
|
# but it's not used in Postfix
|
109
114
|
def extensions
|
110
|
-
|
115
|
+
emit "250-8BITMIME\r\n250 PIPELINING"
|
111
116
|
end
|
112
117
|
|
113
118
|
def ok
|
data/lib/received/version.rb
CHANGED
data/received.gemspec
CHANGED
@@ -16,7 +16,6 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
|
-
s.add_runtime_dependency 'activesupport'
|
20
19
|
s.add_runtime_dependency 'daemons'
|
21
20
|
s.add_runtime_dependency 'eventmachine'
|
22
21
|
s.add_runtime_dependency 'mongo', '~>1.3.0'
|
data/spec/lmtp_spec.rb
CHANGED
@@ -48,4 +48,15 @@ describe Received::LMTP do
|
|
48
48
|
@proto.on_data("LHLO\r\nMAIL FROM")
|
49
49
|
@proto.on_data(":<spec@example.com>\r\n")
|
50
50
|
end
|
51
|
+
|
52
|
+
it "passes CR/LF through" do
|
53
|
+
body = "Subject: test\r\n\r\nTest\r\n"
|
54
|
+
@mock.stub!(:send_data)
|
55
|
+
@proto.on_data("LHLO\r\nMAIL FROM:<spec1@example.com>\r\nRCPT TO:<spec2@example.com>\r\nDATA\r\n")
|
56
|
+
@proto.on_data(body)
|
57
|
+
@mock.should_receive(:mail_received) do |r|
|
58
|
+
r[:body].should == body
|
59
|
+
end
|
60
|
+
@proto.on_data(".\r\n")
|
61
|
+
end
|
51
62
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Roman Shterenzon
|
@@ -14,11 +14,11 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-06-02 00:00:00 +03:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: daemons
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
type: :runtime
|
32
32
|
version_requirements: *id001
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: eventmachine
|
35
35
|
prerelease: false
|
36
36
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
37
|
none: false
|
@@ -43,23 +43,10 @@ dependencies:
|
|
43
43
|
version: "0"
|
44
44
|
type: :runtime
|
45
45
|
version_requirements: *id002
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: eventmachine
|
48
|
-
prerelease: false
|
49
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
segments:
|
55
|
-
- 0
|
56
|
-
version: "0"
|
57
|
-
type: :runtime
|
58
|
-
version_requirements: *id003
|
59
46
|
- !ruby/object:Gem::Dependency
|
60
47
|
name: mongo
|
61
48
|
prerelease: false
|
62
|
-
requirement: &
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
63
50
|
none: false
|
64
51
|
requirements:
|
65
52
|
- - ~>
|
@@ -70,11 +57,11 @@ dependencies:
|
|
70
57
|
- 0
|
71
58
|
version: 1.3.0
|
72
59
|
type: :runtime
|
73
|
-
version_requirements: *
|
60
|
+
version_requirements: *id003
|
74
61
|
- !ruby/object:Gem::Dependency
|
75
62
|
name: bson_ext
|
76
63
|
prerelease: false
|
77
|
-
requirement: &
|
64
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
78
65
|
none: false
|
79
66
|
requirements:
|
80
67
|
- - ~>
|
@@ -85,7 +72,7 @@ dependencies:
|
|
85
72
|
- 0
|
86
73
|
version: 1.3.0
|
87
74
|
type: :runtime
|
88
|
-
version_requirements: *
|
75
|
+
version_requirements: *id004
|
89
76
|
description: Currently stores received mail in MongoDB
|
90
77
|
email:
|
91
78
|
- romanbsd@yahoo.com
|