Архив за Сентябрь 2008

Создание файлов Excel средствами PHP

Возникла нужда создавать Excel-файлы средствами PHP. О существовании PEAR::Spreadsheet_Excel_Writer я уже знал - видел статью Создание таблиц Excel средствами PHP на http://phpclub.ru. Поиск в Google помог установить PEAR и Spreadsheet_Excel_Writer. Пример использования класса:

<?php
require_once 'Spreadsheet/Excel/Writer.php';

// We give the path to our file here
$workbook = new Spreadsheet_Excel_Writer('test.xls');

$worksheet =& $workbook->addWorksheet('My first worksheet');

$worksheet->write(0, 0, 'Name');
$worksheet->write(0, 1, 'Age');
$worksheet->write(1, 0, 'John Smith');
$worksheet->write(1, 1, 30);
$worksheet->write(2, 0, 'Johann Schmidt');
$worksheet->write(2, 1, 31);
$worksheet->write(3, 0, 'Juan Herrera');
$worksheet->write(3, 1, 32);

// We still need to explicitly close the workbook
$workbook->close();
?>

Для создания и чтения данных из файлов формата OpenXML (который используется в MS Excel 2007) можно использовать набор библиотек PHPExcel. Для их работы требуется версия PHP 5.2 или выше, с установленными библиотеками Zip, XML и GD2. Пример кода:

<?php
/** Error reporting */
error_reporting(E_ALL);
 
/** Include path **/
ini_set('include_path', ini_get('include_path').';../Classes/');
 
/** PHPExcel */
include 'PHPExcel.php';
 
/** PHPExcel_Writer_Excel2007 */
include 'PHPExcel/Writer/Excel2007.php';
 
// Create new PHPExcel object
echo date('H:i:s') . " Create new PHPExcel object\n";
$objPHPExcel = new PHPExcel();
 
// Set properties
echo date('H:i:s') . " Set properties\n";
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
 
// Add some data
echo date('H:i:s') . " Add some data\n";
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');
 
// Rename sheet
echo date('H:i:s') . " Rename sheet\n";
$objPHPExcel->getActiveSheet()->setTitle('Simple');
    
// Save Excel 2007 file
echo date('H:i:s') . " Write to Excel2007 format\n";
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
 
// Echo done
echo date('H:i:s') . " Done writing file.\r\n";
?>

Наконец, друзья из Индии нам выложили класс Excel Writer. Вот пример его работы:

<?php
    include("excelwriter.inc.php");
   
    $excel=new ExcelWriter("myXls.xls");
   
    if($excel==false)   
        echo $excel->error;
       
    $myArr=array("Name","Last Name","Address","Age");
    $excel->writeLine($myArr);

    $myArr=array("Sriram","Pandit","23 mayur vihar",24);
    $excel->writeLine($myArr);
   
    $excel->writeRow();
    $excel->writeCol("Manoj");
    $excel->writeCol("Tiwari");
    $excel->writeCol("80 Preet Vihar");
    $excel->writeCol(24);
   
    $excel->writeRow();
    $excel->writeCol("Harish");
    $excel->writeCol("Chauhan");
    $excel->writeCol("115 Shyam Park Main");
    $excel->writeCol(22);

    $myArr=array("Tapan","Chauhan","1st Floor Vasundhra",25);
    $excel->writeLine($myArr);
   
    $excel->close();
    echo "data is write into myXls.xls Successfully.";
?>

Отправка писем через SMTP с авторизацией

В этой заметке рассмотрим как отправлять почту через SMTP с авторизацией с помощью PHP. Рассматривать будем вариант отправки именно с авторизацией, так как SMTP-сервер без авторизации — находка для спаммеров. Потому практически на всех серверах существует обязательная авторизация на исходящие сообщения.

Для начала нам необходим почтовый ящик, зарегистрированный на каком-либо сервере, например mail.ru или yandex.ru и, соответственно логин и пароль от этого ящика. Именно с этого адреса будем отправлять сообщение.

Для отправки письма через SMTP будем использовать сокеты.

