[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