Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Довольно неудобным обстоятельством является то, что все заголовки каждого сообщения целиком хранятся в одной строке таблицы dbmail_messageblks – у таких строк значение поля is_header = 1. В нестабильной версии DBMail заголовки вынесены в отдельную таблицу, и для каждого выделена собственная запись. Однако вместо того чтобы ждать выхода новой ветки DBMail или использовать нестабильную, мы можем реализовать эту функциональность самостоятельно средствами PostgreSQL.
Воспользуемся тем, что PostgreSQL позволяет создавать функции на языке PL/Python и богатыми возможностями Python в области обработки почтовых сообщений (разумеется, этот выбор субъективен: желающие могут реализовать аналогичную функциональность на PL/PgSQL, PL/Perl, PL/Tcl или даже на С). Сначала включим поддержку PL/Python для выбранной БД:
# createlang -U dbmail plpythonu dbmail
Для того чтобы эта команда выполнилась, PostgreSQL необходимо собрать с поддержкой PL/Python. В ALT Linux поддержка PL/Python вынесена в пакет postgresql-python, который необходимо доустановить, если он еще не установлен. Кроме того, в ALT Linux PostgreSQL выполняется в chroot-окружении, поэтому нужно проследить за тем, чтобы все модули Python, которыми мы собираемся воспользоваться, находились там же. Проще всего будет полностью перенести каталог /usr/lib/python2.3/ в /var/lib/pgsql-root/usr/lib, а правильнее будет делать это не регулярно при необходимости установить или удалить некоторые модули Python, а один раз описать необходимую последовательность действий в скрипте /etc/chroot.d/postgresql.lib.
Теперь создадим и протестируем функцию, которая будет извлекать нужный нам заголовок почтового сообщения:
# psql -U dbmail dbmail
dbmail=# create function mailheader(varchar, varchar) returns varchar as $$
dbmail$# import email.Parser
dbmail$# parser = email.Parser.Parser()
dbmail$# message = parser.parsestr(args[0])
dbmail$# return message.get(args[1])
dbmail$# $$ language plpythonu;
CREATE FUNCTION
dbmail=# select mailheader(messageblk, 'To') from dbmail_messageblks where is_header=1;
mailheader
---------------------------------------------------
test@mydomain.ru
(записей: 1)
Для того чтобы оценить возможности этого механизма, у нас слишком маленькая БД. Конечно, можно написать скрипт, генерирующий множество почтовых сообщений, но мы поступим иначе. Допустим, что у нас уже есть архив списка рассылки DBMail-Users в формате Maildir. С помощью MUA создадим IMAP-каталог, а затем с помощью скрипта mailbox2dbmail импортируем в него все сообщения из архива:
# /usr/share/doc/dbmail-2.0.7/contrib/mailbox2dbmail/mailbox2dbmail -u test -t maildir -m maillist/ -b INBOX/DBMail-Users -p /usr/sbin/dbmail-smtp