PHP: обработка входящей почты

Форум для программистов

Сообщение sky-dsl » Ср июл 26, 2006 5:04 am

Задача.
Нужно на PHP реализовать обработку всей входящей почты на сервере.
Из вложений .xml нужно считывать инфу и далее записать в базу SQL.

Вопрос.
Как обработать письмо? Даже примерно не знаю. <!--emo&:(-->[img]style_emoticons/<#EMO_DIR#>/sad.gif[/img]<!--endemo--> Подскажите ..
Последний раз редактировалось sky-dsl Ср июл 26, 2006 5:06 am, всего редактировалось 1 раз.
sky-dsl
Рядовой
 
Сообщений: 9
Зарегистрирован: Ср июл 26, 2006 3:17 am
Пункты репутации: 0

Сообщение sm@rt » Ср июл 26, 2006 6:03 am

Система - Linux?
Красота и массовые расстрелы спасут мир.
sm@rt
Генерал-майор
 
Сообщений: 2935
Зарегистрирован: Вт фев 25, 2003 4:42 pm
Пункты репутации: 0

Сообщение sky-dsl » Ср июл 26, 2006 6:12 am

Да.
sky-dsl
Рядовой
 
Сообщений: 9
Зарегистрирован: Ср июл 26, 2006 3:17 am
Пункты репутации: 0

Сообщение Леха » Ср июл 26, 2006 9:15 am

<a href='http://ru.php.net/manual/ru/ref.imap.php' target='_blank'>http://ru.php.net/manual/ru/ref.imap.php</a>

Изучай тут.
Леха
Полковник
 
Сообщений: 1261
Зарегистрирован: Чт мар 20, 2003 8:52 pm
Откуда: Россия, Москва, Улица, Дом, Квартира
Пункты репутации: 0

Сообщение sky-dsl » Ср июл 26, 2006 9:42 am

<!--QuoteBegin-Леха+Jul 26 2006, 15:15--><div class='quotetop'>QUOTE(Леха @ Jul 26 2006, 15:15)</div><div class='quotemain'><!--QuoteEBegin-->Изучай тут.
[right][snapback]212220[/snapback][/right]
<!--QuoteEnd--></div><!--QuoteEEnd-->

Там уже был. Английский знаю плохо хотя кой чего понял.
создал фильтр в котором прописал если выполняется условие перенаправить на email.php
первой строкой прописал #!/usr/bin/php
а что дальше?

Мне бы пару примеров:
как обработать перенаправленное письмо
как приаттаченный файл скопировать в отдельную папку на сервере.
sky-dsl
Рядовой
 
Сообщений: 9
Зарегистрирован: Ср июл 26, 2006 3:17 am
Пункты репутации: 0

Сообщение sky-dsl » Чт июл 27, 2006 8:27 am

В общем немного продвинулся.
Письмо получаю входящим потоком
Код: выделить все
$in=fopen("php://stdin","r") or die();


Вопрос как из письма извлечь приаттаченный файл и положить в нужную директорию.
sky-dsl
Рядовой
 
Сообщений: 9
Зарегистрирован: Ср июл 26, 2006 3:17 am
Пункты репутации: 0

Сообщение Леха » Чт июл 27, 2006 12:19 pm

Напиши сюда текст, находящийся в $in.
Леха
Полковник
 
Сообщений: 1261
Зарегистрирован: Чт мар 20, 2003 8:52 pm
Откуда: Россия, Москва, Улица, Дом, Квартира
Пункты репутации: 0

Сообщение sky-dsl » Чт июл 27, 2006 12:37 pm

после отработки скрипта в $in следуюшее:
Код: выделить все
From vskj@mail.ru Thu Jul 27 15:29:28 2006
Received: from 64.153.74.143.modem-pool.server.ru ([64.153.74.143] helo=ljvtyp.ru)
   by server.net with esmtp (Exim 4.52)
   id 1G643T-00089X-Aw
   for admin@server.ru; Thu, 27 Jul 2006 15:29:28 +0400
Received: from localhost ([194.138.10.122])
   by server.ru (Courier Mail Server 2.03) with ESMTP id 0390001U
   for; Thu, 27 Jul 2006 15:29:24 +0400
Date: Thu, 27 Jul 2006 15:22:26 +0400
From: =?windows-1251?Q?=C0=ED=E4=F0=E5=E9?=
X-Mailer: The Bat! (v3.51.10) Professional
Reply-To: =?windows-1251?Q?=C0=ED=E4=F0=E5=E9?=
Organization: -
X-Priority: 3 (Normal)
Message-ID: <16047222.20060727152226@mail.ru>
To: admin@serer.ru
Subject: =?windows-1251?Q?=D2=E5=F1=F2?=
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----------E516A12B14D813FD"

------------E516A12B14D813FD
Content-Type: text/plain; charset=windows-1251
Content-Transfer-Encoding: quoted-printable

=C7=E4=F0=E0=E2=F1=F2=E2=F3=E9=F2=E5, admin.

=CE=F2=EF=F0=E0=E2=E8=F2=E5=EB=FC

--=20
=D1 =F3=E2=E0=E6=E5=ED=E8=E5=EC,
=C0=ED=E4=F0=E5=E9                          mailto:admin@mail.ru
------------E516A12B14D813FD
Content-Type: application/xml; name="test.xml"
Content-transfer-encoding: base64
Content-Disposition: attachment; filename="test.xml"

PD94bWwgdmVyc2lvbj0iMS4wIj8+DQohRE9DVFlQRSBjdXN0b21lciBTWVNURU1rcmVnZnVy
aTBlcmpmcGVpZGk1NjExMTFUaGlzIGlzIHRoZSB0aXRsZQ0Ka29kLTg0aEYxOQ0K
------------E516A12B14D813FD--
sky-dsl
Рядовой
 
Сообщений: 9
Зарегистрирован: Ср июл 26, 2006 3:17 am
Пункты репутации: 0

Сообщение Леха » Чт июл 27, 2006 3:13 pm

Смотри:
<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->PD94bWwgdmVyc2lvbj0iMS4wIj8+DQohRE9DVFlQRSBjdXN0b21lciBTWVNURU1rcmVnZnVy
aTBlcmpmcGVpZGk1NjExMTFUaGlzIGlzIHRoZSB0aXRsZQ0Ka29kLTg0aEYxOQ0K
<!--QuoteEnd--></div><!--QuoteEEnd-->

Вот это - text.xml, над которым произвели base64 encode. Ты делаешь base64 decode (есть стд. ф-я), и сохраняешь в файло.
Леха
Полковник
 
Сообщений: 1261
Зарегистрирован: Чт мар 20, 2003 8:52 pm
Откуда: Россия, Москва, Улица, Дом, Квартира
Пункты репутации: 0

Сообщение sky-dsl » Пт июл 28, 2006 5:04 am

Я и сам вижу где вложенный файл. Только не могу сообразить как его выдернуть из переменной $in. И вот еще что ведь вложенный файл может прийти и в другой кодеровке или воодще без нее. как быть в такой ситуации.
sky-dsl
Рядовой
 
Сообщений: 9
Зарегистрирован: Ср июл 26, 2006 3:17 am
Пункты репутации: 0

Сообщение sm@rt » Пт июл 28, 2006 6:29 am

<!--QuoteBegin-sky-dsl+Jul 28 2006, 08:04--><div class='quotetop'>QUOTE(sky-dsl @ Jul 28 2006, 08:04)</div><div class='quotemain'><!--QuoteEBegin-->не могу сообразить как его выдернуть из переменной $in
[right][snapback]212383[/snapback][/right]
<!--QuoteEnd--></div><!--QuoteEEnd-->
<!--QuoteBegin-Леха+Jul 27 2006, 18:13--><div class='quotetop'>QUOTE(Леха @ Jul 27 2006, 18:13)</div><div class='quotemain'><!--QuoteEBegin-->делаешь base64 decode (есть стд. ф-я), и сохраняешь в файло.
[right][snapback]212338[/snapback][/right]
<!--QuoteEnd--></div><!--QuoteEEnd-->
Красота и массовые расстрелы спасут мир.
sm@rt
Генерал-майор
 
Сообщений: 2935
Зарегистрирован: Вт фев 25, 2003 4:42 pm
Пункты репутации: 0

Сообщение sky-dsl » Пт июл 28, 2006 6:47 am

2 sm@rt
Спасибо за цитаты. Может приведешь кусок кода для реализации этого метода.
sky-dsl
Рядовой
 
Сообщений: 9
Зарегистрирован: Ср июл 26, 2006 3:17 am
Пункты репутации: 0

Сообщение sm@rt » Пт июл 28, 2006 6:59 am

Код: выделить все
$str = <<<END
PD94bWwgdmVyc2lvbj0iMS4wIj8+DQohRE9DVFlQRSBjdXN0b21lciBTWVNURU1rcmVnZnVy
aTBlcmpmcGVpZGk1NjExMTFUaGlzIGlzIHRoZSB0aXRsZQ0Ka29kLTg0aEYxOQ0K
END;
$str = base64_decode($str);
$f = fopen('saved.xml', 'w+');
fwrite($f, $str);
fclose($f);
Красота и массовые расстрелы спасут мир.
sm@rt
Генерал-майор
 
Сообщений: 2935
Зарегистрирован: Вт фев 25, 2003 4:42 pm
Пункты репутации: 0

Сообщение Леха » Пт июл 28, 2006 7:17 am

Он, наверное, имеет в виду как найти эти строки среди прочих.
Ориентируйся на это:
<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->------------E516A12B14D813FD
Content-Type: application/xml; name="test.xml"
Content-transfer-encoding: base64
Content-Disposition: attachment; filename="test.xml"

...
------------E516A12B14D813FD--
<!--QuoteEnd--></div><!--QuoteEEnd-->
Леха
Полковник
 
Сообщений: 1261
Зарегистрирован: Чт мар 20, 2003 8:52 pm
Откуда: Россия, Москва, Улица, Дом, Квартира
Пункты репутации: 0

Сообщение sky-dsl » Пт июл 28, 2006 7:26 am

эта часть мне понятна.

<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->$str = base64_decode($str);
$f = fopen('saved.xml', 'w+');
fwrite($f, $str);
fclose($f);
<!--QuoteEnd--></div><!--QuoteEEnd-->

но как выделить исходный файл, в примере ты его скопировал руками и загнал в переменную $str. В этом то у меня и загвоздка.

Простым поиском? но ведь <!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->------------E516A12B14D813FD<!--QuoteEnd--></div><!--QuoteEEnd--> эта часть в разных письмах будет отличаться. Нет ли стандартной процедуры
типа mail() только не для отправки а для получения письма и разбора его на заголовок и тело.
Последний раз редактировалось sky-dsl Пт июл 28, 2006 7:30 am, всего редактировалось 1 раз.
sky-dsl
Рядовой
 
Сообщений: 9
Зарегистрирован: Ср июл 26, 2006 3:17 am
Пункты репутации: 0

След.

Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron