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 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