Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Интернет технологии -> PHP -> PHP: Экономим на входящем трафике


PHP: Экономим на входящем трафике

Некоторые провайдеры предоставляют скидки на локальный трафик (в зоне провайдера), которые могут достигать 80%. В эту зону может включаться входящая почта с сервера провайдера. Как этим можно воспользоваться? Посмотрим.

Имеем:

  • хостинг с поддержкой PHP (желательно без ограниченного трафика)
  • провайдер, предоставляющий скидки
  • почтовый ящик, расположенный на сервере провайдера

    Принцип работы будет заключаться в закачке необходимого файла на свой WEB-сервер и отправке его на почтовый ящик, расположенный у провайдера.

    Необходимо учесть увеличение размера посылки в связи с использованием base64. И чем меньше будет нужный файл, тем меньше будет и выигрыш в трафике. Остается только уложиться в максимальный размер письма для Вашего почтового ящика.

    Отправляем на сервер скрипт downmail.php и вызываем его через браузер. При своей работе скрипт также использует класс для отправки почты с аттачментом mailer. Основная форма содержится в самом скрипте и исключена из примера для компактности.

    <?php
      // выводим ошибку
      function PrintError($str)
      {
        echo "<FONT COLOR="#ff0000">$str</FONT><BR />n";
      }
      // передаваемые через форму значения
      $url = $HTTP_POST_VARS['url'];
      $email = $HTTP_POST_VARS['email'];
      if(!strlen($url) || !strlen($email))
      {
        PrintError('Необходимо заполнить все поля!');
        exit();
      }
      // отключаем тайм-аут
      if( !get_cfg_var('safe_mode') )
        set_time_limit(0);
      // отправим 256 пробелов для Explorer'a и Opera
      echo str_repeat(' ', 256);
      echo 'Open remote file ' . $url . "...n";
      flush();
      $name = parse_url($url);
      // создаем заголовок HTTP-запроса
      $opts = array(
        'http' => array(
          'method' => "GET",
          // представимся Explorer'ом
          'user_agent' => "User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)rn",
          'header' => 
            'Host: ' . $name['host'] . "rn" .
            "Accept: */*rn" .
            "Pragma: no-cachern" .
            "Connection: closern" .
            "Cache-control: no-cachern"
        )
      );
      $context = stream_context_create($opts);
      $fl = @fopen ($url, 'rb', false, $context);
      if(!$fl)
        PrintError('Error open remote file');
      else
      {
        echo "OK<BR />Create local file...n";
        flush();
        $file = basename($name['path']);
        $fname = './' . $file;
        $fo = @fopen($fname, 'wb'); // $fo - file out
        if(!$fo)
          PrintError('Error');
        else
        {
          echo "OK<BR />Get file info...n";
          flush();
          $len = 0; // размер удаленного файла
          // получим заголовок ответа сервера
          $data = stream_get_meta_data($fl);
          $head = $data['wrapper_data'];
          // из полученного ответа находим длину файла
          while( list(, $val) = each($head) )
            if( substr(strtoupper($val), 0, 16) == 'CONTENT-LENGTH: ' )
            {
              $len = intval( substr($val, 16) );
              break;
            }
          echo ' length = ' . $len . "n";
          echo '<BR />Get content...<BR />' . "n";
          if($len)
            echo '0%' . "n";
          flush();
          // переменные для вывода процентной шкалы
          $wrlen = 0; // записанные данные
          $delta = 10; // выводим каждые $delta процентов
          $next = $delta; // следующее выводимое значение
          // получаем содержимое файла
          while(true)
          {
            $data = fread($fl, 4096);
            if(strlen($data) == 0)
              break;
            $wrlen += fwrite($fo, $data);
            // выводим процентную шкалу, если получили Content-Length
            if($len)
              if( ($wrlen*100)/$len >= $next)
              {
                // кол-во записанных данных превысило $next
                // выводим процент закачки и увеличиваем $next
                echo ' === ' . $next . '%' ."n";
                flush();
                $next += $delta;
              }
          }
          fclose($fo);
          $valid = true;
          if($len && filesize($fname) != $len )
          {
            // если получили Content-Length и длина закаченного файла
            // не равна длине удаленного файла - ошибка
            $valid = false;
            PrintError('Error: length');
          }
          else
            echo '<BR />OK<BR />';
          if($valid)
          {
            // отправляем по почте только валидный файл
            echo "Post...n";
            flush();
            // подключаем класс mailer для отправки почты
            include('./mailer.php');
            $mail = new mailer();
            $mail->add_body( $HTTP_POST_VARS['body'] );
            $mail->add_attachment('.', $file);
            $mail->build_message('win');
            // отправка письма через SMTP-сервер smtp.myserver.ru
            // на почтовый ящик $email, от <postmaster@myserver.ru>
            // тема письма - $file
            if( $mail->send('smtp.myserver.ru', $email, "<postmaster@myserver.ru>", $file) )
              echo 'OK';
            else
              PrintError('Error');
          }
          // удаляем закаченный файл со своего сервера
          unlink('./' . $file);
        }
        fclose ($fl);
      }
      echo '<BR />End';
    ?>
    
    Данный скрипт можно использовать и для других целей. Вместо простого файла выбираем картинку, пишем сопроводительное письмо, отправляем на нужный адрес и получаем поздравительное послание. В таком виде можно организовать центр рассылки поздравлений.

    В файле, предложенном для скачивания, находятся два скрипта (downmail.php и mailer.php). В связи со вносимыми изменениями, версия в файле может немного отличаться от предложенной в этой статье.
    Скачать >> (rar-архив 4k)

    Замечания и пожелания принимаются.

    Автор: Алимов Рустем
    Источник: www.arkasoft.narod.ru

    Ссылки по теме
    Чтение почты через Web-интерфейс
    Полезные скрипты на PHP
    PHP и формы
    Почтовые функции в РНР
    Отправка электронной почты с помощью PHP
     

    Компьютерная документация от А до Я - Главная

  •  
    Популярные книги

    Photoshop CS2 для пользователя

    Подробнее

    Общая информатика. Универсальный курс

    Подробнее

    Ремонт и обслуживание компьютера дома

    Подробнее


     
    Новости ИТ
    04.12.2008  В Windows 7 запуск приложений Direct3D 10/10.1 будет возможен на CPU
    04.12.2008  eGo BlackBelt и Encrypt - пара новых портативных HDD Iomega с зашитой данных
    04.12.2008  A-DATA выпускает двух- и трёхканальные наборы памяти DDR3-1800+ в серии XPG Plus
    04.12.2008  MOTOROKR EM35
    04.12.2008  Шведский производитель ковриков для мышей выпустил игровую гарнитуру
    04.12.2008  eGo BlackBelt и Encrypt - пара новых портативных HDD Iomega с защитой данных
    04.12.2008  Вышла вторая бета-версия Windows Vista SP2
    04.12.2008  Внешний SSD-накопитель с поддержкой eSATA и USB
    04.12.2008  Флэшка OCZ со встроенным кард-ридером
    04.12.2008  Весрия «ПАУ» 1.8.2 будет содержать новый функционал
    04.12.2008  Компания «Русские Информационные Технологии» подготовила бета-версию программы «Печать конвертов!»
    04.12.2008  Телефон премиум-класса с двумя SIM-картами
    04.12.2008  High-end десктопы Asus Eee Box
    04.12.2008  Видеокарта NVIDIA Quadro FX 4800 для профессионалов
    04.12.2008  Экстремальные внешние HDD от Iomega
    04.12.2008  MSI EX300 - 13.3 дюйма для развлечения
    04.12.2008  SATA 3.0 появится в следующем году
    04.12.2008  Mini-ITX-плата Zotac на основе логики NVIDIA и с поддержкой Wi-Fi
    04.12.2008  Корпус NZXT Zero 2: улучшенное охлаждение и строгий дизайн
    04.12.2008  Конвертеры: Xilisoft Video Converter v.5.1.7.1128
     
    Полезно

     
    Copyright © CompDoc.Ru
    При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
     
    Rambler's Top100