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 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
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :minor: 1
3
- :patch: 2
3
+ :patch: 3
4
4
  :major: 0
data/lib/mlist.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'uuid'
1
2
  require 'tmail'
2
3
  require 'activesupport'
3
4
  require 'activerecord'
@@ -4,14 +4,22 @@ module MList
4
4
  attr_reader :settings
5
5
 
6
6
  def initialize(settings)
7
- @settings = 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, destinations)
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, destinations)
14
- @outgoing_server.deliver(tmail, destinations)
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, destinations)
11
+ def deliver(tmail)
12
12
  @deliveries << tmail
13
13
  end
14
14
  end
@@ -4,7 +4,7 @@ module MList
4
4
  module EmailServer
5
5
 
6
6
  class Pop < Base
7
- def deliver(tmail, destinations)
7
+ def deliver(tmail)
8
8
  raise "Mail cannot be delivered through a POP server. Please use the '#{MList::EmailServer::Default.name}' type."
9
9
  end
10
10
 
@@ -4,7 +4,9 @@ module MList
4
4
  module EmailServer
5
5
 
6
6
  class Smtp < Base
7
- def deliver(tmail, destinations)
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)
@@ -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
- prepare_delivery(message)
105
- destinations = message.delivery.destinations
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
- outgoing_server.deliver(tmail, destinations)
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
- delivery = message.delivery
116
- prepare_list_headers(delivery)
117
- delivery.subject = list_subject(message)
118
- delivery.to = address
119
- delivery.bcc = message.recipients.collect(&:email_address)
120
- delivery.reply_to = "#{label} <#{post_url}>"
121
- end
122
-
123
- def prepare_list_headers(delivery)
124
- list_headers.each do |k,v|
125
- if TMail::Mail::ALLOW_MULTIPLE.include?(k.downcase)
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 ||= MList::Util::TMailBuilder.new(TMail::Mail.parse(email.source))
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.2
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-07 00:00:00 -08:00
12
+ date: 2009-02-09 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15