aiwilliams-mlist 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README +3 -1
- data/VERSION.yml +1 -1
- data/lib/mlist.rb +1 -0
- data/lib/mlist/email_server/base.rb +10 -2
- data/lib/mlist/email_server/default.rb +2 -2
- data/lib/mlist/email_server/fake.rb +3 -3
- data/lib/mlist/email_server/pop.rb +1 -1
- data/lib/mlist/email_server/smtp.rb +3 -1
- data/lib/mlist/mail_list.rb +21 -21
- data/lib/mlist/message.rb +14 -8
- data/lib/mlist/util/header_sanitizer.rb +2 -0
- data/lib/mlist/util/tmail_methods.rb +14 -0
- metadata +2 -2
data/README
CHANGED
@@ -65,9 +65,10 @@ You love Ruby. You want MList.
|
|
65
65
|
|
66
66
|
You'll need some gems.
|
67
67
|
|
68
|
+
* uuid (macaddr also)
|
69
|
+
* tmail
|
68
70
|
* activesupport
|
69
71
|
* activerecord
|
70
|
-
* tmail
|
71
72
|
|
72
73
|
== INSTALL:
|
73
74
|
|
@@ -86,6 +87,7 @@ environment.rb after the initialize block (our gem needs to have been loaded):
|
|
86
87
|
end
|
87
88
|
|
88
89
|
MLIST_SERVER = MList::Server.new(
|
90
|
+
:domain => 'myapp.com', # This is optional
|
89
91
|
:list_manager => MList::Manager::Database.new,
|
90
92
|
:email_server => MList::EmailServer::Default.new(
|
91
93
|
MList::EmailServer::Pop.new(
|
data/VERSION.yml
CHANGED
data/lib/mlist.rb
CHANGED
@@ -4,14 +4,22 @@ module MList
|
|
4
4
|
attr_reader :settings
|
5
5
|
|
6
6
|
def initialize(settings)
|
7
|
-
@settings =
|
7
|
+
@settings = {
|
8
|
+
:domain => ::Socket.gethostname
|
9
|
+
}.merge(settings)
|
10
|
+
|
11
|
+
@uuid = UUID.new
|
8
12
|
@receivers = []
|
9
13
|
end
|
10
14
|
|
11
|
-
def deliver(tmail
|
15
|
+
def deliver(tmail)
|
12
16
|
raise 'Implement actual delivery mechanism in subclasses'
|
13
17
|
end
|
14
18
|
|
19
|
+
def generate_message_id
|
20
|
+
"#{@uuid.generate}@#{@settings[:domain]}"
|
21
|
+
end
|
22
|
+
|
15
23
|
def receive(tmail)
|
16
24
|
email = MList::Email.new(:tmail => tmail)
|
17
25
|
@receivers.each { |r| r.receive_email(email) }
|
@@ -10,8 +10,8 @@ module MList
|
|
10
10
|
|
11
11
|
# Delegates delivery of email to outgoing server.
|
12
12
|
#
|
13
|
-
def deliver(tmail
|
14
|
-
@outgoing_server.deliver(tmail
|
13
|
+
def deliver(tmail)
|
14
|
+
@outgoing_server.deliver(tmail)
|
15
15
|
end
|
16
16
|
|
17
17
|
# Delegates fetching emails to incoming server.
|
@@ -3,12 +3,12 @@ module MList
|
|
3
3
|
class Fake < Base
|
4
4
|
attr_reader :deliveries
|
5
5
|
|
6
|
-
def initialize
|
7
|
-
super
|
6
|
+
def initialize(settings = {})
|
7
|
+
super
|
8
8
|
@deliveries = []
|
9
9
|
end
|
10
10
|
|
11
|
-
def deliver(tmail
|
11
|
+
def deliver(tmail)
|
12
12
|
@deliveries << tmail
|
13
13
|
end
|
14
14
|
end
|
@@ -4,7 +4,9 @@ module MList
|
|
4
4
|
module EmailServer
|
5
5
|
|
6
6
|
class Smtp < Base
|
7
|
-
def deliver(tmail
|
7
|
+
def deliver(tmail)
|
8
|
+
destinations = tmail.destinations
|
9
|
+
tmail.delete_no_send_fields
|
8
10
|
Net::SMTP.start(settings[:address], settings[:port], settings[:domain],
|
9
11
|
settings[:user_name], settings[:password], settings[:authentication]) do |smtp|
|
10
12
|
smtp.sendmail(tmail.encoded, tmail['sender'], destinations)
|
data/lib/mlist/mail_list.rb
CHANGED
@@ -98,35 +98,35 @@ module MList
|
|
98
98
|
:search_parent => true,
|
99
99
|
:delivery_time => Time.now
|
100
100
|
}.merge(options)
|
101
|
+
|
101
102
|
transaction do
|
102
103
|
thread = find_thread(message, options)
|
104
|
+
thread.updated_at = options[:delivery_time]
|
105
|
+
|
106
|
+
delivery = prepare_delivery(message, options)
|
103
107
|
thread.messages << message
|
104
|
-
|
105
|
-
|
106
|
-
tmail = message.to_tmail
|
107
|
-
self.updated_at = thread.updated_at = options[:delivery_time]
|
108
|
+
|
109
|
+
self.updated_at = options[:delivery_time]
|
108
110
|
thread.save! && save!
|
109
|
-
|
111
|
+
|
112
|
+
outgoing_server.deliver(delivery.tmail)
|
110
113
|
end
|
114
|
+
|
111
115
|
message
|
112
116
|
end
|
113
117
|
|
114
|
-
def prepare_delivery(message)
|
115
|
-
|
116
|
-
|
117
|
-
delivery
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
delivery.prepend_header(k,v)
|
127
|
-
else
|
128
|
-
delivery.write_header(k,v)
|
129
|
-
end
|
118
|
+
def prepare_delivery(message, options)
|
119
|
+
message.identifier = outgoing_server.generate_message_id
|
120
|
+
message.created_at = options[:delivery_time]
|
121
|
+
returning(message.delivery) do |delivery|
|
122
|
+
delivery.date = message.created_at
|
123
|
+
delivery.message_id = message.identifier
|
124
|
+
delivery.mailer = message.mailer
|
125
|
+
delivery.headers = list_headers
|
126
|
+
delivery.subject = list_subject(message)
|
127
|
+
delivery.to = address
|
128
|
+
delivery.bcc = message.recipients.collect(&:email_address)
|
129
|
+
delivery.reply_to = "#{label} <#{post_url}>"
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
data/lib/mlist/message.rb
CHANGED
@@ -15,8 +15,21 @@ module MList
|
|
15
15
|
#
|
16
16
|
attr_accessor :recipients
|
17
17
|
|
18
|
+
# Answers an MList::TMailBuilder for assembling the TMail::Mail object
|
19
|
+
# that will be fit for delivery. If this is not a new message, the
|
20
|
+
# delivery will be updated to reflect the message-id, x-mailer, etc. of
|
21
|
+
# this message.
|
22
|
+
#
|
18
23
|
def delivery
|
19
|
-
@delivery ||=
|
24
|
+
@delivery ||= begin
|
25
|
+
d = MList::Util::TMailBuilder.new(TMail::Mail.parse(email.source))
|
26
|
+
unless new_record?
|
27
|
+
d.message_id = self.identifier
|
28
|
+
d.mailer = self.mailer
|
29
|
+
d.date = self.created_at
|
30
|
+
end
|
31
|
+
d
|
32
|
+
end
|
20
33
|
end
|
21
34
|
|
22
35
|
def email_with_capture=(email)
|
@@ -100,12 +113,5 @@ module MList
|
|
100
113
|
@subscriber = self.subscriber_address = self.subscriber_type = self.subscriber_id = nil
|
101
114
|
end
|
102
115
|
end
|
103
|
-
|
104
|
-
def to_tmail
|
105
|
-
delivery.mailer = mailer
|
106
|
-
delivery.ready_to_send
|
107
|
-
self.identifier = delivery.identifier
|
108
|
-
delivery.tmail
|
109
|
-
end
|
110
116
|
end
|
111
117
|
end
|
@@ -31,6 +31,8 @@ module MList
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def initialize_default_sanitizers
|
34
|
+
self['message-id'] = quoter(:quote_address_if_necessary)
|
35
|
+
|
34
36
|
self['to'] = quoter(:quote_any_address_if_necessary)
|
35
37
|
self['cc'] = quoter(:quote_any_address_if_necessary)
|
36
38
|
self['bcc'] = quoter(:quote_any_address_if_necessary)
|
@@ -59,6 +59,16 @@ module MList
|
|
59
59
|
tmail[name] = nil
|
60
60
|
end
|
61
61
|
|
62
|
+
def headers=(updates)
|
63
|
+
updates.each do |k,v|
|
64
|
+
if TMail::Mail::ALLOW_MULTIPLE.include?(k.downcase)
|
65
|
+
prepend_header(k,v)
|
66
|
+
else
|
67
|
+
write_header(k,v)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
62
72
|
# Add another value for the named header, it's position being earlier in
|
63
73
|
# the email than those that are already present. This will raise an error
|
64
74
|
# if the header does not allow multiple values according to
|
@@ -94,6 +104,10 @@ module MList
|
|
94
104
|
def mailer=(value)
|
95
105
|
write_header('x-mailer', value)
|
96
106
|
end
|
107
|
+
|
108
|
+
def message_id=(value)
|
109
|
+
tmail.message_id = sanitize_header(charset, 'message-id', value)
|
110
|
+
end
|
97
111
|
end
|
98
112
|
|
99
113
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aiwilliams-mlist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Williams
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-02-
|
12
|
+
date: 2009-02-09 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|