Здравствуйте.
Преамбула: похоже, найденное решение уже пока не требуется.

Амбула...

10.05.2010 на меня свалилось несколько сот сообщений от mailman
об отписке от рассылок.  Предположив снос крыши этого дела либо
массовую отписку из-за отлупов на mail.ru (что ранее бывало),
озадачился автоматизацией воссоздания списков невинно отписанных
из mbox, отфильтрованного mutt по условиям

~d 10 ~s ~d 10 ~s unsub\|удален

в фолдере, куда и так фильтруются сообщения mailman.

По ходу пьесы выяснилось, что mailman был попросту перезапущен
и, видимо, не разобрал, о чём уже спамил, а о чём ещё нет.

Уже написав, отладив и запустив скрипт, понял при рассмотрении
полученного на полном (а не тестовом) mbox списка адресов, что
эти люди в этих рассылках бывали, но давно.

Поэтому никого никуда переподписывать не буду, но полтора часа
работы несколько жалко (да и кто это mail.ru знает...) -- поэтому
скрипт на всякий прилагается.  Использует ruby-tmail.  Также здесь:
http://fly.osdn.org.ua/~mike/works/misc/bounces2resubscribe.rb

PS: Анатолий, Вашим программам может каскадно снести крышу
при попытке проанализировать такое -- если не скомпенсировать
двойное прохождение информации об отписках.

-- 
 ---- WBR, Michael Shigorin <[email protected]>
  ------ Linux.Kiev http://www.linux.kiev.ua/
#!/usr/bin/env ruby

# parse mailman's bounces saved as a mbox
# to facilitate resubscription after some hiccup
# 2010, Michael Shigorin <[email protected]>

require "tmail"

if ARGV.size != 1 then
        puts "USAGE: #{$0} mailbox-file"
        exit -1
end

loader = TMail::MboxLoader.new(ARGV[0])
#loader = TMail::MboxLoader.new('test.mbox')

lists = Hash.new
DEBUG = false
#DEBUG = true

loader.each_port do |port|

        mail = TMail::Mail.new(port)
        email = mail.body.split(" ")[0]
        subject = mail.subject.downcase

        list_addr = mail["X-BeenThere"].to_s
        list = list_addr.split("@")[0].downcase

        next unless subject =~ /^#{list} unsubscribe notification$/ or subject 
=~ / #{list}$/

        puts list_addr, list, subject, email, "\n" if DEBUG

        begin
                lists[list_addr] << email
        rescue
                lists[list_addr] = Array.new
                retry
        end

end

lists.each do |list,emails|
        f = File.new(list, "w")
        puts "*** #{list}" if DEBUG
        emails.collect do |e|
                puts e if DEBUG
                f.puts e
        end
        puts if DEBUG
end
_______________________________________________
Sysadmins mailing list
[email protected]
https://lists.altlinux.org/mailman/listinfo/sysadmins

Ответить