Перехват почты, анализ на PHP, запись итога в Mysql (php скриптом)

Тема в разделе "Десктопный Linux", создана пользователем Inviseble_Demon, 21 ноя 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    OS Centos 5 32-bit
    =========================
    sendmail-doc-8.13.8-2.el5
    sendmail-8.13.8-2.el5
    sendmail-cf-8.13.8-2.el5

    PS. Если в итоге проще с Postfix - нет проблем поставлю !

    Итак задача - перехват входящей почты анализирование её на PHP и соответственно запись вердикта в MySQL.

    Первая идея была бегать по файлам с письмами - отпала минуты через 2-3 так как мало того что с провами нужно поиграть так ещё и сканить постоянно и при этом с надобностью и без неё.

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

    Как работает Sendmail !? Источник :read:

    Кто кому родитель

    Итак, при обработке сообщения для локального клиента, выполняется следующая последовательность действий (см. рис. 1:(

    1. Удалённый сервер, желая передать нам сообщение, отправляет запрос на соединение на 25-й порт нашего сервера.

    2. Процесс sendmail, обслуживающий соединения (тот, который в примере выше имеет PID 596), порождает дочерний процесс (назовём его sm1).

    3. Дочерний процесс sm1 проверяет возможность принять данное сообщение (анализируя конверт, прежде всего «rcpt to:») и в случае положительного ответа помещает сообщение в очередь, в файлы qf (заголовки) и df (тело сообщения). Причём qf обычно создаётся в памяти и записывается на диск только в случае невозможности переслать письмо сразу. То есть очередь – это каталог, куда временно сохраняются почтовые сообщения, проходящие через сервер электронной почты (по умолчанию используется /var/spool/mqueue).

    4. Если запись пройдёт успешно, Sendmail подтверждает факт приёма сообщения (принимая тем самым на себя всю ответственность за его дальнейшую судьбу) и завершает соединение с удалённым сервером.

    5. Далее sm1 анализирует заголовок сообщения и принимает решение о том, что нужно с ним делать. Если оно предназначено для локального пользователя, то вызывается локальный агент доставки, LDA (Local Delivery Agent), которому даётся поручение положить письмо в почтовый ящик пользователя.

    6. Когда LDA успешно выполняет доставку, он рапортует об этом процессу sm1, который удаляет сообщение из очереди и завершает свою работу.

    [​IMG]
    рис. 1

    Тобиш все что нам нужно это LDA заставить отдать письмо PHP скрипту ну или сохранить копию файла в нужную мне директорию (/var/www/user/data/www/domin.ru/mail/file_tmp_1258755556) и вызвала

    >shell php analizing_mail.php

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


    Вот собственно и вся идея.
    Сейчас вот сижу и думаю.... Он же порождает дочерний процес... а посфикс нет так как у него разные приложения и что если мы модменим просто его LDA на собственный демон :nezn:
    Нуб я в этих системах :D 4 день знакомлюсь впритык купил VPS отказался от лампы и пошол..... поставить апач + мускул + пхп несоставило труда и заняло с час... (поиск инфы отнял много времени)
    Потом начал ставить proftpd с горем пополам реализовал на sedmail сил не хватило :(

    Зашол на IPSmanager взял Demo и IPS сам все поднял я потом только прова сменил и от кого апач запускать. Ну и встал :D

    Не надеюсь на лес рук но надеюсь на помощ ))


    PS. Сильно инфой не давите если что.... За эти 3 дня и так голова кругом.
     
  2. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    так... )) вроде докопался... если реализовать то все станет в моем понимании :D

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

    Дальше оброщяйся себе в мускул да работай с письмами мне так даже удобнее будит но вот свизать его незнаю как... На FreBSD нашол статью а вот с Centos проблемы :(
    Может его кто ставил !?

    PS. Истина гдето там :D
     
  3. ilya-bunker

    ilya-bunker Создатель

    Регистр.:
    5 май 2009
    Сообщения:
    48
    Симпатии:
    6
    Извиняюсь, это типа проверки на спам? да дбмайл хорош, но требует очень много ресурсов от сервера, к нему какой то там модуль прикручиваешь дбспам вроде или что то типа того... как вариант борьбы со спамом предложить спамасасин с включеной проверкой хоста отправителя, первое письмо почтарь отклоняет, и спамасасин заносит хост в грейлист, после второго идентичного письма заводит сервер отправителя в валидлист, кто не прошёл в блеклист

    немного теории, сервер отправителя отправляет письмо на ваш сервер, ваш сервер отклоняет запрос с статусом "отправь мне его позже", по истечении кокого то времени сервер отправителя посылает опять идентичный запрос на ваш сервер и юзер получает почту и сервер заносится в валидлист

    минус у данной схемы всего один, письма порой доходят от одного до пяти часов.

    на счёт спамасасина мог ошибиться, сервер собирал не я, а мой коллега, если интересно могу у него узнать что да как
     
  4. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    нет.. это не защита от спама.

    Задача:
    1) Получить письмо.
    2) Распарсить по шаблону.
    3) Вытянутую инфу засунуть в базу.
    4) Избавиться от письма.

    Вот как это посоветуете реализовать ?
    Просто может я замороченый :D

    По поваду ресурсов, в данный момент лампа от ISPmanager
    Used memory 231 MB of 512 MB (burst 1024 MB)

    Думаю потом все пересоберу и отделаюсь 100-150 и после думаю 200 ему будит достаточно + с местом нет напрягов 15 Гб. в его распорежении мне 3 хватит + на систему 2 :D
     
  5. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    [root@user dbmail-2.2.11-rc4]# make
    make all-recursive
    make[1]: Entering directory `/tmp/dbmail-2.2.11-rc4'
    Making all in modules
    make[2]: Entering directory `/tmp/dbmail-2.2.11-rc4/modules'
    make[2]: Nothing to be done for `all'.
    make[2]: Leaving directory `/tmp/dbmail-2.2.11-rc4/modules'
    Making all in man
    make[2]: Entering directory `/tmp/dbmail-2.2.11-rc4/man'
    make[2]: Nothing to be done for `all'.
    make[2]: Leaving directory `/tmp/dbmail-2.2.11-rc4/man'
    make[2]: Entering directory `/tmp/dbmail-2.2.11-rc4'
    /bin/sh ./libtool --tag=CC --mode=link gcc -g -O2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/gmime-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -W -Wall -Wpointer-arith -Wstrict-prototypes -export-dynamic -L/lib -lglib-2.0 -Wl,--export-dynamic -L/lib -lgmodule-2.0 -ldl -lglib-2.0 -L/lib -lgmime-2.0 -lz -lnsl -lgobject-2.0 -lglib-2.0 -o dbmail-smtp main.o libdbmail.la
    gcc -g -O2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/gmime-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -W -Wall -Wpointer-arith -Wstrict-prototypes -Wl,--export-dynamic -o .libs/dbmail-smtp main.o -Wl,--export-dynamic -L/lib -lgmodule-2.0 -ldl -lgmime-2.0 -lz -lnsl -lgobject-2.0 -lglib-2.0 ./.libs/libdbmail.so -Wl,--rpath -Wl,/usr/local/lib/dbmail
    /usr/local/lib/libgthread-2.0.so.0: undefined reference to `g_mem_init'
    ./.libs/libdbmail.so: undefined reference to `crypt'
    /usr/local/lib/libgthread-2.0.so.0: undefined reference to `g_mutex_init'
    /usr/local/lib/libgthread-2.0.so.0: undefined reference to `g_messages_init'
    collect2: ld returned 1 exit status
    make[2]: *** [dbmail-smtp] Error 1
    make[2]: Leaving directory `/tmp/dbmail-2.2.11-rc4'
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory `/tmp/dbmail-2.2.11-rc4'
    make: *** [all] Error 2
    [root@user dbmail-2.2.11-rc4]#

    Чтоже этой сучке ещё нужно !? Запарился в конец... Весь день вчера собирал его теперь make не проходит :(:(:(:(

    [root@user dbmail-2.2.11-rc4]# rpm -qa > log.txt
    http://inviseble-demon.ru/log.txt (вставлять 260 строк не стал :D)

    У кого какие идеи ?
     
  6. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    http://linux-admin.net.ru/content/1073
    Все )) Собрал поставил настроил! ППЦ Ебогу без бубна никуда !

    Теперь новая трабла (
    Теперь рестануть sebmail немогу...

    Starting sendmail: 554 5.0.0 /etc/mail/sendmail.cf: line 1843: mailer dbmail: `=' expected
    554 5.0.0 /etc/mail/sendmail.cf: line 1847: invalid ruleset name: "=EnvFromSMTP/HdrFrom"

    Буду копать ))
    Может всетаки хоть ктонибуть ставил его ?
    Я блин даже заплотить готов !

    ---------- Post added at 00:47 ---------- Previous post was Вчера at 23:33 ----------

    ТРИНДЕЦ !!!! :D

    Изначально перед рестартом вот что в sendmail.cf было

    Mprocmail, P=/usr/bin/procmail, F=DFMSPhnu9, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
    T=DNS/RFC822/X-Unix,
    A=procmail -Y -m $h $f $u


    Mdbmail, P=/usr/sbin/dbmail-smtp, F=DFMSPhnu9,
    S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
    T=DNS/RFC822/X-Unix,
    A=DBMAIL_MAILER_ARGSPOPDIVERT


    Изменил в соответствии с синтаксисом и аформление ))
    Mprocmail, P=/usr/bin/procmail, F=DFMSPhnu9, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
    T=DNS/RFC822/X-Unix,
    A=procmail -Y -m $h $f $u


    Mdbmail, P=/usr/sbin/dbmail-smtp, F=DFMSPhnu9, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrFromSMTP,
    T=DNS/RFC822/X-Unix,
    A=DBMAIL_MAILER_ARGSPOPDIVERT

    Перезапуск прошол успешно ! :yahoo:

    Сейчас буду тестить работу :D Так что....
    Жаль что тема вышла в виде дневника :)
     
  7. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Так и не могу заставить подключиться к базе ((
    Все блин ОК и такая опа...

    # 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



    PS. Это я так для завершения темы как бы )) Далее как все поставлю отпишу в чем трабла была. Авось каму пригодится :nezn:
     
Статус темы:
Закрыта.