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

Статус
В этой теме нельзя размещать новые ответы.

Inviseble_Demon

Мой дом здесь!
Регистрация
11 Дек 2008
Сообщения
478
Реакции
377
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, который удаляет сообщение из очереди и завершает свою работу.

8527be5c5448.gif

рис. 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 дня и так голова кругом.
 
так... )) вроде докопался... если реализовать то все станет в моем понимании :D

Для просмотра ссылки Войди или Зарегистрируйся

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

PS. Истина гдето там :D
 
Извиняюсь, это типа проверки на спам? да дбмайл хорош, но требует очень много ресурсов от сервера, к нему какой то там модуль прикручиваешь дбспам вроде или что то типа того... как вариант борьбы со спамом предложить спамасасин с включеной проверкой хоста отправителя, первое письмо почтарь отклоняет, и спамасасин заносит хост в грейлист, после второго идентичного письма заводит сервер отправителя в валидлист, кто не прошёл в блеклист

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

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

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

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

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

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

Думаю потом все пересоберу и отделаюсь 100-150 и после думаю 200 ему будит достаточно + с местом нет напрягов 15 Гб. в его распорежении мне 3 хватит + на систему 2 :D
 
[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
Для просмотра ссылки Войди или Зарегистрируйся (вставлять 260 строк не стал :D)

У кого какие идеи ?
 
Для просмотра ссылки Войди или Зарегистрируйся
Все )) Собрал поставил настроил! ППЦ Ебогу без бубна никуда !

Теперь новая трабла (
Теперь рестануть 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 Так что....
Жаль что тема вышла в виде дневника :)
 
Так и не могу заставить подключиться к базе ((
Все блин ОК и такая опа...

# 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:
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху