aiwilliams-mlist 0.1.2 → 0.1.3
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 +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
|
|