Hi, I just wondered if it was possible to use several different sources to store sent mail. After I read the recent posts on the mailing list and did not find any progress in the HEAD of mainline.git I just implemented a solution. I took the configuration file based approach. Because of laziness I thinkā¦
Here you are (see also spacefroggs-clone on gitorious): diff --git a/bin/sup b/bin/sup index 7824aca..45693b5 100755 --- a/bin/sup +++ b/bin/sup @@ -180,10 +180,12 @@ begin Redwood::SourceManager.add_source DraftManager.new_source end - if(s = Redwood::SourceManager.source_for SentManager.source_uri) - SentManager.source = s - else - Redwood::SourceManager.add_source SentManager.default_source + Redwood::AccountManager.user_accounts.each do |account| + if(s = Redwood::SourceManager.source_for account.sentmanager.source_uri) + account.sentmanager.source = s + else + Redwood::SourceManager.add_source account.sentmanager.default_source + end end HookManager.run "startup" diff --git a/bin/sup-config b/bin/sup-config index bc58a59..4373822 100755 --- a/bin/sup-config +++ b/bin/sup-config @@ -207,7 +207,7 @@ say "Only sources capable of storing mail will be listed.\n\n" Redwood::SourceManager.load_sources if Redwood::SourceManager.sources.empty? say "\nUsing the default sup://sent, since you haven't configured other sources yet." - $config[:sent_source] = 'sup://sent' + $config[:accounts][:default][:sent_source] = 'sup://sent' else # this handles the event that source.yaml already contains the SentLoader # source. @@ -216,11 +216,11 @@ else choose do |menu| menu.prompt = "Store my sent mail in? " - menu.choice('Default (an mbox in ~/.sup, aka sup://sent)') { $config[:sent_source] = 'sup://sent'} unless have_sup_sent + menu.choice('Default (an mbox in ~/.sup, aka sup://sent)') { $config[:accounts][:default][:sent_source] = 'sup://sent'} unless have_sup_sent valid_sents = Redwood::SourceManager.sources.each do |s| have_sup_sent = true if s.to_s.eql?('sup://sent') - menu.choice(s.to_s) { $config[:sent_source] = s.to_s } if s.respond_to? :store_message + menu.choice(s.to_s) { $config[:accounts][:default][:sent_source] = s.to_s } if s.respond_to? :store_message end end end diff --git a/lib/sup.rb b/lib/sup.rb index e03a35d..704be07 100644 --- a/lib/sup.rb +++ b/lib/sup.rb @@ -121,7 +121,6 @@ module Redwood end def start - Redwood::SentManager.init $config[:sent_source] || 'sup://sent' Redwood::ContactManager.init Redwood::CONTACT_FN Redwood::LabelManager.init Redwood::LABEL_FN Redwood::AccountManager.init $config[:accounts] diff --git a/lib/sup/account.rb b/lib/sup/account.rb index bf8a8a0..c284719 100644 --- a/lib/sup/account.rb +++ b/lib/sup/account.rb @@ -1,16 +1,22 @@ module Redwood class Account < Person - attr_accessor :sendmail, :signature + attr_accessor :sendmail, :signature, :sentmanager def initialize h raise ArgumentError, "no name for account" unless h[:name] raise ArgumentError, "no email for account" unless h[:email] super h[:name], h[:email] + + @sentmanager = Redwood::SentManager.new h[:sent_source] @sendmail = h[:sendmail] @signature = h[:signature] end + def sent_source + @sentmanager.source_uri + end + # Default sendmail command for bouncing mail, # deduced from #sendmail def bounce_sendmail @@ -46,10 +52,12 @@ class AccountManager def add_account hash, default=false raise ArgumentError, "no email specified for account" unless hash[:email] unless default - [:name, :sendmail, :signature].each { |k| hash[k] ||= @default_account.send(k) } + [:name, :sendmail, :signature, :sent_source].each { |k| hash[k] ||= @default_account.send(k) } end hash[:alternates] ||= [] + hash[:sent_source] ||= 'sup://sent' + a = Account.new hash @accounts[a] = true diff --git a/lib/sup/modes/edit-message-mode.rb b/lib/sup/modes/edit-message-mode.rb index 8849271..7d7618b 100644 --- a/lib/sup/modes/edit-message-mode.rb +++ b/lib/sup/modes/edit-message-mode.rb @@ -322,7 +322,7 @@ protected m = build_message date IO.popen(acct.sendmail, "w") { |p| p.puts m } raise SendmailCommandFailed, "Couldn't execute #{acct.sendmail}" unless $? == 0 - SentManager.write_sent_message(date, from_email) { |f| f.puts sanitize_body(m.to_s) } + acct.sentmanager.write_sent_message(date, from_email) { |f| f.puts sanitize_body(m.to_s) } BufferManager.kill_buffer buffer BufferManager.flash "Message sent!" true diff --git a/lib/sup/sent.rb b/lib/sup/sent.rb index 87ca6c6..1fe398c 100644 --- a/lib/sup/sent.rb +++ b/lib/sup/sent.rb @@ -1,7 +1,6 @@ module Redwood class SentManager - include Singleton attr_reader :source, :source_uri @@ -14,7 +13,7 @@ class SentManager def source= s raise FatalSourceError.new("Configured sent_source [#{s.uri}] can't store mail. Correct your configuration.") unless s.respond_to? :store_message - @souce_uri = s.uri + @source_uri = s.uri @source = s end _______________________________________________ Sup-devel mailing list Sup-devel@rubyforge.org http://rubyforge.org/mailman/listinfo/sup-devel