|
|
|
| Видела, что возможно закинуть на сервер файлы прямо с почты...
Ктонить вкурсе как это делается? | |
|
|
|
|
|
|
|
для: Елена Смирнова
(22.12.2007 в 21:02)
| | На PHP, как правило, с помощью функций расширения IMAP. | |
|
|
|
|
|
|
|
для: Unkind
(22.12.2007 в 22:28)
| | Я думала будет легче. Спасибо! | |
|
|
|
|
|
|
|
для: Елена Смирнова
(23.12.2007 в 14:21)
| | Люди покажите пример работы с IMAP
http://php.net/imap не могу понять ( все на инглише | |
|
|
|
|
|
|
|
для: Елена Смирнова
(29.12.2007 в 15:02)
| | Там есть и примеры: http://www.php.net/manual/ru/function.imap-open.php
<?php
$mbox = imap_open("{imap.example.org:143}", "username", "password");
echo "<h1>Mailboxes</h1>\n";
$folders = imap_listmailbox($mbox, "{imap.example.org:143}", "*");
if ($folders == false) {
echo "Call failed<br />\n";
} else {
foreach ($folders as $val) {
echo $val . "<br />\n";
}
}
echo "<h1>Headers in INBOX</h1>\n";
$headers = imap_headers($mbox);
if ($headers == false) {
echo "Call failed<br />\n";
} else {
foreach ($headers as $val) {
echo $val . "<br />\n";
}
}
imap_close($mbox);
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(29.12.2007 в 15:11)
| | Это все пробовала, но как мне именно присланный файл выделить. обработать и копировать в директорию на сервере. | |
|
|
|
|
|
|
|
для: Елена Смирнова
(29.12.2007 в 18:16)
| | >Это все пробовала, но как мне именно присланный файл выделить. обработать и копировать в директорию на сервере.
Присланный по почте? | |
|
|
|
|
|
|
|
для: ddhvvn
(29.12.2007 в 19:12)
| | Да, совершенно верно! | |
|
|
|
|
|
|
|
для: Елена Смирнова
(29.12.2007 в 23:10)
| | У Вас почта по IPAM? | |
|
|
|
|
|
|
|
для: Faraon
(30.12.2007 в 00:21)
| | А что это? | |
|
|
|
|
|
|
|
для: Unkind
(30.12.2007 в 00:25)
| | на счет Imap ? | |
|
|
|
|
|
|
|
для: Faraon
(30.12.2007 в 00:50)
| | Нет, насчет IPAM. | |
|
|
|
|
|
|
|
для: Unkind
(30.12.2007 в 00:54)
| | >to Unkind
Ошибся в буквах, но не в этом дело. | |
|
|
|
|
|
|
|
для: Faraon
(30.12.2007 в 01:45)
| | А в чем же дело, как не в буквах? | |
|
|
|
|
|
|
|
для: Unkind
(30.12.2007 в 02:07)
| | Все письма должны складывать в определенную папку на сервере (это если почтовый сервер на Вашем же аккаунте).
Так вот можно либо стандартно читать эти файлы, потом выдирать оттуда сами вложенные файлы и делать уже что нужно. Это если, почта Ваша.
Если нет, то подключаемся IMAP-функциями к серверу и читаем сообщения. | |
|
|
|
|
|
|
|
для: ddhvvn
(30.12.2007 в 11:59)
| | Вот нашел скриптик, сам не помню зачем его делал =)
Он выдирает файл из сообщения. При необходимости его можно модифицировать на несколько файлов и т.д.
Главное, тут идея видна =)
<?php
$mes_body = file_get_contents("test.eml");
preg_match("|Content-Disposition: attachment;
filename=\"([^\"]+)\"|is", $mes_body, $names);
preg_match("|\r?\n\r?\n([^-]+)\r?\n|is", $mes_body, $files);
if (file_put_contents($names[1], base64_decode($files[1])) )
echo "OK";
else
echo "NO";
?>
|
P.S.: в этом скрипте я использовал привычные "ограничители". Но лучше все-таки выбарть boundary и ориентироваться по нему!
P.P.S.: сохраните какое-нибудь сообщение с вложением файл, а потом откройте этот файл блокнотом! Думаю все станет ясно! =) | |
|
|
|
|
|
|
|
для: ddhvvn
(30.12.2007 в 12:48)
| | *.eml - это всего лишь файл для клиента Outlook Express. А на серверах, если не ошибаюсь, под каждый ящик свой файл. Но не под каждое письмо. | |
|
|
|
|
|
|
|
для: Unkind
(30.12.2007 в 13:33)
| | А все же как конкретно получить файл с псиьма, как например с формы $_FILE | |
|
|
|
|
|
|
|
для: Елена Смирнова
(30.12.2007 в 14:33)
| | Я же Вам дал идею как действовать! Что у Вас еще вызывает трудности? | |
|
|
|
|
|
|
|
для: Елена Смирнова
(30.12.2007 в 14:33)
| | Попробуйте что-то вроде
<?php
define( 'MAILBOX', '{pop.example.com}' );
define( 'USER', 'user' );
define( 'PASS', 'password' );
define( 'ENC_7BIT', 0 );
define( 'ENC_8BIT', 1 );
define( 'ENC_BINARY', 2 );
define( 'ENC_BASE64', 3 );
define( 'ENC_QUOTED_PRINTABLE', 4 );
define( 'ENC_OTHER', 5 );
if( !function_exists('imap_open') )
{
die( 'IMAP lib does not exist' );
}
if( !is_file('upload_timestamp.txt') )
{
if( is_writable('.') )
{
fclose(fopen('upload_timestamp.txt', 'w'));
}
else
{
die( 'Could not mk "upload_timestamp.txt"' );
}
}
$upload_timestamp = (int) file_get_contents( 'upload_timestamp.txt' );
// Проверка ящика не чаще, чем раз в 3 минуты
if( $upload_timestamp < time() - 180 )
{
if( !($mbox = imap_open(MAILBOX, USER, PASS)) )
{
die( 'Could not open mailbox' );
}
$num_msg = imap_num_msg( $mbox );
$message = array();
$attachment = array();
for($i = $num_msg; $i > $num_msg - 3; $i--)
{
$structure = imap_header($mbox, $i);
$structure = imap_fetchstructure($mbox, $i);
for($p = 0; isset($structure->parts) && $p < count($structure->parts); $p++)
{
if( $structure->parts[$p]->ifdisposition && strtoupper($structure->parts[$p]->disposition) == 'ATTACHMENT' )
{
$buffer = imap_fetchbody($mbox, $i, $p + 1, FT_PEEK);
switch( $structure->parts[$p]->encoding )
{
case ENC_BASE64:
$buffer = imap_base64($buffer);
break;
// ...
}
$attachment[] = array(
'filename' => $structure->parts[$p]->parameters[0]->value,
'content' => $buffer
);
}
else if( $structure->parts[$p]->ifsubtype && strtoupper($structure->parts[$p]->subtype) == 'PLAIN' )
{
// Письмо
}
}
}
imap_close( $mbox );
}
$fh = fopen('upload_timestamp.txt', 'w');
fwrite($fh, time());
fclose($fh);
print_r($attachment);
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(30.12.2007 в 16:37)
| | Unkind, спасибо! Можно хоть как-то прокоментировать это.... с какой переменной работать как с файлом? | |
|
|
|
|
|
|
|
для: Елена Смирнова
(30.12.2007 в 18:10)
| |
<?php
// Первый аргумент imap_open() - сервер и путь к почтовому ящику на этом сервере
// Например, для MAIL.RU выглядит так:
define( 'MAILBOX', '{pop.mail.ru/pop3:110}INBOX' );
// ...
define( 'USER', 'mailbox' );
define( 'PASS', 'password' );
// Возможные виды кодирования данных
// Ввод этих констант нужен только для дальнейшего улучшения читабельности кода
define( 'ENC_7BIT', 0 );
define( 'ENC_8BIT', 1 );
define( 'ENC_BINARY', 2 );
define( 'ENC_BASE64', 3 ); // Чаще всего для передачи вложений их кодируют в base64
define( 'ENC_QUOTED_PRINTABLE', 4 );
define( 'ENC_OTHER', 5 );
// Если IMAP-библиотека не подключена или отсутствует в этой сборке
if( !function_exists('imap_open') )
{
die( 'IMAP lib does not exist' );
}
// Создание файла для записи timestamp'а
if( !is_file('upload_timestamp.txt') )
{
if( is_writable('.') )
{
fclose(fopen('upload_timestamp.txt', 'w'));
}
else
{
die( 'Could not mk "upload_timestamp.txt"' );
}
}
// Массив для attachment'ов (вложений)
$attachment = array();
$upload_timestamp = (int) file_get_contents( 'upload_timestamp.txt' );
//На время DEBUG'а
$upload_timestamp = 0;
// Проверка ящика не чаще, чем раз в 3 минуты
if( $upload_timestamp < time() - 180 )
{
// Соединение с почтовым сервером
if( !($mbox = imap_open(MAILBOX, USER, PASS)) )
{
die( 'Could not open mailbox' );
}
// Получение кол-ва писем на сервере
$num_msg = imap_num_msg( $mbox );
// Перебор всех писем
for($i = $num_msg; $i > 0; $i--)
{
// Структура письма
$structure = imap_fetchstructure($mbox, $i);
// Перебор частей писем (письмо, состоящее из одной части не содержит аттачей)
for($p = 0; isset($structure->parts) && $p < count($structure->parts); $p++)
{
// Если это вложение, ...
if( $structure->parts[$p]->ifdisposition && strtoupper($structure->parts[$p]->disposition) == 'ATTACHMENT' )
{
// ..., то получаем его
$buffer = imap_fetchbody($mbox, $i, $p + 1, FT_PEEK);
// Раскодирование
switch( $structure->parts[$p]->encoding )
{
case ENC_BASE64:
$buffer = imap_base64($buffer);
break;
// ...
}
// Запихивем в массив имя файла, которое было на клиентской машине, и его содержимое
$attachment[] = array(
'filename' => $structure->parts[$p]->parameters[0]->value,
'content' => $buffer
);
}
else if( $structure->parts[$p]->ifsubtype && strtoupper($structure->parts[$p]->subtype) == 'PLAIN' )
{
// Письмо
}
}
}
// Закрытие соединения
imap_close( $mbox );
}
// Запись timestamp'а последней проверки почтового ящика
$fh = fopen('upload_timestamp.txt', 'w');
fwrite($fh, time());
fclose($fh);
/*
Должен получиться массив $attachment, каждый элемент которого еще один массив:
"filename" => "имя_файла", "content" => "содержимое_файла".
*/
print_r($attachment);
/*
for($i = 0; $i < count($attachment); $i++)
{
$fh = fopen('trash/' . $attachment[$i]['filename'], 'wb');
fwrite($fh, $attachment[$i]['content']);
fclose($fh);
}
*/
?>
|
Но скрипт просто показывает как можно достать файлы с того же mail.ru. Для реального использования нужно еще как минимум добавить проверку размера файла (еще до получения attachment'а), проверку на имя, если сохранять хотите с пользовательским именем и/или проверку MIME-тайпа, если хотите сохранять со своим именем.
P.S. Да и еще тут перебираются все письма.
Можно после проверки письма его помечать как удаленное (imap_delete($mbox, $i) и поставить перед закрытием соединения imap_expunge($mbox) для реального удаления писем.
И если хотите тестировать скрипт - заведите левый ящик на mail.ru, чтобы туда можно было отослать два-три письма для проверки.
Не то от большого количества писем скрипт, понятное дело, испортит настроение компьютеру. | |
|
|
|