Окт 23 2009

DBMail. Почтовый сервер c MySQL хранилищем писем.

На практике мне приходилось несколько раз сталкиваться с DBMail. Скажу честно, я стараюсь избегать использовать SQL лишний раз, особенно для почты, особенно для хранения писем. Самым правильным методом хранения писем я считаю Maildir. Но! бывают ситуации, когда заказчика просто нет возможности переубедить, а поскольку кушать хочется, приходится делать то, что нужно заказчику.
Вот на этот случай я и пишу статью о DBMail.

DBMail присутствует в портах FreeBSD, оттуда мы его и поставим:

cd /usr/ports/mail/dbmail
make install clean

Ну и вначале, ставший практически для всех портов традиционный диалог настройки опций сборки:

┌────────────────────────────────────────────────────────────────────┐
│                    Options for dbmail 2.2.11                       │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │[X] MYSQL       Build with MySQL support                        │ │
│ │[ ] POSTGRESQL  Build with PostgreSQL support                   │ │
│ │[ ] SQLITE      Build with SQLite support                       │ │
│ │[ ] SIEVE       Build w. support for Sieve mail sorting language│ │
│ │[ ] LDAP        Build with support for LDAP authentication      │ │
├─└────────────────────────────────────────────────────────────────┘─┤
│                       [  OK  ]       Cancel                        │
└────────────────────────────────────────────────────────────────────┘

После того, как DBMail соберется и установится, нужно создать базу и таблицы. Для этого сначала подключимся к MySQL и создадим базу и пользователя, который будет подключатся к этой базе.

mysql -uroot -p
CREATE DATABASE dbmail;
GRANT ALL ON dbmail.* TO 'dbmail'@'localhost' IDENTIFIED BY 'dbmail-123';

И теперь создадим таблицы:

mysql -uroot -p dbmail </usr/local/share/dbmail/mysql/create_tables.mysql

Теперь можно переходить к настройке DBMail.
Файл настроек /usr/local/etc/dbmail.conf имеет такой вид:

[DBMAIL]
#Будем использовать mysql
driver               = mysql
#Авторизовать пользователей через sql
authdriver           = sql
#Параметры подключения к MySQL
host                 = localhost
sqlport              = 3306
sqlsocket            = /tmp/mysql.sock
user                 = dbmail
pass                 = dbmail-123
db                   = dbmail
table_prefix         = dbmail_
encoding             = utf8
default_msg_encoding = utf8
#Email постмастера, сюда будут сыпаться уведомления
postmaster           = postmaster@hilik.org.ua
sendmail              = /usr/sbin/sendmail
#Уровень логирования
TRACE_SYSLOG          = 3
TRACE_STDERR          = 1
#Работать DBMail будет от nobody
EFFECTIVE_USER        = nobody
EFFECTIVE_GROUP       = nogroup
#Соединения принимать на всех интерфейсах 
BINDIP                = *
#Количество одновременных процессов DBMail
NCHILDREN             = 2
MAXCHILDREN           = 10
MINSPARECHILDREN      = 2
MAXSPARECHILDREN      = 4
#Максимальное число соединений
MAXCONNECTS           = 10000
#Максимальное число ошибок соединения
MAX_ERRORS            = 500
#Глобальный таймаут. Применяется ко всем параметрам 
#отвечающих за ожидание, если они не были отдельно переопределены
TIMEOUT               = 300
#Переопределенный timeout для процедуры Login
login_timeout         = 60
#Для ускорения работы отключаем преобразование ip адресов в имена
RESOLVE_IP            = no
#Логи
logfile               = /var/log/dbmail.log
errorlog              = /var/log/dbmail.err
#Директории для pid файла
pid_directory         = /var/run
state_directory       = /var/run
#Настройки таймаутов
query_time_info       = 10
query_time_message    = 20
query_time_warning    = 30
 
#Настройки протоколов
[SMTP]
 
#По LMTP smtp сервера будут отдавать почту DBMailу
[LMTP]
PORT                  = 24
 
#POP3 и IMAP - протоколы по которым клиенты забирают почту.
[POP]
PORT                  = 110
POP_BEFORE_SMTP       = no
 
[IMAP]
PORT                  = 143
TIMEOUT               = 4000
IMAP_BEFORE_SMTP      = no
 
# end of configuration file

Теперь разрешим запускаться dbmail-imap, dbmail-pop3d и dbmail-lmtp:

echo 'dbmail_imapd_enable="YES"' >> /etc/rc.conf
echo 'dbmail_pop3d_enable="YES"' >> /etc/rc.conf
echo 'dbmail_lmtpd_enable="YES"' >> /etc/rc.conf

И соответственно запустим.

/usr/local/etc/rc.d/dbmail-imapd start
/usr/local/etc/rc.d/dbmail-pop3d start
/usr/local/etc/rc.d/dbmail-lmtpd start

И теперь перейдем к добавлению пользователей.
Добавляются пользователи так:

dbmail-users -a sh@hilik.org.ua -w cthutq-123

и увидим такой ответ:

Adding INBOX for new user... ok.
Done
sh@hilik.org.ua:x:4:0:0.00:0.00:

Добавить еще один адрес к почтовому ящику, ну то есть сделать alias, можно командой:

dbmail-users -c sh@hilik.org.ua -s hilik@hilik.org.ua

То есть, к почтовому ящику sh@hilik.org.ua, добавляем алиас hilik@hilik.org.ua.

На этом настройка самого DBMail закончена. Осталось прикрутить его к почтовому серверу Exim или Postfix.
Подключаем DBMail к Exim.
Подключаем DBMail к Postfix

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
  • By Inviseble_Demon, 23.11.2009 @ 01:25

    # cat /etc/redhat-release
    CentOS release 5.4 (Final)

    Пришлось компилировать вручную ))
    Собрал поставил настроил (вроде)
    Делал связку с sendmail

    Но так и не могу заставить подключиться к базе ((

    # dbmail-users -a mail@inviseble-demon.ru -w 123
    Opening connection to database…
    Failed. Could not connect to database (check log)
    Command failed.

    И хоть лопни…
    Пользователь создан, пробывал через myphpadmin — все робит
    Я даже под рутом пробывал :D
    В чем может быть трабла !?

    # $Id: dbmail.conf 1539 2004-12-27 21:41:07Z paul $
    # (c) 2000-2002 IC&S, The Netherlands
    #
    # Configuration file for DBMAIL
    # This configuration file needs to be run through dbmail-config to be effective
    # after that, changes are effective inmediatly

    /etc/dbmail.conf (может файл не тот ? O_o)
    [DBMAIL]
    # Database settings
    host=localhost # host for database, set to localhost if database is om
    # the same host as dbmail and you want to use a local socket
    # for connecting.
    sqlport=3306 # if you want to use TCP/IP for connecting to the database,
    # and have the database running on a non-standard port.
    sqlsocket=/var/lib/mysql/mysql.sock # when using a local socket connection to the database, fill
    # in the path to the socket here (e.g. /var/run/mysql.sock)
    user=dbmail # user to connect as to database
    pass=dbmail-123 # password for user to database
    db=dbmail # name of database
    POSTMASTER=postmaster # postmaster’s email address.
    # trace level for dbmail-util
    TRACE_LEVEL=2

    [SMTP]
    SENDMAIL=/usr/sbin/sendmail # sendmail executable for forwarding mail
    AUTO_NOTIFY=no
    AUTO_REPLY=no
    TRACE_LEVEL=2

    [LMTP]
    EFFECTIVE_USER=nobody # the user that dbmail-lmtpd will run as (need to be root to bind to a port<1024)
    EFFECTIVE_GROUP=nogroup # the group that dbmail-lmtpd will run as
    BINDIP=* # the ipaddress the dbmail-lmtpd server has to bind
    # to, * for all adresses. Use 127.0.0.1 to only
    # bind to localhost.
    PORT=24 # the port number the dbmail-lmtpd server has to bind to.
    NCHILDREN=20 # default number of LMTP handlers (each is a process)
    MAXCHILDREN=10 # max. number of LMTP handlers
    MINSPARECHILDREN=2
    MAXSPARECHILDREN=4
    MAXCONNECTS=10000 # the maximum number of connections a default childs makes
    TIMEOUT=300 # the time (s) before the dbmail-lmtpd should shutdown a connection which is being idle.
    RESOLVE_IP=yes # if yes, the lmtp daemon resolves IP numbers to DNS names in the log
    TRACE_LEVEL=2
    MAX_ERRORS=500

    [POP]
    EFFECTIVE_USER=dbmail # the user that dbmail-pop3d will run as (need to be root to bind to a port<1024)
    EFFECTIVE_GROUP=mail # the group that dbmail-pop3d will run as
    BINDIP=* # the ipaddress the dbmail-pop3d server has to bind to, * for all addresses
    PORT=110 # the port number the dbmail-pop3d server has to bind to.
    NCHILDREN=10 # default number of POP3 handlers (each is a process)
    MAXCHILDREN=20 # mac. number of POP3 handlers
    MINSPARECHILDREN=2
    MAXSPARECHILDREN=4
    MAXCONNECTS=100 # the maximum number of connections a default childs makes
    TIMEOUT=300 # the time (s) before the dbmail-pop3d should shutdown a connection which is being idle.
    RESOLVE_IP=yes # if yes, the pop daemon resolves IP numbers to DNS names in the log
    POP_BEFORE_SMTP=no
    TRACE_LEVEL=2

    [IMAP]
    EFFECTIVE_USER=nobody
    EFFECTIVE_GROUP=nogroup
    BINDIP=*
    PORT=143
    NCHILDREN=50
    MAXCHILDREN=200 # mac. number of IMAPD handlers
    MINSPARECHILDREN=2
    MAXSPARECHILDREN=4
    MAXCONNECTS=10000 # the maximum number of connections a default childs makes
    TIMEOUT=4000 # the time (s) before the dbmail-imapd should shutdown a connection which is being idle.
    RESOLVE_IP=yes # if yes, the imap daemon resolves IP numbers to DNS names in the log
    IMAP_BEFORE_SMTP=no
    TRACE_LEVEL=2

    # end of configuration file

  • By hilik, 23.11.2009 @ 01:46

    Попробуйте вместо localhost, 127.0.0.1 использовать. С этим бывают нюансы. И в гранте сожно попробовать 127.0.0.1 использовать grant all on dbmail.* to ‘dbmail’@’127.0.0.1’ identified by ‘dbmail-123’;

  • By Inviseble_Demon, 28.11.2009 @ 03:05

    Проблема была в кодеровке базы :D Включил голи и там все «на русском»…

    Сейчас делал связку… Dbmail + Postfix

    maillog
    Nov 28 02:56:20 inviseble-demon postfix/cleanup[15495]: fatal: unsupported dictionary type: mysql
    Nov 28 02:56:21 inviseble-demon postfix/master[8081]: warning: process /usr/libexec/postfix/cleanup pid 15495 exit status 1
    Nov 28 02:56:21 inviseble-demon postfix/master[8081]: warning: /usr/libexec/postfix/cleanup: bad command startup — throttling
    Nov 28 02:56:24 inviseble-demon postfix/smtpd[15510]: fatal: unsupported dictionary type: mysql
    Nov 28 02:56:25 inviseble-demon postfix/master[8081]: warning: process /usr/libexec/postfix/smtpd pid 15510 exit status 1
    Nov 28 02:56:25 inviseble-demon postfix/master[8081]: warning: /usr/libexec/postfix/smtpd: bad command startup — throttling
    Nov 28 02:57:19 inviseble-demon dbmail/pop3d[14212]: Message:[server] pool.c,manage_stop_children(+475): General stop requested. Killing children…
    Nov 28 02:57:21 inviseble-demon postfix/cleanup[15772]: fatal: unsupported dictionary type: mysql
    Nov 28 02:57:22 inviseble-demon postfix/master[8081]: warning: process /usr/libexec/postfix/cleanup pid 15772 exit status 1
    Nov 28 02:57:22 inviseble-demon postfix/master[8081]: warning: /usr/libexec/postfix/cleanup: bad command startup — throttling
    Nov 28 02:57:23 inviseble-demon dbmail/pop3d[15782]: Message:[server] pool.c,child_register(+299): register child [15782]
    Nov 28 02:57:23 inviseble-demon dbmail/pop3d[15784]: Message:[server] pool.c,child_register(+299): register child [15784]
    Nov 28 02:57:23 inviseble-demon dbmail/pop3d[15779]: Message:[server] pool.c,scoreboard_state(+590): Scoreboard state: children [2/10], spares [2 (2 — 4)]
    Nov 28 02:57:25 inviseble-demon postfix/smtpd[15788]: fatal: unsupported dictionary type: mysql
    Nov 28 02:57:26 inviseble-demon postfix/master[8081]: warning: process /usr/libexec/postfix/smtpd pid 15788 exit status 1
    Nov 28 02:57:26 inviseble-demon postfix/master[8081]: warning: /usr/libexec/postfix/smtpd: bad command startup — throttling
    Nov 28 02:57:27 inviseble-demon dbmail/imap4d[14093]: Message:[server] pool.c,manage_stop_children(+475): General stop requested. Killing children…
    Nov 28 02:57:31 inviseble-demon dbmail/imap4d[15838]: Message:[server] pool.c,child_register(+299): register child [15838]
    Nov 28 02:57:31 inviseble-demon dbmail/imap4d[15840]: Message:[server] pool.c,child_register(+299): register child [15840]
    Nov 28 02:57:31 inviseble-demon dbmail/imap4d[15835]: Message:[server] pool.c,scoreboard_state(+590): Scoreboard state: children [2/10], spares [2 (2 — 4)]
    Nov 28 02:57:38 inviseble-demon dbmail/lmtpd[9791]: Message:[server] pool.c,manage_stop_children(+475): General stop requested. Killing children…
    Nov 28 02:57:42 inviseble-demon dbmail/lmtpd[15885]: Message:[server] pool.c,child_register(+299): register child [15885]
    Nov 28 02:57:42 inviseble-demon dbmail/lmtpd[15887]: Message:[server] pool.c,child_register(+299): register child [15887]
    Nov 28 02:57:42 inviseble-demon dbmail/lmtpd[15883]: Message:[server] pool.c,scoreboard_state(+590): Scoreboard state: children [2/10], spares [2 (2 — 4)]
    Nov 28 02:58:22 inviseble-demon postfix/cleanup[16102]: fatal: unsupported dictionary type: mysql
    Nov 28 02:58:23 inviseble-demon postfix/master[8081]: warning: process /usr/libexec/postfix/cleanup pid 16102 exit status 1
    Nov 28 02:58:23 inviseble-demon postfix/master[8081]: warning: /usr/libexec/postfix/cleanup: bad command startup — throttling
    Nov 28 02:58:26 inviseble-demon postfix/smtpd[16108]: fatal: unsupported dictionary type: mysql
    Nov 28 02:58:27 inviseble-demon postfix/master[8081]: warning: process /usr/libexec/postfix/smtpd pid 16108 exit status 1
    Nov 28 02:58:27 inviseble-demon postfix/master[8081]: warning: /usr/libexec/postfix/smtpd: bad command startup — throttling
    Nov 28 02:59:23 inviseble-demon postfix/cleanup[17847]: fatal: unsupported dictionary type: mysql
    Nov 28 02:59:24 inviseble-demon postfix/master[8081]: warning: process /usr/libexec/postfix/cleanup pid 17847 exit status 1
    Nov 28 02:59:24 inviseble-demon postfix/master[8081]: warning: /usr/libexec/postfix/cleanup: bad command startup — throttling

    Че ему надо !? опять что то с sql процес вылетает… Кароче как всегда — кадельбек ((

Other Links to this Post


Украинская Баннерная Сеть