<?php
$smtp_server = "smtp.mail.ru";
$port = 25;
$mydomain = "myserver.com";
$username = "user";
$password = "password";
$sender = "me@myserver.com";
$recipient = "joe@company.com";
$subject = "test";
$content = "test";

// Initiate connection with the SMTP server
$handle = fsockopen($smtp_server, $port);
fputs($handle, "EHLO $mydomain\r\n");

// SMTP authorization
fputs($handle, "AUTH LOGIN\r\n");
fputs($handle, base64_encode($username)."\r\n");
fputs($handle, base64_encode($password)."\r\n");

// Send out the e-mail
fputs($handle, "MAIL FROM:<$sender>\r\n");
fputs($handle, "RCPT TO:<$recipient>\r\n");
fputs($handle, "DATA\r\n");
fputs($handle, "To: $recipient\r\n");
fputs($handle, "Subject: $subject\r\n");
fputs($handle, "$content\r\n");
fputs($handle, ".\r\n");

// Close connection to SMTP server
fputs($handle, "QUIT\r\n");
?>

Ссылки по теме:

Загрузка файла на сервер с использованием CURL

Для HTTP запроса типа POST существует два варианта передачи полей из HTML форм, а именно, используя алгоритм application/x-www-form-urlencoded и multipart/form-data. Алгоритм первого типа создавался давным-давно, когда в языке HTML еще не предусматривали возможность передачи файлов через HTML формы.

Со временем возникла необходимость через формы отсылать еще и файлы. Тогда консорциум W3C взялся за доработку формата POST запроса. К тому времени уже достаточно широко применялся формат MIME (Multipurpose Internet Mail Extensions — многоцелевые расширения протокола для формирования Mail сообщений), поэтому, чтобы не изобретать велосипед заново, решили использовать часть данного формата формирования сообщений для создания POST запросов в протоколе HTTP.

Главное отличие multipart/form-data от application/x-www-form-urlencoded в том, что тело запроса теперь можно поделить на разделы, которые разделяются границами (boundary). Каждый раздел может иметь свой собственный заголовок для описания данных, которые в нем хранятся, т.е. в одном запросе можно передавать данные различных типов (как в теле письма можно одновременно с текстом передавать файлы).

Это теория. А теперь практика. Используя библиотеку CURL отправим на сервер POST-запрос типа multipart/form-data:

<?php
$upload = 'image.gif';
$postdata = array( 'name' => 'evgenijj',
                   'email' => 'evgenijj@mail.ru',
                   'message' => 'Какое-то сообщение от пользователя evgenijj',
                   'upload' => "@".$upload );

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://server.com/getfile.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_exec($ch);
curl_close($ch);
?>

Файл getfile.php на сервере http://server.com:

<?php
print_r( $_POST );
print_r( $_FILES );
move_uploaded_file ( $_FILES['upload']['tmp_name'], 'image.gif' );
?>

Результат работы:

Array
(
    [name] => evgenijj
    [email] => evgenijj@mail.ru
    [message] => Какое-то сообщение от пользователя evgenijj
)
Array
(
    [upload] => Array
        (
            [name] => image.gif
            [type] => image/gif
            [tmp_name] => C:\WINDOWS\TEMP\php71.tmp
            [error] => 0
            [size] => 100405
        )

)
Array
(
    [url] => http://localhost1/getfile.php
    [content_type] => text/html
    [http_code] => 200
    [header_size] => 193
    [request_size] => 193
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 2.063
    [namelookup_time] => 0
    [connect_time] => 0
    [pretransfer_time] => 0
    [size_upload] => 100943
    [size_download] => 349
    [speed_download] => 169
    [speed_upload] => 48930
    [download_content_length] => 349
    [upload_content_length] => 100943
    [starttransfer_time] => 2
    [redirect_time] => 0
)

Еще один момент: на форуме PHPCLUB.RU встетил упоминание, что может потребоваться указание полного пути файла — иначе CURL выдает ошибку failed creating formpost data.

Ссылки по теме: