?

Log in

No account? Create an account

[icon] /^.in$/
View:Recent Entries.
View:Archive.
View:Friends.
View:Profile.
View:Website (/me (домен, хотящийся в углу комнаты)).
Missed some entries? Then simply jump to the previous day or the next day.

Tags:, ,
Security:
Subject:свой почтовый сервер = ....
Time:01:08 am
свой почтовый сервер - это волшебная комбинация магии дебиана, exim4, courier-imap, mutt, thunderbird, огромного архива писем, оутглюка (!), enca + страницы кода на python, и еще немного терпения

началось все с того, что на выходных мне вдруг захотелось что-нибудь сделать со своим домашним сервером, а поскольку одна из "типа стандартных" немногих вещей которую я глубоко никогда не ковырял - это exim, то я взялся за его настройку.
тщательно изучив дебиановский README gz (за что меня поблагодарили в первых строчках), механизм макросов и содержание /etc/exim4/conf.d я пришел к выводу, что собственно там уже все настроено, потому, сделав лишь мелкие правки в conf.d (я не мог там ничего не поменять, религия не позволяет), воспользовавшись кастом update-exim4.conf и убедившись, что он отправляет и принимает почту, я поставил сверху courier-imap.
открыв порты в iptables и добавив новую учетную запись в thunderbird я перенес всю свою почту на свежеиспеченную почтопомойку,
и поставив fetchmail собирать почту со своих почтовых ящиков, внезапно, обнаружил, что теперь я могу читать свою почту еще и через всеми любимый mutt.

вообще нет. все было не так.
на самом деле мой моск, осилив exim4, решил что было бы чертовски мажорно завести для этой почты web-морду (типа домашний gmail), а уже в процессе настройки веб-морды я поставил и настроил все остальное... случайно ^_^
поклонники гугла могут сколько угодно кричать, что Google Apps это круто. не верю. гугл читает мою почту. и вы и я об этом знаете. меня это не устраивает.

собственно о вебморде. после тщательного изучения свежегомяса и соусфоржа я пришел к выводу, что кошерных варианта всего 2:
1) написать свою морду
2) заюзать extmail (не верьте ссылке, этот же проект есть на соусфорже)
но после 2х часов попыток вкурить в документацию к extmail и в их форум (и то и то не без участия лунного языка), в качестве временно ортодоксального варианта был поставлен perlwebmail (типа для начала сойдет).

собственно я упомянул половину списка из "заголовка".

теперь к вопросу о том, при чем тут оутглюк? три года меня не покидала надежда, что однажды я найду православный клиент для почты, и потому хранил до лучших времен все свои старые письма, выковырянные из оутглюка, в tar.bz2 архиве.
часть из них была в расово правильном eml формате (видимо выковырянные еще до пришествия оутглюка в бедную голову мою, т.е. из The Bat!), за сим они очень просто влились в огромную коллекцию писем на сервере при помощи какого-то плугина к thunderbird для импорта/экспорта целых директорий с emlками.
другая же часть была в каком-то непонятном msg формате. изрядно погуглив я выяснил, что в лине нечем этот самый msg сконвертить в eml :(
потому мне пришлось (за что я всячески себя казню) испачкать руки 10ти минутным юзанием вендой, пока я симпортировал в оутглюк кучу msg-файлов, добавил imap-аккаунт (глубоко задумываясь об уровне образования создателей оутглюковского гуя) и закинул получившиеся письма в свежесозданную папку в месте назначения.

фух. няяяя. да не тут то было.

подлянка №1: кодировки. хеадеры в письмах и их реальные кодировки никак не хотели совпадать. не нашлось ни одного письма где бы они совпали.
подлянка №2: оутглюк не промах. каждое письмо он сделал мультипартовым. в пером куске он сохранил текст письма, а во втором несколько киллобайт какого-то своего хлама, присутствие которого он сам никак не показывал (видимо это подарок на 23е февраля другим почтовым клиентам, которыми пользователь, возможно будет пользоваться, зайдя на этот же imap-аккаунт с другой машины. иначе объяснить факт сохранения этого хлама НА СЕРВЕРЕ, а не в клиенте я просто не могу).
ладно бы этот хлам был мелким, дык ведь его много. и писем много. места жалко. (тут я снова задумался об уровне образования создателей оутглюка)

поскольку courier-imap хранит письма в Maildir++ формате, то я просто перенес все их содержимое на рабочую машину и стал над ними химичить.
первую подлянку я решил при помощи enca (утилита для автоматического определения кодировок и конвертирования между ними):
for a in *
do
enca -c "$a"
done

оно ругнулось лишь на несколько файлов, в которых угадать кодировку не смогло, правильная цепочка преобразований для получения читабельного текста ввела в ступор даже меня... utf-8 -> cp1251 -> koi8-r -> utf-8 (x_X)

потом я прошелся sedом по всем файлам, чтобы поменять все заголовки
charset="левая кодировка"
на
charset="utf-8"

уря! почта теперь стала по крайней мере читабельна.

со второй подлянкой все оказалось намного хуже.
сначала я поgrepил все письма на предмет разных заголовков (при этом выяснил, что настоящее вложение было все лишь в одном письме (прочитав его содержание я его выкинул нафиг), а в остальных в качестве вложений был оутглюковский хлам).
и что все письма состоят ровно из двух частей.

взяв эти свойства как аксиомы я написал простой python-скрипт, полный хаков, оставляющий в письме только текстовую часть и правящий нужные заголовки (он не очень чист в плане кода, потому выкладывать его не буду, но если вдруг кому надо - не стесняйтесь обратиться), и прогнал через него все письма (которое это преобразование?).

ну и, наконец, загнал результаты своих трудов обратно на сервер и убедился, что все работает как положено.
теперь у меня есть вся моя почта начиная с 2004ого года и по сей день.
было прикольно перечитать кое-что из школьных переписок.

вот вам скриншот на закуску.

Посмотреть в полный размер, 496,23 КБ, 1280x1024Collapse )
withComments $ arr (take 3) >>> delay new

[icon] /^.in$/
View:Recent Entries.
View:Archive.
View:Friends.
View:Profile.
View:Website (/me (домен, хотящийся в углу комнаты)).
Missed some entries? Then simply jump to the previous day or the next day.