Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Закинуть на сервер файлы прямо с почты
 
 автор: Елена Смирнова   (22.12.2007 в 21:02)   письмо автору
 
 

Видела, что возможно закинуть на сервер файлы прямо с почты...
Ктонить вкурсе как это делается?

   
 
 автор: Unkind   (22.12.2007 в 22:28)   письмо автору
 
   для: Елена Смирнова   (22.12.2007 в 21:02)
 

На PHP, как правило, с помощью функций расширения IMAP.

   
 
 автор: Елена Смирнова   (23.12.2007 в 14:21)   письмо автору
 
   для: Unkind   (22.12.2007 в 22:28)
 

Я думала будет легче. Спасибо!

   
 
 автор: Елена Смирнова   (29.12.2007 в 15:02)   письмо автору
 
   для: Елена Смирнова   (23.12.2007 в 14:21)
 

Люди покажите пример работы с IMAP
http://php.net/imap не могу понять ( все на инглише

   
 
 автор: Unkind   (29.12.2007 в 15:11)   письмо автору
 
   для: Елена Смирнова   (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);
?>

   
 
 автор: Елена Смирнова   (29.12.2007 в 18:16)   письмо автору
 
   для: Unkind   (29.12.2007 в 15:11)
 

Это все пробовала, но как мне именно присланный файл выделить. обработать и копировать в директорию на сервере.

   
 
 автор: ddhvvn   (29.12.2007 в 19:12)   письмо автору
 
   для: Елена Смирнова   (29.12.2007 в 18:16)
 

>Это все пробовала, но как мне именно присланный файл выделить. обработать и копировать в директорию на сервере.

Присланный по почте?

   
 
 автор: Елена Смирнова   (29.12.2007 в 23:10)   письмо автору
 
   для: ddhvvn   (29.12.2007 в 19:12)
 

Да, совершенно верно!

   
 
 автор: Faraon   (30.12.2007 в 00:21)   письмо автору
 
   для: Елена Смирнова   (29.12.2007 в 23:10)
 

У Вас почта по IPAM?

   
 
 автор: Unkind   (30.12.2007 в 00:25)   письмо автору
 
   для: Faraon   (30.12.2007 в 00:21)
 

А что это?

   
 
 автор: Faraon   (30.12.2007 в 00:50)   письмо автору
 
   для: Unkind   (30.12.2007 в 00:25)
 

на счет Imap ?

   
 
 автор: Unkind   (30.12.2007 в 00:54)   письмо автору
 
   для: Faraon   (30.12.2007 в 00:50)
 

Нет, насчет IPAM.

   
 
 автор: Faraon   (30.12.2007 в 01:45)   письмо автору
 
   для: Unkind   (30.12.2007 в 00:54)
 

>to Unkind
Ошибся в буквах, но не в этом дело.

   
 
 автор: Unkind   (30.12.2007 в 02:07)   письмо автору
 
   для: Faraon   (30.12.2007 в 01:45)
 

А в чем же дело, как не в буквах?

   
 
 автор: ddhvvn   (30.12.2007 в 11:59)   письмо автору
 
   для: Unkind   (30.12.2007 в 02:07)
 

Все письма должны складывать в определенную папку на сервере (это если почтовый сервер на Вашем же аккаунте).

Так вот можно либо стандартно читать эти файлы, потом выдирать оттуда сами вложенные файлы и делать уже что нужно. Это если, почта Ваша.

Если нет, то подключаемся IMAP-функциями к серверу и читаем сообщения.

   
 
 автор: ddhvvn   (30.12.2007 в 12:48)   письмо автору
 
   для: 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.: сохраните какое-нибудь сообщение с вложением файл, а потом откройте этот файл блокнотом! Думаю все станет ясно! =)

   
 
 автор: Unkind   (30.12.2007 в 13:33)   письмо автору
 
   для: ddhvvn   (30.12.2007 в 12:48)
 

*.eml - это всего лишь файл для клиента Outlook Express. А на серверах, если не ошибаюсь, под каждый ящик свой файл. Но не под каждое письмо.

   
 
 автор: Елена Смирнова   (30.12.2007 в 14:33)   письмо автору
 
   для: Unkind   (30.12.2007 в 13:33)
 

А все же как конкретно получить файл с псиьма, как например с формы $_FILE

   
 
 автор: ddhvvn   (30.12.2007 в 16:23)   письмо автору
 
   для: Елена Смирнова   (30.12.2007 в 14:33)
 

Я же Вам дал идею как действовать! Что у Вас еще вызывает трудности?

   
 
 автор: Unkind   (30.12.2007 в 16:37)   письмо автору
 
   для: Елена Смирнова   (30.12.2007 в 14:33)
 

Попробуйте что-то вроде

<?php
define
'MAILBOX''{pop.example.com}' );
define'USER''user' );
define'PASS''password' );

define'ENC_7BIT');
define'ENC_8BIT');
define'ENC_BINARY');
define'ENC_BASE64');
define'ENC_QUOTED_PRINTABLE');
define'ENC_OTHER');

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(MAILBOXUSERPASS)) )
    {
        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 1FT_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($fhtime());
fclose($fh);

print_r($attachment);
?>

   
 
 автор: Елена Смирнова   (30.12.2007 в 18:10)   письмо автору
 
   для: Unkind   (30.12.2007 в 16:37)
 

Unkind, спасибо! Можно хоть как-то прокоментировать это.... с какой переменной работать как с файлом?

   
 
 автор: Unkind   (30.12.2007 в 20:52)   письмо автору
 
   для: Елена Смирнова   (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'); 
define'ENC_8BIT'); 
define'ENC_BINARY');
define'ENC_BASE64'); // Чаще всего для передачи вложений их кодируют в base64 
define'ENC_QUOTED_PRINTABLE'); 
define'ENC_OTHER'); 

// Если 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(MAILBOXUSERPASS)) ) 
    { 
        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 1FT_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($fhtime()); 
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, чтобы туда можно было отослать два-три письма для проверки.
Не то от большого количества писем скрипт, понятное дело, испортит настроение компьютеру.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования