class Redwood::InboxMode
def label_spamassassin_spam
t = cursor_thread or return
t.apply_label :spam
multi_toggle_new [t]
regen_text
Index.save_thread t
flush_index
end
end
class Redwood::InboxMode
def label_spamassassin_ham
t = cursor_thread or return
t.apply_label :ham
regen_text
Index.save_thread t
flush_index
end
end
class Redwood::SearchResultsMode
def label_spamassassin_spam
t = cursor_thread or return
t.apply_label :spam
multi_toggle_new [t]
regen_text
Index.save_thread t
flush_index
end
end
class Redwood::SearchResultsMode
def label_spamassassin_ham
t = cursor_thread or return
t.apply_label :ham
regen_text
Index.save_thread t
flush_index
end
end
modes["inbox-mode"].keymap.add :label_spamassassin_spam, "Label as SpamAssassin Spam", 's'
modes["inbox-mode"].keymap.add :label_spamassassin_ham, "Label as SpamAssassin Ham", 'h'
modes["search-results-mode"].keymap.add :label_spamassassin_spam, "Label as SpamAssassin Spam", 's'
modes["search-results-mode"].keymap.add :label_spamassassin_ham, "Label as SpamAssassin Ham", 'h'
cat > ~/Maildir/SpamAssassin/Spam/cur/$(cat /proc/sys/kernel/random/uuid)
class Redwood::InboxMode
def label_spamassassin_spam
t = cursor_thread or return
t.apply_label :
spam
t.remove_label :inbox
multi_toggle_new [t]
hide_thread t
pipe_to_process('cat > ~/Maildir/SpamAssassin/Spam/cur/$(cat /proc/sys/kernel/random/uuid)')
regen_text
Index.save_thread t
flush_index
end
end
--- LocalJumpError from thread: main
no block given (yield)
/usr/local/sup/lib/sup/mode.rb:125:in `block in pipe_to_process'
/usr/lib/ruby/2.5.0/open3.rb:205:in `popen_run'
/usr/lib/ruby/2.5.0/open3.rb:95:in `popen3'
/usr/local/sup/lib/sup/mode.rb:107:in `pipe_to_process'
/home/rob/.sup/hooks/startup.rb:8:in `label_spamassassin_spam'
/usr/local/sup/lib/sup/mode.rb:59:in `handle_input'
/usr/local/sup/lib/sup/buffer.rb:222:in `handle_input'
/usr/local/sup/bin/sup:257:in `<module:Redwood>'
/usr/local/sup/bin/sup:76:in `<main>'
echo 'cleaning Spam/Ham folders'
archivemail -d 5 --delete imaps://"spa...@bioprocess.org":"email-terminator2020!"@imap.ionos.de/Spam
archivemail -d 5 --delete imaps://"spa...@bioprocess.org":"email-terminator2020!"@imap.ionos.de/Ham
modes["inbox-mode"].keymap.add :label_spamassassin_spam, "Label as SpamAssassin Spam", 's'
modes["inbox-mode"].keymap.add :label_spamassassin_ham, "Label as SpamAssassin Ham", 'h'
modes["search-results-mode"].keymap.add :label_spamassassin_spam, "Label as SpamAssassin Spam", 's'
modes["search-results-mode"].keymap.add :label_spamassassin_ham, "Label as SpamAssassin Ham", 'h'
class Redwood::InboxMode
def label_spamassassin_spam
thread = cursor_thread or return
spamassassin_maildir_path = "/home/rob/Maildir/SpamAssassin/Spam/cur/"
message_file = File.join(
thread.latest_message.source.file_path,
thread.latest_message.source_info.to_s)
toggle_spam
FileUtils.cp(message_file, spamassassin_maildir_path)
BufferManager.flash "Copied to SpamAssassin Spam file: #{File.basename message_file}"
end
end
class Redwood::InboxMode
def label_spamassassin_ham
thread = cursor_thread or return
spamassassin_maildir_path = "/home/rob/Maildir/SpamAssassin/Ham/cur/"
message_file = File.join(
thread.latest_message.source.file_path,
thread.latest_message.source_info.to_s)
thread.apply_label :ham
FileUtils.cp(message_file, spamassassin_maildir_path)
BufferManager.flash "Copied to SpamAssassin Ham file: #{File.basename message_file}"
end
end
class Redwood::SearchResultsMode
def label_spamassassin_spam
thread = cursor_thread or return
spamassassin_maildir_path = "/home/rob/Maildir/SpamAssassin/Spam/cur/"
message_file = File.join(
thread.latest_message.source.file_path,
thread.latest_message.source_info.to_s)
toggle_spam
FileUtils.cp(message_file, spamassassin_maildir_path)
BufferManager.flash "Copied to SpamAssassin Spam file: #{File.basename message_file}"
end
end
class Redwood::SearchResultsMode
def label_spamassassin_ham
thread = cursor_thread or return
spamassassin_maildir_path = "/home/rob/Maildir/SpamAssassin/Ham/cur/"
message_file = File.join(
thread.latest_message.source.file_path,
thread.latest_message.source_info.to_s)
thread.apply_label :ham
FileUtils.cp(message_file, spamassassin_maildir_path)
BufferManager.flash "Copied to SpamAssassin Ham file: #{File.basename message_file}"
end
end
class Redwood::InboxMode
def label_spamassassin_spam
thread = cursor_thread or return
spamassassin_maildir_path = "/home/rob/Maildir/SpamAssassin/Spam/cur/"
message_file = File.join(
thread.latest_message.source.file_path,
thread.latest_message.source_info.to_s)
FileUtils.cp(message_file, spamassassin_maildir_path)
BufferManager.flash "Copied to SpamAssassin Spam file: #{File.basename message_file}"
toggle_spam
thread.remove_label :unread
flush_index
end
end
Thanks for all the useful code, Iain.Here the final solution. Explication: Spam (= 'undesired') messages and Ham (= 'desired') messages are copied into separate Maildir folders.Those are synchronized with an IMAP server (using OfflineImap) for training a SpamAssassin filter (running daily on a server, using CRON):The last message of a thread is chosen by 's' (Spam) or 'h' (Ham) in the Inbox or Search Results Mode (e.g. in the display of unread messages).Spam messages are removed from the Inbox listing. Ham messages get a label 'ham' which indicates that the message was already sent to training.The SpamAssassin folders are not observed by sup. Mails older than 5 days are automatically deleted by (email and password are different, of course):archive-mails.sh
echo 'cleaning Spam/Ham folders'
archivemail -d 5 --delete imaps://"spamass@bioprocess.org":"email-terminator2020!"@imap.ionos.de/Spam
archivemail -d 5 --delete imaps://"spamass@bioprocess.org":"email-terminator2020!"@imap.ionos.de/Ham