Здравствуйте. Преамбула: похоже, найденное решение уже пока не требуется.
Амбула... 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
