[Sysadmins] [script] обработка отлупов mailman при массовых проблемах почтового сервиса

Michael Shigorin mike на osdn.org.ua
Ср Май 12 21:49:10 UTC 2010


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

Амбула...

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 <mike на altlinux.ru>
  ------ 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 <mike на altlinux.org>

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