Отправка файла методом PUT

Как уже говорилось, отправка файлов на удаленный сервер методом POST через сокеты хороша для файлов маленьких размеров. Для передачи файлов больших размеров лучше применить передачу методом PUT. Для этого воспользуемся библиотекой curl. Для передачи файла методом PUT нам необходимо инициализировать сеанс CURL, задать для сеанса необходимые параметры, выполнить запрос CURL и закрыть сеанс.

Следующий пример демонстрирует передачу файла file.zip серверу B:

<?php
// Задаем скрипт на сайте B, который примет наш запрос и обработает его
$url = 'http://serverB/import.php';

// Указываем файл, который мы хотим передать сайту B
// Если файл находится не в текущей дирректории, то необходимо
// указать путь до файла
$file = 'file.zip';

// Узнаем размер передаваемого файла
$filesize = filesize($file);

// Узнаем имя файла (в случае, если в $file указан полный путь до файла)
$pathinfo = pathinfo($file);
$filename = $pathinfo['basename'];

// Открываем передаваемый файл на чтение
// для дальнейшей его передачи
$fp = fopen($file, 'r');

// Инициализируем сеанс CURL
$ch = curl_init();

// Задаем параметры для открытого сеанса CURL

// Указываем URL скрипта, который примет наш запрос
// К имени скрипта добавляем переменную, содержащую имя передаваемого файла
// Чтобы это имя было доступно в принимающем скрипте из массива $_GET
curl_setopt($ch, CURLOPT_URL, $url . '?filename=' . $filename);

// Указываем файл (а вернее дескриптор открытого на чтение файла), 
// который собираемся передать
curl_setopt($ch, CURLOPT_INFILE, $fp);

// Указываем предполагаемый размер отправляемого файла
curl_setopt($ch, CURLOPT_INFILESIZE, $filesize);

// Указываем, что файл передается методом PUT
curl_setopt($ch, CURLOPT_PUT, true);

// Указываем, что будет производиться закачка на удаленный сервер
curl_setopt($ch, CURLOPT_UPLOAD, true);

// Выполняем запрос CURL
curl_exec($ch);

// Завершаем сеанс CURL
curl_close($ch);
?>

После выполнения этого сценария с сайта A на сайт B уйдет PUT-запрос, в котором будет находится содержимое передаваемого файла, а в GET-запросе будет содержаться название передаваемого файла.

Далее нам необходимо организовать прием файла на сайте B. Для этого в скрипте import.php, находящегося на сайте B, из массива $_GET мы должны получить название файла, а из входного потока — содержимое файла:
<?php
// Определяем имя файла
// Если не определено, задаем как unknow.dat
$filename = (isset($_GET['filename'])) ? $_GET['filename'] : 'unknow.dat';

// Получаем содержимое входящего потока
$content = file_get_contents('php://input');

// Записываем содержимое потока в файл
$file = fopen($filename, 'w+');
fwrite($file, $content);
fclose($file);
?>

Таким методом можно передавать файлы больших объемов.

Стоит также упомянуть, что приведенные выше два способа передачи файлов не являются единственно возможными способами. Например, можно передавать файлы из PHP-скриптов на удаленные сервера по FTP-протоколу (используя тот же CURL или специальные функции PHP, такие как ftp_connect(), ftp_login(), ftp_put() и т.д.). Но ведь доступ к сайту по FTP может быть затруднен (не известны имя пользователя и пароль, или они были изменены на сервере но не изменены в скриптах и т.д.). А указанный здесь способ будет корректно работать на любых типах хостинга.

Также обращаю ваше внимание, что указанные здесь методики освещают возможность загрузки файлов на сервер. Использование их "в чистом виде" без доработки может быть небезопасным, и является потенциальной возможностью для взлома вашего сайта. А именно, отсутствие обработки имени файла, который пришел на сайт B, отсутствие авторизации, определения сайта, посылающего файл, может дать злоумышленнику возможность загрузить и выполнить вредоносный код на вашем сайте. Рассмотрение способов защиты не входит в данную статью и остается на ваше усмотрение.

Добавлено: 27 Мая 2018 07:25:44 Добавил: Андрей Ковальчук

Отправка почты по шаблону на PHP

Пример по созданию и отправке письма на основании шаблонов писем.

<?php
// Подключаем функции.
include_once "lib/mailx.php";
include_once "lib/mailenc.php";
$text = "Well, now, ain't this a surprise?";
$tos = array("Пупкин Василий <pupkin@mail.ru>, Иванов <b@mail.ru>");
$tpl = file_get_contents("mail.eml");
foreach ($tos as $to) {
  $mail = $tpl;
  $mail = strtr($mail, array(
    "{TO}"   => $to,
    "{TEXT}" => $text,
  ));
  $mail = mailenc($mail);
  mailx($mail);
}
?>

lib/mailx.php
<?php
// Функция отправляет письмо, полностью заданное в параметре $mail.
// Корректно обрабатываются заголовки To и Subject.
function mailx($mail) {
  // Разделяем тело сообщения и заголовки.
  list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
  // Выделяем заголовок To.
  $to = "";
  if (preg_match('/^To:\s*([^\r\n]*)[\r\n]*/m', $head, $p)) {
    $to = @$p[1]; // сохраняем
    $head = str_replace($p[0], "", $head); // удаляем из исходной строки
  }
  // Выделяем Subject.
  $subject = "";  
  if (preg_match('/^Subject:\s*([^\r\n]*)[\r\n]*/m', $head, $p)) {
    $subject = @$p[1];
    $head = str_replace($p[0], "", $head);
  }
  // Отправляем почту. Внимание! Опасный прием!
  mail($to, $subject, $body, trim($head));
}
?>

lib/mailenc.php
<?php
// Корректно кодирует все заголовки в письме $mail с использованием 
// метода base64. Кодировка письма определяется автоматически на основе
// заголовка Content-type. Возвращает полученное письмо.
function mailenc($mail) {
  // Разделяем тело сообщения и заголовки.
  list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
  // Определяем кодировку письма по заголовку Content-type.
  $encoding = '';
  $re = '/^Content-type:\s*\S+\s*;\s*charset\s*=\s*(\S+)/mi';
  if (preg_match($re, $head, $p)) $encoding = $p[1];
  // Проходимся по всем строкам-заголовкам.
  $newhead = "";
  foreach (preg_split('/\r?\n/s', $head) as $line) {
    // Кодируем очередной заголовок.
    $line = mailenc_header($line, $encoding);
    $newhead .= "$line\r\n";
  }
  // Формируем окончательный результат.
  return "$newhead\r\n$body";
}

// Кодирует в строке максимально возможную последовательность
// символов, начинающуюся с недопустимого символа и НЕ 
// включающую E-mail (адреса E-mail обрамляют символами < и >).
// Если в строке нет ни одного недопустимого символа, преобразование
// не производится.
function mailenc_header($header, $encoding) {
  // Кодировка не задана - делать нечего.
  if (!$encoding) return $header;
  // Сохраняем кодировку в глобальной переменной. Без использования
  // ООП это - единственный способ передать дополнительный параметр
  // callback-функции.
  $GLOBALS['mail_enc_header_encoding'] = $encoding;
  return preg_replace_callback(
    '/([\x7F-\xFF][^<>\r\n]*)/s',
    'mailenc_header_callback',
    $header
  );
}

// Служебная функция для использования в preg_replace_callback(). 
function mailenc_header_callback($p) {
  $encoding = $GLOBALS['mail_enc_header_encoding'];
  // Пробелы в конце оставляем незакодированными.
  preg_match('/^(.*?)(\s*)$/s', $p[1], $sp);
  return "=?$encoding?B?".base64_encode($sp[1])."?=".$sp[2];
}
?>


mail.eml - шаблон письма
From: Почтовый робот <somebody@mail.ru>
To: {TO}
Subject: Добрый день!
Content-type: text/plain;
charset=windows-1251

Привет, {TO}!
{TEXT}

Это сообщение сгенерировано роботом - не отвечайте на него.

Добавлено: 27 Мая 2018 07:24:12 Добавил: Андрей Ковальчук

Отправка писем на php. Сборник рецептов

Отправка писем в php осуществляется с помощью функции mail()

mail(to, subject, message, mailheaders);

to - емайл получателя
subject - заголовок письма
message - текст письма, сообщение
mailheaders - почтовые заголовки

Отправка обычного текстового письма
Это самый простой способ отправки писем. Вы просто указываете емайл получателя, отправителя и формат text/plain в заголовке. Далее идет пример
<?php
$to = "rockbattle@mail.ru"; // емайл получателя

$subject = "Проверка отправки писем"; // тема письма

$message = "Здравствуйте Если вы читаете это письмо значит все ок Почтовый робот"; // текст сообщения

$mailheaders = "Content-type:text/plain;charset=windows-1251rn"; // почтовый заголовок, указывает формат письма - текстовый и кодировку

$mailheaders .= "From: SiteRobot <noreply@siterobot.ru>rn"; // почтовый заголовок, указывает емайл отправителя

$mailheaders .= "Reply-To: noreply@siterobot.rurn"; // почтовый заголовок, указывает емайл для ответа // лучше если емайл для ответа совпадает с емайлом отправителя, иначе некоторые почтовые сервисы могут классифицировать письмо как спам

mail($to, $subject, $message, $mailheaders); // отправляем письмо

Отправка html-письма, в которое можно вставлять таблицы, рисунки, различные шрифты, стили оформления
Отправка писем в html формате почти ничем не отличается от отправки писем в текстовом формате. В заголовке вы указываете формат письма text/html а в самом письме вместо обычного текста помещаете html-код.

Рассмотрим на примере
<?php
$to = "rockbattle@mail.ru"; 
// емайл получателя

$subject = "Проверка отправки писем"; 
// тема письма

$message = "Здравствуйте<br><br>Если вы это читаете значит все ок <br><br>Почтовый робот "; 
// текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п.
$mailheaders = "Content-type:text/html;charset=windows-1251rn"; 
// формат письма html

$mailheaders .= "From: SiteRobot <noreply@siterobot.ru>rn"; 
$mailheaders .= "Reply-To: noreply@siterobot.rurn"; 
// емайл отправителя и емайл для ответа

mail($to, $subject, $message, $mailheaders);
// отправляем письмо

?>

Отправка письма с вложением
Чтобы прикрепить файл к письму потребуется немного более длинный код, но это тоже довольно просто. В приведенном далее коде пропишите имя вашего файла который вы хотите отправить а также его расположение
<?php 
$to = "rockbattle@mail.ru"; 
// емайл получателя

$subject = "Письмо с вложением"; 
// тема письма

$message = "Здравствуйте
Если с этим письмом вы получили прикрепленный файл значит все ок 
Почтовый робот "; 
// текст сообщения

$filename = "file.doc";
// название файла

$filepath = "files/file.doc"; 
// месторасположение файла

// письмо с вложением состоит из нескольких частей, которые разделяются разделителем

$boundary = "--".md5(uniqid(time())); 
// генерируем разделитель 
$mailheaders = "MIME-Version: 1.0n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary="$boundary"n"; 
// разделитель указывается в заголовке в параметре boundary

$mailheaders .= "From: SiteRobot <noreply@siterobot.ru>rn"; 
$mailheaders .= "Reply-To: noreply@siterobot.rurn";


$multipart = "--$boundaryn"; 
$multipart .= "Content-Type: text/plain; charset=windows-1251nn"; 
$multipart .= "$messagenn";

// первая часть само сообщение

$fp = fopen($filepath,"r"); 
if (!$fp) 
{ 
print "Файл не может быть прочитан"; 
exit(); 
}

$file = fread($fp, filesize($filepath)); 
fclose($fp);

// чтение файла

$message_part = "--$boundaryn"; 
$message_part .= "Content-Type: application/octet-stream; name = "".$filename.""n"; 
$message_part .= "Content-Transfer-Encoding: base64n"; 
$message_part .= "Content-Disposition: attachment; filename = "".$filename.""nn"; 
$message_part .= chunk_split(base64_encode($file))."n";

// второй частью прикрепляем файл, можно прикрепить два и более файла
$multipart .= $message_part;

mail($to,$subject,$multipart,$mailheaders);
// отправляем письмо

?>

Отправка писем сразу нескольким адресатам
Чтобы отправить письмо сразу нескольким адресатам, лучше всего использовать заголовок Bcc: который отправляет копию письма на указанный емайл

Например
<?php
$to = "rockbattle@mail.ru"; 
// емайл получателя

$subject = "Проверка отправки писем"; 
// тема письма

$message = "Здравствуйте
Если вы читаете это письмо значит все ок
Почтовый робот"; 
// текст сообщения

$mailheaders = "Content-type:text/plain;charset=windows-1251rn"; 
$mailheaders .= "From: SiteRobot <noreply@siterobot.ru>rn"; 
$mailheaders .= "Reply-To: noreply@siterobot.rurn"; 
// почтовые заголовки

$mailheaders .= "Bcc: email1@mail.rurn"; 
$mailheaders .= "Bcc: email2@mail.rurn"; 
$mailheaders .= "Bcc: email3@mail.rurn"; 
// заголовков Bcc может быть неограниченное количество

mail($to, $subject, $message, $mailheaders);
// отправляем письмо

?>

Добавлено: 27 Мая 2018 07:22:36 Добавил: Андрей Ковальчук

Отправка почты по шаблону минуя SMTP-сервер провайдера на PHP

Пример по созданию и отправке письма на основании активного шаблона письма минуя SMTP-сервер провайдера.

<?php
// Посылка почты вручную, минуя SMTP-сервер провайдера.
include_once "lib/getmxrr.php";
include_once "lib/template.php";
include_once "lib/mailenc.php";
include_once "lib/mailx.php";
include_once "lib/socketmail.php";

$mail = template("mail.php.eml", array(
  "to"   => "Кто-то очень страшный <somebody@thematrix.com>", 
  "text" => "Проверка слуха!"
));
$mail = mailenc($mail);
mailx_manual($mail, $reason)
  or die("Errors:<br>".join("<br>", $reason));
echo "Почта отослана.";
?>

lib/getmxrr.php - эмуляция функции getmxrr(), которая не работает на Windows хостинге
<?php
if (!function_exists("getmxrr")) {
  function getmxrr($hostname, &$hosts, &$weights=false) {
    $hosts = $weights = array();
    // Не идеальный способ, но работающий: используется внешняя
    // программа nslookup, доступная в WIndows NT/2000/XP/2003.
    exec("nslookup -type=mx $hostname", $result);
    // Построчно перебираем ответ утилиты.
    foreach ($result as $line) {
      // Выделяем имя почтового сервера.
      if (preg_match('/mail\s+exchanger\s*=\s*(\S+)/', $line, $pock)) {
        $hosts[] = $pock[1];
        // Также выделяем вес.
        if (preg_match("/MX\s+preference\s*=\s*(\d+)/", $line, $pock))
          $weights[] = $pock[1];
        else
          $weights[] = 0;
      }
    }
    return count($hosts) > 0;
  }
}
// В PHP5 появился синоним для getmxrr() - его мы тоже эмулируем.
if (!function_exists("dns_get_mx")) {
  function dns_get_mx($hostname, &$hosts, &$weights) {
    return getmxrr($hostname, $hosts, $weights);
  }
}
?>

lib/template.php - Обработка шаблона.
<?php
// Функция делает то же самое, что инструкция include, однако 
// блокирует вывод текста в браузер. Вместо этого текст возвращается
// в качестве результата. Функцию можно использовать, например,
// для обработки почтовых шаблонов.
function template($__fname, $vars) {
  // Перехватываем выходной поток.
  ob_start();
    // Запускаем файл как программу на PHP.
    extract($vars, EXTR_OVERWRITE);
    include($__fname);
  // Получаем перехваченный текст.  
  $text = ob_get_contents();
  ob_end_clean();
  return $text;
}
?>

lib/mailx.php
<?php
// Функция отправляет письмо, полностью заданное в параметре $mail.
// Корректно обрабатываются заголовки To и Subject.
function mailx($mail) {
  // Разделяем тело сообщения и заголовки.
  list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
  // Выделяем заголовок To.
  $to = "";
  if (preg_match('/^To:\s*([^\r\n]*)[\r\n]*/m', $head, $p)) {
    $to = @$p[1]; // сохраняем
    $head = str_replace($p[0], "", $head); // удаляем из исходной строки
  }
  // Выделяем Subject.
  $subject = "";  
  if (preg_match('/^Subject:\s*([^\r\n]*)[\r\n]*/m', $head, $p)) {
    $subject = @$p[1];
    $head = str_replace($p[0], "", $head);
  }
  // Отправляем почту. Внимание! Опасный прием!
  mail($to, $subject, $body, trim($head));
}
?>

lib/mailenc.php
<?php
// Корректно кодирует все заголовки в письме $mail с использованием 
// метода base64. Кодировка письма определяется автоматически на основе
// заголовка Content-type. Возвращает полученное письмо.
function mailenc($mail) {
  // Разделяем тело сообщения и заголовки.
  list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
  // Определяем кодировку письма по заголовку Content-type.
  $encoding = '';
  $re = '/^Content-type:\s*\S+\s*;\s*charset\s*=\s*(\S+)/mi';
  if (preg_match($re, $head, $p)) $encoding = $p[1];
  // Проходимся по всем строкам-заголовкам.
  $newhead = "";
  foreach (preg_split('/\r?\n/s', $head) as $line) {
    // Кодируем очередной заголовок.
    $line = mailenc_header($line, $encoding);
    $newhead .= "$line\r\n";
  }
  // Формируем окончательный результат.
  return "$newhead\r\n$body";
}

// Кодирует в строке максимально возможную последовательность
// символов, начинающуюся с недопустимого символа и НЕ 
// включающую E-mail (адреса E-mail обрамляют символами < и >).
// Если в строке нет ни одного недопустимого символа, преобразование
// не производится.
function mailenc_header($header, $encoding) {
  // Кодировка не задана - делать нечего.
  if (!$encoding) return $header;
  // Сохраняем кодировку в глобальной переменной. Без использования
  // ООП это - единственный способ передать дополнительный параметр
  // callback-функции.
  $GLOBALS['mail_enc_header_encoding'] = $encoding;
  return preg_replace_callback(
    '/([\x7F-\xFF][^<>\r\n]*)/s',
    'mailenc_header_callback',
    $header
  );
}

// Служебная функция для использования в preg_replace_callback(). 
function mailenc_header_callback($p) {
  $encoding = $GLOBALS['mail_enc_header_encoding'];
  // Пробелы в конце оставляем незакодированными.
  preg_match('/^(.*?)(\s*)$/s', $p[1], $sp);
  return "=?$encoding?B?".base64_encode($sp[1])."?=".$sp[2];
}
?>

lib/socketmail.php
<?php
// Функция для посылки почты вручную, минуя SMTP-сервер провайдера.
// Использует getmxrr(), которая в Windows не поддерживается. 
function mailx_manual($mail, &$reason=false) {
  $reason = array();
  // Выделяем заголовок To.
  $to = "";
  if (preg_match('/^To:\s*([^\r\n]*)[\r\n]*/m', $mail, $p)) {
    $to = @$p[1]; // сохраняем
  }
  // Вначале выделяем имя хоста.
  if (!preg_match('/@([\w.-]*)/', $to, $pockets)) {
    $reason[] = "invalid e-mail address - $to: no host";
    return false;
  }
  $host = $pockets[1];
  // По стандарту SMTP, если нет ни одной MX-записи, то в качестве
  // почтового сервера выступает сам хост.
  if (!getmxrr($host, $mxes, &$weights)) {
    $mxes = array($host);
  }
  // Проходимся по всем MX-записям. Для простоты веса не 
  // учитываем - большой беды от этого не будет.
  foreach ($mxes as $mx) {
    $result = socketmail($mx, $mail, $r);
    $reason = array_merge($reason, $r);        
    // Если письмо отослано, все сделано.
    if ($result) return true;
  }
  $reason[] = "could not connect to any of (".join(", ", $mxes).")";
  return false;
}

// Функция открывает соединение с SMTP-сервером $host
// и пытается отправить через него письма, заданные в $mails.
// Все ошибки накапливаются в необязательной переменной $reason
// в виде списка строк. В случае, если отправка всех писем
// прошла успешно, функция возвращает true, иначе - false.
// Каждое письмо в $mails должно быть представлено в формате:
// "Заголовки\r\n\r\nТело". Функция не заботится о правильном
// кодировании заголовков, предполагая, что это уже было 
// сделано ранее.
function socketmail($host, $mails, &$reason=false) { 
  // Открываем соединение с почтовым сервером.
  $reason = array();
  $f = @fsockopen($host, 25, $errno, $errstr, 30);
  if (!$f) {
    $reason[] = "could not open $host:25"; 
    return false;
  }
  $answer = fgets($f, 1024); 

  // Сигнализируем о начале обмена данными.
  fputs($f, "HELO {$_SERVER['SERVER_NAME']}\r\n"); 
  $answer = fgets($f, 1024); 

  // Отправляем все письма для этого сервера в цикле.
  // Все это происходит за одно соединение с сервером.
  if (!is_array($mails)) $mails = array($mails);
  foreach ($mails as $i=>$data) { 
    // Получаем заголовки и тело сообщения.
    list ($headers, $body) = preg_split('/\r?\n\r?\n/', $data, 2);
    // Получаем заголовок From.
    if (!preg_match('/^From:\s*(.*)/mi', $headers, $pockets)) {
      $reason[] = "could not find required From: header in mail #$i";
      continue;
    }
    $from = getEmail($pockets[1]);    
    if (!$from) {
      $reason[] = "no email in From: header in mail #$i";
      continue;
    }
    // Получаем заголовок To.
    if (!preg_match('/^To:\s*(.*)/mi', $headers, $pockets)) {
      $reason[] = "could not find required To: header in mail #$i";
      continue;
    }
    $to = getEmail($pockets[1]);
    if (!$to) {
      $reason[] = "no email in To: header in mail #$i";
      continue;
    }
    // Т.к. точка в протоколе SMTP свидетельствует о конце данных,
    // (см. ниже), мы ее удваиваем.
    $data = preg_replace("/\n\./", "\n..", $data);
    // Отправляем управляющие команды SMTP.
    do {
      if (!smtp_say($f, "MAIL FROM: <$from>", $reason)) break; 
      if (!smtp_say($f, "RCPT TO: <$to>", $reason)) break; 
      if (!smtp_say($f, "DATA", $reason)) break;  
      // Печатаем данные.
      fputs($f, trim($data)."\r\n");
      if (!smtp_say($f, ".", $reason)) break;  
    } while (false);
    // Конец письма.
    !smtp_say($f, "RSET", $reason);
  } 

  // Говорим серверу об окончании работы.
  @smtp_say($f, "QUIT", $reason);
  fclose($f); 
  return !count($reason);
}

function smtp_say($f, $cmd, &$reason) {
  fputs($f, "$cmd\r\n"); 
  $answer = fgets($f, 1024); 
#  echo "&gt; $cmd<br>&lt; $answer<br>";
  if (!preg_match('/^(250|354|221)/', $answer)) { $reason[] = "$answer"; return; }
  return true;
}

// Извлекает первый адрес E-mail из заголовка To или From.
// Внимание: упрощенная версия!
function getEmail($header) {
  if (!preg_match('/([\w.-]+@[\w.-]+)/s', $header, $p)) return;
  return $p[1];
}
?>

Добавлено: 24 Мая 2018 19:44:11 Добавил: Андрей Ковальчук

Обратная связь на php

Начнём с html

<form action="" method="POST">
<?php echo $err ?>
<table width="40%" cellspacing="0" cellpadding="0" border="0" style="margin:20% auto;">
    <tr>
        <td class="bold">Имя</td>
        <td><input type="text" name="name"/></td>
    </tr>
    <tr>
        <td class="bold">Email</td>
        <td><input type="text" name="email"/></td>
    </tr>
    <tr>
        <td class="bold">Сообщения</td>
        <td><textarea name="text"></textarea></td>
    </tr>
    <tr>
        <td></td>
        <td><input type="submit" name="submit" value="Отправить"/></td>
    </tr>
</table>
 
</form>

В принципе всё просто и объяснений не чего не требует.
А вот теперь и php
if(isset($_POST['submit'])){
             
    if(!@preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $_POST['email'])) $err = 'Неверный email';
        elseif(@strlen($_POST['text']) < 1) $err = 'Сообщения пустое';
            else{
                             
                $message = 'Email: '.$_POST['email']."
        ";
                $message .= 'Name: '.$_POST['name']."
        ";
                $message .= 'Text: '.$_POST['text']."
        ";
                             
                mail('info@site.com', 'Обратная связь', $message);
                $err = 'Ваше сообщения успешно отправлено';
            }
}

isset($_POST['submit']) - По нажатию кнопки
preg_match - Регулярное выражения для проверки email адреса
@strlen($_POST['text']) < 1 - Проверка кол-во символов в тексте
mail() - Отправка письма, первый параметр email куда посылаем письмо, второй заголовок письма, а третий само сообщения, есть ещё и четвёртый параметр, настройки, но мы его не будет использовать.
Вот так просто сделать обратную связь.

Добавлено: 20 Мая 2018 21:28:12 Добавил: Андрей Ковальчук

Отправка писем

В этой статье, я хочу рассказать, о том как можно отправлять письма с сайта средствами php. Для этого нам понадобится всего-лишь одна функция — mail(). Смысла что-либо описывать я не вижу, поэтому просто приведу код с подробными комментариями.

<?php
     // массив получателей письма
    $arrayTo = array(
        'test1@test.com', 
        'test2@test.com', 
        'test3@test.com'
    );
    $strTo = implode(",", $arrayTo); // переводим массив в строку
    $subject = "Тестовое письмо"; // Задаем тему письма
    // тело письма. Тут может быть как просто текст, так и html код
    $message = '
        <html>
            <head>
                <title>Тестовое письмо</title>
            </head>
            <body>
                <p>Текст письма</p>
            </body>
        </html>
    ';
    // заголовок письма
    $headers= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n"; // кодировка письма
    $headers .= "From: Тестовое письмо <no-reply@test.com>\r\n"; // от кого письмо
    // отправляем письмо 
    mail($strTo, $subject, $message, $headers);
?>

Добавлено: 19 Мая 2018 21:10:22 Добавил: Андрей Ковальчук

Отправка электронных писем с подменой E-mail адреса

Наверно многие задумывались над вопросом: можно ли отправить письмо с подменой адреса E-mail, чтобы, к примеру, подшутить над своим товарищем или подругой. Отвечаю - можно, причем очень легко с помощью стандартных средств PHP.

Недавно решил написать такой скрипт с возможностью множественной рассылки. Ниже привожу исходники скрипта. Кому лень смотреть на сайте, можно Скачать их в архиве.

Собственно, можете посмотреть, как это работает по ссылке нижу

Скрипт для оправки писем с подменой E-mail адреса

Сам скрипт состоит из 4-х файлов. functions.php - основной функционал скрипта. config.php - данные для доступа к базе данных для вставки туда всех адресов. index.php - форма для отправки и style.css - таблица стилей, чтоб красиво было.

Листинг functions.php

<?php 
    require_once 'config.php'; 
    function connect_to_db ($db_host, $db_user, $db_pass, $db_name, $db_charset) 
    { 
        $mysql_connect = mysql_connect($db_host, $db_user, $db_pass); 
        if ($mysql_connect) { 
            $select_db = mysql_select_db($db_name); 
            if ($select_db) { 
                $q = "SET NAMES $db_charset"; 
                $set_names = mysql_query($q); 
                return true; 
            } else { 
                $mysql_error = "На сервере не найдено базы данных с именем ".$db_name; 
                exit ($mysql_error()); 
            } 
        } else { 
            $mysql_error = "Ошибка связи с сервером базы данных"; 
            exit ($mysql_error()); 
        } 
        return false; 
    } 
    $db = connect_to_db ($db_host, $db_user, $db_pass, $db_name, $db_charset); 
    header ('Content-Type: text/html; charset=UTF-8'); 
    function post_data_is_valid () 
    { 
        if (isset($_POST['from'])) { 
            $from = trim($_POST['from']); 
            $form = strtolower($from); 
            if (!preg_match('/^[a-z0-9_\.-]+@[a-z0-9_\.-]+\.[a-z\.]{2,6}$/', $from)) { 
                return '<script>alert(\'Неправильно заполнено поле "E-mail отправителя"\')</script>'; 
            } 
        } else 
            return false; 
 
        if (isset($_POST['name'])) { 
            $name = trim($_POST['name']); 
            if (!preg_match('/^.{3,30}$/', $name)) { 
                return '<script>alert(\'Неправильно заполнено поле "Имя отправителя"\')</script>'; 
            } 
        } else 
            return false; 
 
        if (isset($_POST['subject'])) { 
            $subject = trim($_POST['subject']); 
            if (!preg_match('/^.{3,128}$/', $subject)) { 
                return '<script>alert(\'Неправильно заполнено поле "Тема письма"\')</script>'; 
            } 
        } else 
            return false; 
 
 
        if (isset($_POST['to'])) { 
            $to = trim($_POST['to']); 
            $to = strtolower($to); 
            if (!preg_match_all('/ *[a-z0-9_\.-]{2,30}@[a-z0-9_\.-]{2,20}\.[a-z\.]{2,6} */', $to, $mail_list)) { 
                return '<script>alert(\'В списке не найдено ни одного корректного адреса E-mail"\')</script>'; 
            } else { 
                $to = array(); 
                foreach ($mail_list[0] as $key => $value) { 
                    $to[$key] = $value; 
                    $to[$key] = trim($to[$key]); 
                } 
            } 
        } else 
            return false; 
 
        if (isset($_POST['message_type'])) { 
            $message_type = trim($_POST['message_type']); 
            if ($message_type == 'text') 
                $content_type = 'Content-Type: text/plain; charset=UTF-8' . "
"; 
            else 
                if ($message_type == 'html') 
                    $content_type = 'Content-Type: text/html; charset=UTF-8' . "
"; 
 
        } else 
            return false; 
 
        if (isset($_POST['message'])) { 
            $message = trim($_POST['message']); 
            $message = stripslashes($message); 
            if (strlen($message) < 3 || strlen($message) > 4096) { 
                return '<script>alert(\'Неправильно заполнено поле "Текст письма"\')</script>'; 
            } 
        } else 
            return false; 
 
        return  array ( 
 
            'from' => $from, 
            'name' => $name, 
            'subject' => $subject, 
            'message' => $message, 
            'to' => $to, 
            'content_type' => $content_type 
        ); 
    } 
    function add_mail_to_db ($email) 
    { 
        $email = trim($email); 
        $email = htmlspecialchars($email); 
        $email = mysql_real_escape_string($email); 
        $last_used = date("Y-m-d H:i:s"); 
        $q = mysql_query ("SELECT `id` FROM `e-mails` WHERE `e-mail`='$email' LIMIT 1"); 
        if (mysql_num_rows($q) > 0) 
            $q = "UPDATE `e-mails` SET `last_used`='$last_used' WHERE `e-mail`='$email' LIMIT 1"; 
        else 
            $q = "INSERT INTO `e-mails` (`e-mail`, `last_used`) VALUES ('$email', '$last_used')"; 
        $result = mysql_query($q); 
        if (!$result) 
            return false; 
        return true; 
    } 
    function sent_post_from_fake_mail ($from, $name, $subject, $message, $to, $content_type) 
    { 
        $sent_status = mail ($to, $subject, $message, $content_type . "From: $name <$from>
"); 
        if ($sent_status !== false) 
            return true; 
        else 
            return false; 
    } 
 
    function input_value ($field_name) 
    { 
        if (isset($_POST[$field_name])) 
            return ' value="'.$_POST[$field_name].'"'; 
    } 
 
    function textarea_value () 
    { 
        if (isset($_POST['message'])) 
            return stripslashes($_POST['message']); 
    } 
 
    function textarea_mail_values () 
    { 
        if (isset($_POST['to'])) 
            return trim($_POST['to']); 
    }    
 
    function radio_checked ($value) 
    { 
        if (isset($_POST['message_type']) && $_POST['message_type'] == $value) 
            return ' checked'; 
        else 
            if ($value == 'text') 
                return ' checked'; 
    } 
    $alert = ''; 
    $textarea_mail_list = ''; 
    if (isset($_GET['do']) && $_GET['do'] == 'sent') 
        if (post_data_is_valid ()) { 
            if (isset($_COOKIE['sent']) && $_COOKIE['sent'] == 'true') 
                $alert = '<script>alert(\'Рассылать письма можно только 1 раз в 5 минут\')</script>'; 
            else { 
                $sent_data = post_data_is_valid (); 
                if (!is_array($sent_data) && $sent_data !== false) 
                    $alert = $sent_data; 
                else { 
                    $success = 0; 
                    $failed = 0; 
                    $sent_data['to'] = array_unique($sent_data['to']); 
                    foreach ($sent_data['to'] as $to) { 
                            add_mail_to_db ($to); 
                        $sent_status = sent_post_from_fake_mail ($sent_data['from'], $sent_data['name'], $sent_data['subject'], $sent_data['message'], $to, $sent_data['content_type']); 
 
                        if (!$sent_status) 
                            $failed++; 
                        else { 
                            $success++; 
                        } 
                    } 
                    if ($success === 0) 
                        $alert = '<script>alert(\'Рассылка завершилась неудачей. Попробуйте повторить попытку через 30 минут\')</script>';    
                    else { 
                        setcookie('sent', 'true', time() + 300); 
                        $alert = '<script>alert(\'Рассылка законечена. Успешно отправлено: '.$success.' писем. Завершились неудачей: '.$failed.' рассылок\')</script>'; 
                    } 
                } 
            } 
        } 
?>

Листинг config.php
<?php 
    $db_host = 'localhost'; 
    $db_user = 'Пользователь БД'; 
    $db_pass = 'Пароль БД'; 
    $db_name = 'Имя базы'; 
    $db_charset = 'utf8'; 
?>

Листинг index.php
<?php require_once 'functions.php'; ?> 
<!doctype html> 
<html> 
    <head> 
        <meta charset="utf-8"> 
        <title>Анонимная отправка писем с любого почтового ящика</title> 
        <meta name="description" content="Онлайн-сервис для анонимной отправки писем с любого почтового ящика"> 
        <meta name="keywords" content="отправка писем, фальшивый ящик, анонимная отправка писем, фальшивая почта, подделка e-mail"> 
        <link rel="stylesheet" href="style.css"> 
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script> 
        <script type="text/javascript"> 
            function diplay_hide (blockId) 
            {
                if ($(blockId).css('display') == 'none')
                    $(blockId).animate({height: 'show'}, 500);
                else
                    $(blockId).animate({height: 'hide'}, 500);
            }
        </script>    
    </head> 
    <body> 
        <a class="share" href="javascript:void(0)" onclick="diplay_hide('#share');">Код для сайта</a> 
        <textarea id="share" style="display: none;" readonly><a href="http://<?=$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']?>">Отправить письмо с поддельного E-mail адреса</a></textarea> 
        <section id="wrap"> 
            <h1>Отправить письмо с любого адреса</h1> 
            <form action="?do=sent" method="post"> 
                <input class="textbox" type="text" name="from"<?=input_value('from');?> placeholder="E-mail отправителя">
                <input class="textbox" type="text" name="name"<?=input_value('name');?> placeholder="Имя отправителя">
                <input class="textbox" type="text" name="subject"<?=input_value('subject');?> placeholder="Тема письма">
                <textarea name="to" placeholder="Список E-mail адресов для рассылки. Каждый адрес должен начинаться с новой строки."><?=textarea_mail_values();?></textarea> 
                <span>Формат письма: </span> 
                <input id="text_t" class="radiobox" type="radio" name="message_type" value="text"<?=radio_checked ('text');?>>
                <label for="text_t">Текст</label> 
                <input id="html_t" class="radiobox" type="radio" name="message_type" value="html"<?=radio_checked ('html');?>>
                <label for="html_t">HTML</label> 
                <textarea name="message" placeholder="Текст письма"><?=textarea_value();?></textarea> 
                <button type="submit">Послать письмо</button> 
            </form> 
            <footer> 
                <p>Сервис разрабатывался как программа-шутка исключительно для ознакомительных целей. Администрация сайта не несет никакой ответственности за дейстия пользователей.</p>        
            </footer> 
            <?=$alert?> 
        </section> 
    </body> 
</html>

Листинг style.css
html { 
    background: #fcf8e4; 
} 
h1 { 
    color: #333; 
    font-size: 18px; 
    font-weight: normal; 
    text-align: center; 
} 
#wrap { 
    width: 400px; 
    margin: 50px auto; 
    text-align: center; 
} 
input { 
    width: 100%; 
    padding: 5px; 
    margin-bottom: 5px; 
    font-family: Tahoma, Verdana; 
    font-size: 14px; 
} 
input.textbox { 
    border: 1px solid #626262; 
    --moz-border-radius: 3px; 
    --webkit-border-radius: 3px; 
    border-radius: 3px; 
} 
input.textbox:-moz-placeholder { 
    color: #333; 
} 
input.textbox::-webkit-input-placeholder { 
    color: #333; 
} 
textarea { 
    width: 100%; 
    height: 150px; 
    margin: 8px 0; 
    padding: 5px; 
    font-family: Tahoma, Verdana; 
    font-size: 14px; 
    border: 1px solid #626262; 
    --moz-border-radius: 3px; 
    --webkit-border-radius: 3px; 
    border-radius: 3px; 
} 
textarea:-moz-placeholder { 
                color: #333; 
            } 
textarea::-webkit-input-placeholder { 
                color: #333; 
            } 
button { 
    width: 415px; 
    height: 70px; 
    margin: 5px 0; 
} 
footer p { 
    font-family: Tahoma, Verdana; 
    font-size: 11px; 
    text-align: left; 
    color: #cc0000; 
    margin-left: 30px; 
    margin-top: 30px; 
} 
a.share { 
    position: absolute; 
    top: 10px; 
    left: 10px; 
    font-family: Tahoma, Verdana; 
    text-decoration: none; 
    border-bottom: 1px dashed #222; 
    color: #000; 
    font-weight: bold; 
    font-size: 12px; 
} 
textarea#share { 
    position: absolute; 
    top: 20px; 
    left: 10px; 
    width: 400px; 
    height: 45px; 
    font-family: "Courier New", Consolas; 
    font-size: 13px; 
} 
label { 
    font-family: Tahoma, Verdana; 
    font-size: 12px; 
    cursor: pointer; 
} 
form span { 
    font-family: Tahoma, Verdana; 
    font-size: 12px; 
} 
.radiobox { 
    margin-top: 5px; 
}

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

Добавлено: 12 Мая 2018 07:55:55 Добавил: Андрей Ковальчук

Отправка файлов аттачем

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

Я написал класс (точнее, если быть честным - это стандартное решение подобной проблемы. Вы можете найти такой же класс на php.spb.ru. Я не стал переписывать его без изменений, а немного переработал творчески.

Итак исходный код класса с комментариями:

<?
class multi_mail
{
var $from;  // Отправитель
var $to;    // Получатель
var $headers; // Заголовок сообщения
var $body;  // Тело сообщения


function multi_mail()     // Конструктор класса
// Проводим инициализацию переменных
{
$this -> from = "";
$this -> to = "";
$this -> body = "";
$this -> headers = Array();
$this -> subject = "";
}

// Присоединяем файл
function attach_file($file_name = "" , // Имя файла
$file_content,    // Содержимое файла
$encoding_type = "application/octet-stream" 
//Тип кодировки данных.
)
{
$this -> headers[] = array(         // Записываем заголовочную информацию.
"name" => $file_name,
"content" => $file_content,
"encode" => $encoding_type
);
}

function build_letter($header)     
// Строим Часть письма, будь то аттаченный файл или простой текст
{
$letter = $header["content"];
if ($header["encode"] != "text/plain"):
$letter = chunk_split(base64_encode($letter));
$encoding = "base64";
else:
$encoding = $header["encode"];
endif;
return "Content-Type: ".$header["encode"].
($header["name"]? ".; name = \"".$header["name"]."\"" : "")
."\r\nContent-Transfer-Encoding:
$encoding\r\n\r\n$letter\n";
}

function set_multipart_mail() // Собираем письмо из разрозненных частей
{
$boundary = 'b'.md5(uniqid(time())); 
// Создаем уникальное число, служащее индетификатором для чати письма

$multipart = "Content-Type: multipart/mixed;
boundary =$boundary\n\nThis is a MIME encoded letter\r\n\r\n--$boundary";
for($step = sizeof($this->headers)-1; $step >=0; $step--)
{
$multipart .= "\r\n".$this->build_letter($this->headers[$step])."--$boundary";
// Вставляем содержимое межу метками
}
return $multipart .= "--\r\n";
}

function get_full_message()
// Вставляем тело письма (текстовую начинку) и все файлы
// на выходе получаем полное писмо (одна большая строка :)))
{
$mime = "";
if (!empty($this->from)):
$mime .= "From: ".$this->from." \r\n";
endif;
if (!empty($this->body)):
$this -> attach_file("",$this->body,"text/plain");
$mime .= "MIME-Version: 1.0\r\n".$this->set_multipart_mail();
endif;

return $mime;
}


function send_mail()        // Собственно посыл письма
{
$mime = $this -> get_full_message(false);
mail($this->to,$this->subject,"",$mime);
}
}
?>

Уложив этот класс в отдельный файл, Вы можете использовать его где угодно.

Добавлено: 11 Мая 2018 11:17:18 Добавил: Андрей Ковальчук

Отправка писем с картинками на php

Отправка писем с картинками на php Тема отправки писем очень часто встречается в повседневной жизни web-разработчиков, и я не могу оставить ее без внимания. Раньше я уже публиковал пару статей про отправку писем, но хочу написать еще одну. В этой статье я покажу как можно отправлять письма с html-версткой, в которой присутствуют картинки.
Если два способа отображения картинок в письме — подгружать картинки с сайта и отправлять картинки в письме. Первый способ — подгрузка с сайта, проще, но в нем возникают проблемы — не все почтовые агенты отображают содержимое, которое подтягивается с сайтов, картинки блокируются. В таком случае пользователю, чтобы увидеть картинки в письме, нужно будет постоянно разблокировать содержимое письма — это не удобно.
Второй способ отображения картинок в письме — это отправка картинок вместе с письмом. В данном случае, большинство почтовых агентов сразу показывают картинки. Этот способ мне нравится больше, и код именно этого способа отправки я и хочу показать.
Для верстки письма используются те же самые теги, что и для верстке в браузере. Чтобы отобразить в письме картинку нужно использовать тег . Единственное отличие будет в атрибуте SRC — в данном примере ему будет присвоен не путь к картинке, а CID картинки. CID — Content-ID будет указывать на картинку, которую мы предварительно закодируем и отправим вместе с письмом.
А теперь сам код, посмотрев который, вы окончательно поймете принцип отправки письма с картинками:

// картинки
$attach = array(
    'http://vk-book.ru/img/scroll_mouse.jpg',
    'http://vk-book.ru/img/ugly.png'
);
// чтобы отображалась картинка и ее не было в аттаче
// путь к картинке задается через CID: - Content-ID
// тестовый текст
$text = '
    <div style="width: 700px; margin: 0 auto;">
        <h1>тело письма с картинкой</h1>
        <h2>Блок по центру</h2>
        <p>
            <img style="float: left; margin-right: 15px; margin-bottom: 15px;" src="cid:scroll_mouse.jpg" width="128" height="128" />
            Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки.
            <br/>
            <img style="float: left; margin-right: 15px; margin-bottom: 15px;" src="cid:ugly.png" width="128" height="128" />
            Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки. Какой-то текст вокруг картинки.
        </p>
    </div>
';
 
$from = "test@test.com";
$to = "zhenikipatov@yandex.ru";
$subject = "Тема письма";
 
// Заголовки письма === >>>
$headers = "From: $from\r\n";
//$headers .= "To: $to\r\n";
$headers .= "Subject: $subject\r\n";
$headers .= "Date: " . date("r") . "\r\n";
$headers .= "X-Mailer: zm php script\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/alternative;\r\n";
$baseboundary = "------------" . strtoupper(md5(uniqid(rand(), true)));
$headers .= "  boundary=\"$baseboundary\"\r\n";
// <<< ====================
 
// Тело письма === >>>
$message  =  "--$baseboundary\r\n";
$message .= "Content-Type: text/plain;\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$message .= "--$baseboundary\r\n";
$newboundary = "------------" . strtoupper(md5(uniqid(rand(), true)));
$message .= "Content-Type: multipart/related;\r\n";
$message .= "  boundary=\"$newboundary\"\r\n\r\n\r\n";
$message .= "--$newboundary\r\n";
$message .= "Content-Type: text/html; charset=utf-8\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$message .= $text . "\r\n\r\n";
// <<< ==============
 
// прикрепляем файлы ===>>>
foreach($attach as $filename){
    $mimeType='image/png';
    $fileContent = file_get_contents($filename,true);
    $filename=basename($filename);
    $message.="--$newboundary\r\n";
    $message.="Content-Type: $mimeType;\r\n";
    $message.=" name=\"$filename\"\r\n";
    $message.="Content-Transfer-Encoding: base64\r\n";
    $message.="Content-ID: <$filename>\r\n";
    $message.="Content-Disposition: inline;\r\n";
    $message.=" filename=\"$filename\"\r\n\r\n";
    $message.=chunk_split(base64_encode($fileContent));
}
// <<< ====================
 
// заканчиваем тело письма, дописываем разделители
$message.="--$newboundary--\r\n\r\n";
$message.="--$baseboundary--\r\n";
 
// отправка письма
$result = mail($to, $subject, $message , $headers);
var_dump($result);

Добавлено: 09 Мая 2018 12:01:19 Добавил: Андрей Ковальчук

Быстрая форма обратной связи на PHP и jQuery

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

Сегодня мы найдем решение этой проблемы. Инструменты для этого — jQuery, PHP и класс PHPMailer.

HTML
Давайте начнем с HTML разметки. Стили находятся в начале документа, а JavaScript файлы в конце. Это нужно, чтобы страница загружалась быстрее. Сначала загружаются все стили, а в конце функционал JavaScript.

feedback.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Quick Feedback Form w/ PHP and jQuery </title>

<link rel="stylesheet" type="text/css" href="styles.css" />

</head>

<body>

<div id="feedback">

    <!-- Five color spans, floated to the left of each other -->

    <span class="color color-1"></span>

    <span class="color color-2"></span>
    <span class="color color-3"></span>
    <span class="color color-4"></span>
    <span class="color color-5"></span>

    <div class="section">

        <!-- The arrow span is floated to the right -->
        <h6><span class="arrow up"></span>Feedback</h6>

        <p class="message">Please include your contact information if you'd like to receive a reply.</p>

        <textarea></textarea>

        <a class="submit" href="">Submit</a>
    </div>
</div> 

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script src="script.js"></script>
</body>
</html>

Внутри body вы можете увидеть div #feedback. Он крепится в нижнему правому углу окна с помощью позиционирования fixed.

Внутри #feedback находятся 5 цветных элементов span.У каждого стоит ширина 20% и свойство float:left. Т.е. они полностью по ширине заполняют весь элемент div.

Кроме того, еще есть контейнер .section, в котором находятся заголовок, текстовая область и кнопка.

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

styles.css – часть 1
#feedback{
    background-color:#9db09f;
    width:310px;
    height:330px;
    position:fixed;
    bottom:0;
    right:120px;
    margin-bottom:-270px;
    z-index:10000;
}

#feedback .section{
    background:url('img/bg.png') repeat-x top left;
    border:1px solid #808f81;
    border-bottom:none;
    padding:10px 25px 25px;
}

#feedback .color{
    float:left;
    height:4px;
    width:20%;
    overflow:hidden;
}

#feedback .color-1{ background-color:#d3b112;}
#feedback .color-2{ background-color:#12b6d3;}
#feedback .color-3{ background-color:#8fd317;}
#feedback .color-4{ background-color:#ca57df;}
#feedback .color-5{ background-color:#8ecbe7;}

#feedback h6{
    background:url("img/feedback.png") no-repeat;
    height:38px;
    margin:5px 0 12px;
    text-indent:-99999px;
    cursor:pointer;
}

#feedback textarea{
    background-color:#fff;
    border:none;
    color:#666666;
    font:13px 'Lucida Sans',Arial,sans-serif;
    height:100px;
    padding:10px;
    width:236px;
    -moz-box-shadow:4px 4px 0 #8a9b8c;
    -webkit-box-shadow:4px 4px 0 #8a9b8c;
    box-shadow:4px 4px 0 #8a9b8c;
}

Первому элементу #feedback div присваивается фиксированное позиционирование к правом нижнему углу окна браузера. Далее назначаются стили для div .section, и пять цветных элемента span. Они различаются только цветами на заднем плане.

В конце CSS правил определяется отображение элемента textarea.

styles.css – часть 2
#feedback a.submit{
    background:url("img/submit.png") no-repeat;
    border:none;
    display:block;
    height:34px;
    margin:20px auto 0;
    text-decoration:none;
    text-indent:-99999px;
    width:91px;
}

#feedback a.submit:hover{
    background-position:left bottom;
}

#feedback a.submit.working{
    background-position:top right !important;
    cursor:default;
}

#feedback .message{
    font-family:Corbel,Arial,sans-serif;
    color:#5a665b;
    text-shadow:1px 1px 0 #b3c2b5;
    margin-bottom:20px;
}

#feedback .arrow{
    background:url('img/arrows.png') no-repeat;
    float:right;
    width:23px;
    height:18px;
    position:relative;
    top:10px;
}

#feedback .arrow.down{ background-position:left top;}
#feedback h6:hover .down{ background-position:left bottom;}
#feedback .arrow.up{ background-position:right top;}
#feedback h6:hover .up{ background-position:right bottom;}
#feedback .response{
    font-size:21px;
    margin-top:70px;
    text-align:center;
    text-shadow:2px 2px 0 #889889;
    color:#FCFCFC;
}

Во второй части таблицы стилей мы назначаем стили для кнопки. Стоит обратить внимание, что у кнопки существует три состояния. Это состояние кнопки в состоянии покоя, когда на нее наводят мышкой(hover) и режим «работы», когда она нажата. Когда кнопка в таком режиме, то эффект hover дезактивируется.

jQuery
Форма обратной связи имеет два состояния: минимизирована и максимизирована. При загрузке, по умолчанию, она свернута в правом нижнем углу экрана браузера. Затем она разворачивается, если щелкнуть по заголовку мышкой. Все это построено на простых событиях и анимации, что и видно из кода, расположенного ниже.

script.js – часть 1
$(document).ready(function(){

    // The relative URL of the submit.php script.
    // You will probably have to change it.
    var submitURL = 'submit.php';

    // Caching the feedback object:
    var feedback = $('#feedback');

    $('#feedback h6').click(function(){

        // We are storing the values of the animated
        // properties in a separate object:

        var anim    = {
            mb : 0,            // Margin Bottom
            pt : 25            // Padding Top
        };

        var el = $(this).find('.arrow');

        if(el.hasClass('down')){
            anim = {
                mb : -270,
                pt : 10
            };
        }

        // The first animation moves the form up or down, and the second one
        // moves the "Feedback" heading, so it fits in the minimized version

        feedback.stop().animate({marginBottom: anim.mb});
        feedback.find('.section').stop().animate(
        {paddingTop:anim.pt},function(){
            el.toggleClass('down up');
        });
    });

Чтобы оставить код чистым, мы перенесли проверку состояния наверх и создали объект anim, отвечающий за анимацию.

Вторая часть script.js содержит Ajax функционал, контактирующий с submit.php.

script.js – часть 2
    $('#feedback a.submit').live('click',function(){
        var button = $(this);
        var textarea = feedback.find('textarea');

        // We use the working class not only for styling the submit button,
        // but also as kind of a "lock" to prevent multiple submissions.

        if(button.hasClass('working') || textarea.val().length < 5){
            return false;
        }

        // Locking the form and changing the button style:
        button.addClass('working');

        $.ajax({
            url        : submitURL,
            type    : 'post',
            data    : { message : textarea.val()},
            complete    : function(xhr){

                var text = xhr.responseText;

                // This will help users troubleshoot their form:
                if(xhr.status == 404){
                    text = 'Your path to submit.php is incorrect.';
                }

                // Hiding the button and the textarea, after which
                // we are showing the received response from submit.php

                button.fadeOut();

                textarea.fadeOut(function(){
                    var span = $('<span>',{
                        className    : 'response',
                        html        : text
                    })
                    .hide()
                    .appendTo(feedback.find('.section'))
                    .show();
                }).val('');
            }
        });
        return false;
    });
});

Мы используем jQuery низкоуровневый Ajax метод – $.ajax(), для контактирования с submit.php. Этот метод обеспечивает больше контроля над соединением, чем $.get() и $.post() функции.

Например, одно из преимуществ видно в функции “complete”. Она вернет нужный статус, если будет ошибка 404 not found error. Таким образом можно вывести на экран сообщение об ошибке, напоминающее пользователю, чтобы он проверил путь submitURL.

И в конце PHP шаг.

PHP
PHP обрабатывает данные, принимает с помощью Ajax, проверяет и корректирует их и отправляет email сообщение на ваш электронный адрес.

submit.php
// Enter your email address below
$emailAddress = 'me@example.com';

// Using session to prevent flooding:

session_name('quickFeedback');
session_start();

// If the last form submit was less than 10 seconds ago,
// or the user has already sent 10 messages in the last hour

if(	$_SESSION['lastSubmit'] && ( time() - $_SESSION['lastSubmit'] < 10 || $_SESSION['submitsLastHour'][date('d-m-Y-H')] > 10 )){
	die('Please wait for a few minutes before sending again.');
}

$_SESSION['lastSubmit'] = time();
$_SESSION['submitsLastHour'][date('d-m-Y-H')]++;

require "phpmailer/class.phpmailer.php";

if(ini_get('magic_quotes_gpc')){
    // If magic quotes are enabled, strip them
    $_POST['message'] = stripslashes($_POST['message']);
}

if(mb_strlen($_POST['message'],'utf-8') < 5){
    die('Your feedback body is too short.');
}

$msg = nl2br(strip_tags($_POST['message']));

// Using the PHPMailer class

$mail = new PHPMailer();
$mail->IsMail();

// Adding the receiving email address
$mail->AddAddress($emailAddress);

$mail->Subject = 'New Quick Feedback Form Submission';
$mail->MsgHTML($msg);

$mail->AddReplyTo('noreply@'.$_SERVER['HTTP_HOST'], 'Quick Feedback Form');
$mail->SetFrom('noreply@'.$_SERVER['HTTP_HOST'], 'Quick Feedback Form');

$mail->Send();
echo 'Thank you!';

С помощью PHP мы управляем сессиями, чтобы отслеживать частоту отправлений сообщений от пользователя. Если частота превышает определенный порог, то пользователю показывается сообщение об ошибке.

Email сообщения отправляются с помощью класса PHPMailer. Он работает только на PHP5, так что вам нужно проверять версию PHP, если вы будете использовать этот скрипт.

Быстрая форма обратной связи полностью готова!

Добавлено: 04 Мая 2018 10:57:30 Добавил: Андрей Ковальчук

Форма обратной связи на jQuery и PHP

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

Сегодня мы сделаем простое решение данной задачи. Используя jQuery, PHP и класс PHPMailer форма посылает предложение пользователя прямо в ваш почтовый ящик.

HTML
Начнем с разметки HTML. Стили включаются вверху документа, а файлы JavaScript - внизу. Таким образом оптимизируется процесс загрузки страницы, так скрипты грузятся последними, позволяя пользователю увидеть содержание страницы.

demo.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Форма обратной связи с использованием PHP и jQuery | Демонстрация для сайта RUSELLER.COM</title>
<link rel="stylesheet" type="text/css" href="styles.css" />
</head>
<body>
<div id="feedback">
<!-- Пять цветных элементов span, смещенных влево один к другому -->
<span class="color color-1"></span>
<span class="color color-2"></span>
<span class="color color-3"></span>
<span class="color color-4"></span>
<span class="color color-5"></span>
<div class="section">
<!-- Элемент span стрелки смещается вправо -->
<h6><span class="arrow up"></span>Обратная связь</h6>
<p class="message">Пожалуйста, включите контактную информацию, если вы хотите получить ответ.</p>
<textarea></textarea>
<a class="submit" href="">Отправить</a>
</div>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script src="script.js"></script>
</body>
</html>

Внутри body находится div #feedback. Он размещен внизу справа в окне с помощью фиксированного позиционирования, что будет видно в разделе урока, посвященного CSS.

Внутри данного div размещаются пять цветных элементов span. Каждый из них имеет 20% ширины и смещается влево. Таким образом, они размещаются точно на по всей ширине div #feedback.

Затем следует контейнер .section, который содержит заголовок, область текста и кнопку.

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

styles.css – Часть 1
#feedback{
    background-color:#9db09f;
    width:310px;
    height:330px;
    position:fixed;
    bottom:0;
    right:120px;
    margin-bottom:-270px;
    z-index:10000;
}
 
#feedback .section{
    background:url('img/bg.png') repeat-x top left;
    border:1px solid #808f81;
    border-bottom:none;
    padding:10px 25px 25px;
}
 
#feedback .color{
    float:left;
    height:4px;
    width:20%;
    overflow:hidden;
}
 
#feedback .color-1{ background-color:#d3b112;}
#feedback .color-2{ background-color:#12b6d3;}
#feedback .color-3{ background-color:#8fd317;}
#feedback .color-4{ background-color:#ca57df;}
#feedback .color-5{ background-color:#8ecbe7;}
 
#feedback h6{
    background:url("img/feedback.png") no-repeat;
    height:38px;
    margin:5px 0 12px;
    text-indent:-99999px;
    cursor:pointer;
}
 
#feedback textarea{
    background-color:#fff;
    border:none;
    color:#666666;
    font:13px 'Lucida Sans',Arial,sans-serif;
    height:100px;
    padding:10px;
    width:236px;
    resize:none;
    outline:none;
    overflow:auto;
     
    -moz-box-shadow:4px 4px 0 #8a9b8c;
    -webkit-box-shadow:4px 4px 0 #8a9b8c;
    box-shadow:4px 4px 0 #8a9b8c;
}

Первый элемент, для которого задается стиль - это div #feedback. Ему назначается фиксированная позиция и привязка к окну браузера. После него идет определение для div .section и пяти цветных элементов span. Данные элементы отличаются только цветом фона, который назначается отдельно для каждого класса.

В самом низу представленной части CSS файла определяются правила для вывода области текста.

styles.css – Часть 2
#feedback a.submit{
    background:url("img/submit.png") no-repeat;
    border:none;
    display:block;
    height:34px;
    margin:20px auto 0;
    text-decoration:none;
    text-indent:-99999px;
    width:91px;
}
 
#feedback a.submit:hover{
    background-position:left bottom;
}
 
#feedback a.submit.working{
    background-position:top right !important;
    cursor:default;
}
 
#feedback .message{
    font-family:Corbel,Arial,sans-serif;
    color:#5a665b;
    text-shadow:1px 1px 0 #b3c2b5;
    margin-bottom:20px;
}
 
#feedback .arrow{
    background:url('img/arrows.png') no-repeat;
    float:right;
    width:23px;
    height:18px;
    position:relative;
    top:10px;
}
 
#feedback .arrow.down{ background-position:left top;}
#feedback h6:hover .down{ background-position:left bottom;}
#feedback .arrow.up{ background-position:right top;}
#feedback h6:hover .up{ background-position:right bottom;}
 
#feedback .response{
    font-size:21px;
    margin-top:70px;
    text-align:center;
    text-shadow:2px 2px 0 #889889;
    color:#FCFCFC;
    display:block;
}

Во второй части таблицы стилей определяется вид кнопки отправки. Отметим, что существует три состояния кнопки, изображения для которых содержатся в одном файле для фонового рисунка – submit.png . Они выводятся только когда необходимо.

Форма обратной связи в момент передачи сообщения.

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

script.js – Часть 1
$(document).ready(function(){
 
    // Относительный URL скрипта submit.php.
    // Вероятно, вам нужно будет его поменять.
    var submitURL = 'submit.php';
 
    // Кэшируем объект feedback:   
    var feedback = $('#feedback');
 
    $('#feedback h6').click(function(){
 
        // Значения свойств анимации хранятся
        // в отдельном объекте:
                 
        var anim    = {    
            mb : 0,         // Поле снизу
            pt : 25         // Отступ сверху
        };
         
        var el = $(this).find('.arrow');
         
        if(el.hasClass('down')){
            anim = {
                mb : -270,
                pt : 10
            };
        }
 
        // Первая анимация перемещает вверх или вниз форму, а вторая перемещает
        // заголовок, так что он выравнивается по минимизированной версии
         
        feedback.stop().animate({marginBottom: anim.mb});
         
        feedback.find('.section').stop().animate({paddingTop:anim.pt},function(){
            el.toggleClass('down up');
        });
    });

Для того, чтобы код был простым и понятным, вверху создается объект anim, который содержит значения для анимации, и размещается оператор if. В зависимости ото существования класса ‘down‘ на стрелке , мы разворачиваем или сворачиваем форму.

Вторая часть script.js обрабатывает работу с AJAX с submit.php.

script.js – Часть 2
    $('#feedback a.submit').live('click',function(){
        var button = $(this);
        var textarea = feedback.find('textarea');
         
        // Мы используем класс working не только для задания стилей для кнопки отправки данных,
        // но и как своеобразный замок для предотвращения множественных генераций формы.
         
        if(button.hasClass('working') || textarea.val().length < 5){
            return false;
        }
 
        // Запираем форму и изменяем стиль кнопки:
        button.addClass('working');
         
        $.ajax({
            url     : submitURL,
            type    : 'post',
            data    : { message : textarea.val()},
            complete    : function(xhr){
                 
                var text = xhr.responseText;
                 
                // Данная операция помогает пользователю определить ошибку:
                if(xhr.status == 404){
                    text = 'Путь к скрипту submit.php неверный.';
                }
 
                // Прячем кнопку и область текста , после которой
                // мы показывали полученный ответ из submit.php
 
                button.fadeOut();
 
                textarea.fadeOut(function(){
                    var span = $('<span>',{
                        className   : 'response',
                        html        : text
                    })
                    .hide()
                    .appendTo(feedback.find('.section'))
                    .show();
                }).val('');
            }
        });
         
        return false;
    });
});

Мы используем метод jQuery для AJAX $.ajax() для взаимодействия с submit.php. Данный метод дает немного больше контроля над соединением, чем $.get() и $.post().

Одним из преимуществ метода является видимость свойств объекта во "всей" возвратной функции. Здесь мы проверяем статус ответа на соответствие ошибке 404 (не найдена страница), и выводим сообщение пользователю с просьбой проверить путь submitURL.

Теперь пора перейти к завершающей части - PHP.

PHP
PHP обрабатывает данные, переданные с AJAX, проверяет их и посылает e-mail сообщение по заданному адресу.

submit.php
// Здесь нужно ввести свой адрес
$emailAddress = 'test@example.ru';
 
 
// Используем сессию, чтобы предотвратить флудинг:
 
session_name('quickFeedback');
session_start();
 
// Если последняя форма была отправлена меньше 10 секунд назад,
// или пользователь уже послал 10 сообщений за последний час
 
if( $_SESSION['lastSubmit'] && ( time() - $_SESSION['lastSubmit'] < 10 || $_SESSION['submitsLastHour'][date('d-m-Y-H')] > 10 )){
    die('Пожалуста, подождите несколько минут, прежде чем отправить сообщение снова.');
}
 
$_SESSION['lastSubmit'] = time();
$_SESSION['submitsLastHour'][date('d-m-Y-H')]++;
 
 
require "phpmailer/class.phpmailer.php";
 
if(ini_get('magic_quotes_gpc')){
    $_POST['message'] = stripslashes($_POST['message']);
}
 
if(mb_strlen($_POST['message'],'utf-8') < 5){
    die('Ваше сообщение слишком короткое.');
}
 
$msg = nl2br(strip_tags($_POST['message']));
 
// Используем класс PHPMailer
 
$mail = new PHPMailer();
$mail->IsMail();
 
// Добавляем адрес получателя
$mail->AddAddress($emailAddress);
 
$mail->Subject = 'Новое письмо из формы обратной связи';
$mail->MsgHTML($msg);
 
$mail->AddReplyTo('noreply@'.$_SERVER['HTTP_HOST'], 'Форма обратной связи на демо странице');
$mail->SetFrom('noreply@'.$_SERVER['HTTP_HOST'], 'Форма обратной связи на демо странице');
 
$mail->Send();
 
 
echo 'Спасибо!';

Сначала мы используем управление сессиями, чтобы определить, как часто использует пользователь отправку формы в течение последнего часа, а также определяем время, прошедшее с последней отправки. Если с момента последней отправки прошло менее 10 секунд, или пользователь уже посылал более 10 сообщений в течение последнего часа, выводится сообщение об ошибке.

E-mail отправляется с помощью класса PHPMailer. Внимание! Он работает только с PHP5.

Несколько методов PHPMailer используется для конфигурации исходящего e-mail. Метод IsMail() указывает классу использовать внутреннюю функцию PHP mail(). Метод AddAddress() добавляет адрес получателя (вы можете добавить более одного получателя с помощью дополнительных вызовов данного метода). После добавления темы письма и текста указывается адрес для ответов и производится отправка сообщения.

Готово!

Заключение
Вы можете использовать данную форму для организации быстрой обратной связи с посетителем вашего сайта. Очень низкий барьер перед отправкой - нужно просто заполнить текстовове поле и нажать кнопку - создаст отличные условия для того, чтобы посетители ваших страниц начали делиться своими идеями. Скрипт также хорошо структурирован и прост в настройке, что поможет вам с минимальными усилиями использовать его на своем сайте.

Добавлено: 02 Мая 2018 19:01:12 Добавил: Андрей Ковальчук

Простой скрипт email рассылки

Приступим.
Почему PHP? Да потому что на PHP это сделать очень просто и он стоит на любом хостинге (платном конечно). Тем более, скрипт не нужно хранить на компьютере, а лучше залить на сервер и пользоваться откуда угодно. Даже с мобильника.

Если говорить более простым языком, мы пишем небольшой скрипт e-mail рассылки. Сразу же в голове рождается представление работы скрипта.

У нас есть форма с полями:

Кому (список получателей)

Тема сообщения

Текст сообщения

Адрес отправителя (выбор из перечня)

Схема работы: Вводим данные и нажимаем «Отправить» → происходит отправка писем → получаем отчёт.

Есть также пару особенностей. Для отправки писем желательно использовать небольшой тайм-аут, чтобы наш сервер не посчитали спаммером. Отчёт желательно записать в небольшой текстовый файл. Нужно защитить скрипт от несанкционированного использования.

Пишем скрипт
Здесь я не буду описывать процесс написания, а просто приведу максимально откомментированный код.

<?php
// Устанавливает лимит времени исполнения для этого файла (связано с тайм-аутом)
set_time_limit (1200);
// Адреса отправителя
$mail1="Ваше имя 1 <your1@email.com<script type="text/javascript">
/* <![CDATA[ */
(function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
/* ]]> */
</script>>";
$mail1="Ваше имя 2 <your2@email.com<script type="text/javascript">
/* <![CDATA[ */
(function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
/* ]]> */
</script>>";
$mail1="Ваше имя 3 <your3@email.com<script type="text/javascript">
/* <![CDATA[ */
(function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
/* ]]> */
</script>>";
 
// Обрабатываем адреса для отображения в форме
$tmail1=htmlspecialchars($mail1);
$tmail2=htmlspecialchars($mail2);
$tmail3=htmlspecialchars($mail3);
 
// Далее идёт сам скрипт
// Если массив POST не пустой, отправка состоялась
if (!empty($_POST) && !isset($sent)) {
 
// Определяем переменные
$emailer_subj = $_POST['emailer_subj'];
$emailer_mails = $_POST['emailer_mails'];
$emailer_text = $_POST['emailer_text'];
$emailer_yourmail = $_POST['emailer_yourmail'];
 
// Теперь проверяем заполнение всех полей
if (empty($emailer_subj) || $emailer_subj=="Тема письма") {
// Если тема пустая...
$mail_msg='<b>Вы не ввели тему письма</b>';
} elseif (empty($emailer_mails) || $emailer_mails=="Почтовые адрсе") {
// Если адресов нет...
$mail_msg='<b>Не указано адреса получателей</b>';
} elseif (empty($emailer_text) || $emailer_text=="Текст письма") {
// Если сообщение пустое...
$mail_msg='<b>Вы не ввели текст письма</b>';
} else { // Если все поля заполнены верно...
// Готовим сообщение об успешной отправке... Вдруг у вас какой-то необычный браузер
$mail_msg='Ваше сообщение отправлено.<br>Нажмите <a href="'.$_SERVER['REQUEST_URI'].'">здесь</a>, если ваш браузер не поддерживает перенаправление.';
// Готовим заголовки письма... Будем отправлять письма в формате HTML и кодировке UTF-8
$headers="MIME-Version: 1.0\r\n";
$headers.="Content-type: text/html; charset=utf-8\r\n";
$headers.="From: $emailer_yourmail";
 
// Обработка письма. Нужно удалить лишние пробелы и проставить переносы.
$emailer_text=preg_replace("/ +/"," ",$emailer_text); // множественные пробелы заменяются на одинарные
$emailer_text=preg_replace("/(\r\n){3,}/","\r\n\r\n",$emailer_text); // убираем лишние переносы (больше 1 строки)
$emailer_text=str_replace("\r\n","<br>",$emailer_text); // ставим переносы
 
// Получаем массив адресов. В качестве разделителя у нас используется запятая.
$emails=explode(",", $emailer_mails);
$count_emails = count($emails); // Подсчёт количества адресов
// Запускаем цикл отправки сообщений
for ($i=0; $i<=$count_emails-1; $i++) // Отчёт начинается в массиве с нуля, поэтому уменьшаем сумму на единицу
{
// Подставляем адреса получаетелей и обрезаем пробелы с обоих сторон, если таковые имеются
$email=trim($emails[$i]);
// Отправляем письмо и готовим отчёт по отправке
if($emails[$i]!="") { // Проверка на случай попадения в массив пустого значения
if(mail($email,$emailer_subj,$emailer_text,$headers)) $report.="<li><span style=\"color:green;\">Отправлено: ".$emails[$i]."</span></li>"; else $report.="<li><span style=\"color:red;\">Не отправлено: ".$emails[$i]."<span></li>";
sleep(5); // Делаем тайм-аут в 5 секунд
}
}
 
// Запись отчёта в файл. Файл будет сгенерирован в той же папке, под названием log.txt. Проверьте настройку прав папки.
$log=fopen("log.txt","w");
fwrite($log,$report);
fclose($log);
// Переменная $sent – признак успешной отправки
$sent=1;
}
} else { // Если в массиве POST пусто, форма еще не передавалась
// Готовим приглашение
$mail_msg='Все поля обязательны для заполнения.';
// Поля темы, адресов получаетелей и получателей, и текста в этом случае должны быть пустыми
$emailer_text=$emailer_subj=$emailer_mails=$emailer_yourmail='';
}
 
// Если $sent не существует, выводим форму или отчёт
if (!isset($sent)) {
// Если сообщение уже отправлено - выводим отчёт
if(isset($_GET['messent']))
{echo $text.="<b style=\"text-align:center;margin-top:200px;display:block;\">Всё окей. Сообщение отправлено. <a href=\"emailer.php\">Ещё?</a><br><br><u>Отчёт:</u></b> <ol style=\"display:block;width:300px;margin:10px auto;\">";
readfile("log.txt");
echo"</ol>";}
else {
// Или выводим форму, если сообщение ещё не отправлено
echo $text.=<<<post
<script type="text/javascript">
function form_validator(form) {
if (form.emailer_subj.value=='' || form.emailer_subj.value=='Тема письма') { alert('Укажите тему письма.'); form.emailer_subj.focus(); return false; }
if (form.emailer_mails.value=='' || form.emailer_mails.value=='Почтовые адреса') { alert('Укажите адреса получаталей.'); form.emailer_mails.focus(); return false; }
if (form.emailer_text.value=='' || form.emailer_text.value=='Текст письма') { alert('Вы не заполнили поле сообщения.'); form.emailer_text.focus(); return false; }
return true;
}
</script>
<style type="text/css">
form {display:block;margin:20px auto;width:500px;}
textarea, input, select {width:100%; margin:5px 0;}
textarea {height:200px;}
.red {color:#a00;}
</style>
<form method="post" onsubmit="return form_validator(this);">
<p class="red">$mail_msg</p>
<input type="text" name="emailer_subj" id="emailer_subj" value="Тема письма" title="По какому поводу пишем?" onfocus="if (this.value=='Тема письма') this.value='';" onblur="if (this.value=='') this.value='Тема письма';">
<textarea name="emailer_mails" id="emailer_mails" title="Кто получатели?" onfocus="if (this.value=='Почтовые адреса') this.value='';" onblur="if (this.value=='') this.value='Почтовые адреса';">Почтовые адреса</textarea>
<textarea name="emailer_text" id="emailer_text" title="Что пишем?" onfocus="if (this.value=='Текст письма') this.value='';" onblur="if (this.value=='') this.value='Текст письма';">Текст письма</textarea>
<select name="emailer_yourmail">
<option value="$mail1">$tmail1</option>
<option value="$mail2">$tmail2</option>
<option value="$mail3">$tmail3</option>
</select>
<input type="submit" value="Отправить" title="Отправить мыл">
</form>
post;
}
}
else { // А если существует...
// Посылаем в заголовке редирект (303 Refresh) на этот же адрес с дополнительным параметром messent
$ret_uri=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
header("Refresh: 0; URL=http://".$ret_uri."?messent");
exit;
}
 
?>

Защита скрипта
Создайте папку, где будет находиться скрипт, и положите туда файл .htaccess, с таким содержанием. Эти пару строк ограничат доступ по IP адресу.
Order Deny,Allow
Deny from all
Allow from ваш IP

Или, если у вас не постоянный IP адрес, можно добавить пароль.
if (!isset($_SERVER['PHP_AUTH_USER'])) {
// посылаем браузеру запрос логина/пароля
header("WWW-Authenticate: Basic realm=\"Enter login and password\"");
header("HTTP/1.0 401 Unauthorized");
exit;
} else {
if($_SERVER['PHP_AUTH_USER']!=='Ваш логин' && $_SERVER['PHP_AUTH_PW']!=='Ваш пароль')
{
header("WWW-Authenticate: Basic realm=\"Enter login and password\"");
header("HTTP/1.0 401 Unauthorized");
exit('Введён неверный логин или пароль');
}
else {
//Сюда нужно вставить тело скрипта
}

Доработка скрипта
Конечно, можно бесконечно дорабатывать этот скрипт, ведь решение написано «на коленке», однако свою функцию он выполняет. Неоднократно пользовался им и сбоев не было.

Например, можно задавать список адресов получателей из текстового файла (можно прямо выбирать адреса из текста). Или сделать отправку с помощью перезапуска работы скрипта (чтобы не было проблем с функцией set_time_limit () на любом хостинге). Или писать подробные отчёты и отсылать их на ваше e-mail.

Можно вставить себя последним в списке, чтобы проконтролировать отправку. Вдруг что с файлом случится :)

Надеюсь, эта статья поможет вам в освоении языка программирования PHP.

Добавлено: 02 Мая 2018 13:49:22 Добавил: Андрей Ковальчук

Отправка писем на PHP с аттачем

Будем отправлять письма на PHP с аттачем:

Исходный код нашего скрипта:

$from = "admin"; // От кого
 $to = "tiger1989@mail.ru"; // Кому
 $filename = "certificates/image.jpg"; // Полное имя файла 
 $subj = 'TIGER IMAGE'; // Тема сообщения
 $text = 'Hello from tigercms.com'; // Тело сообщения
 $f = fopen($filename,"rb"); // Открываем и читаем бинарно файл $filename
$un = strtoupper(uniqid(time())); 
$head = "From: $fromn"; // Создаем заголовки нашего письма
$head .= "To: $to ";
$head .= "Subject: $subj ";
$head .= "X-Mailer: PHPMail Tool ";
$head .= "Reply-To: $from ";
$head .= "Mime-Version: 1.0 ";
$head .= "Content-Type:multipart/mixed;";
$head .= "boundary="----------".$un."" ";
$zag = "------------".$un." Content-Type:text/html; ";
$zag .= "Content-Transfer-Encoding: 8bit $text ";
$zag .= "------------".$un." ";
$zag .= "Content-Type: application/octet-stream;";
$zag .= "name="".basename($filename)."" ";
$zag .= "Content-Transfer-Encoding:base64 ";
$zag .= "Content-Disposition:attachment;";
$zag .= "filename="".basename($filename)."" ";
$zag .= chunk_split(base64_encode(fread($f,filesize($filename))))." "; // Кодируем строку
// в base64, деля файл на небольшие «куски» функцией "chunk_split"
mail("$to", "$subj", $zag, $head); // Посылаем письмо функцией mail()


Ну вот собственно и все.

Данный кусок кода вы с легкостью можете «прикрутить» к своему движку.

Все необходимые параметры вынесены в переменные, заполнив значения которых, можно использовать скрипт.

Добавлено: 20 Апреля 2018 09:07:20 Добавил: Андрей Ковальчук

Разработка собственных листов рассылки

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

Наиболее простым решением данной задачи, на мой взгляд, является разработка соответствующих скриптов на языке PHP, поскольку поддержка данного языка входит в комплект услуг практически любой компании, предоставляющей услуги хостинга. С помощью PHP у вас появится возможность разрабатывать полнофункциональные приложения, доступ к которым может быть осуществлен из любой точки земного шара посредством Internet. Конечно, существует множество приложений, способных предоставить вам все необходимые функции для управления листами рассылок, однако все они (если не считать необходимость оплаты их приобретения) обладают следующими недостатком: вы не сможете на 100% настроить работу приложения так, как вам хотелось бы. Всегда вы будете чем-нибудь недовольны. А разработка собственных PHP-скриптов обеспечит вам гарантию того, что в любой момент можно будет модифицировать существующий механизм листа рассылки.

В рамках данной статьи я предлагаю рассмотреть решение задачи по организации списка рассылки. Для простоты здесь не будет использоваться какая-либо СУБД, а ее место займут плоские файлы. Делается это лишь с целью упрощения, поскольку разговор об использовании, в частности MySQL, может занять много времени, да и не для всех окажется необходимым работа с большими списками рассылок. Для некоторых достаточно будет списка из 300-500 адресов, с чем технология плоских файлов справляется отлично и без замедления работы. В то время как покупка хостинга с поддержкой MySQL стоит дороже, чем хостинг с PHP, но без возможности работы с базами данных.

Далее в этой статье я постараюсь изложить вам основные принципы создания и манипулирования списками рассылок с использованием механизмов, предоставляемых PHP. Для тех, кто не достаточно знаком с этим мощным языком программирования Web-серверных приложений, несколько слов о том, что же такое PHP. Это интерпретируемый язык для создания активных Web-страниц. Программа на PHP, подобно тексту на JavaScript, VBScript или ASP, вставляется в HTML-файл (или в отдельный файл с соответствующим расширением). Начало и конец программы отмечаются специальными скобками . Текст вне этих скобок PHP не интерпретирует: он передается Web-браузеру "как есть". Синтаксис PHP основан на синтаксисе языков Си, Java и perl и довольно подробно описан в руководстве, которое входит в комплект поставки (его также можно взять на узле http://www.php.net).

Рассылаем письма
Итак, определимся, что все скрипты будут находиться в корневой директории, а файлы с данными - в каталоге data/. Каждый из листов рассылки будет храниться в отдельном файле. Кроме этого, будет организован log-файл, также в виде простого тестового файла. Список листов рассылки будет храниться в файле lists.txt в каталоге data, в каждой строке которого будет содержаться название списка и имя файла, в котором хранятся e-mail адреса подписчиков. Поля будут разделены символом "|". Данный файл будет использоваться для формирования выпадающего списка в форме администрирования для манипуляции с тем или иным списком адресов. Я сторонник обеспечения доступа к наиболее часто используемым механизмам наиболее простым способом. Именно поэтому я предлагаю разместить на стартовой странице форму для рассылки сообщений участникам списка рассылки, а обеспечение доступа к остальным механизмам администрирования организовать с помощью ссылок. Итак, предлагаю вам взглянуть на текст приведенного ниже файла index.php. На рисунке 1 представлен результат обращения к нему через браузер.

<html><head><title>Администрирование списков рассылки</title></head>
<body>
<center><H2> Администрирование списков рассылки </H2></center>
<form method=post action="sendemail.php">
<table>
<tr align="left">
<td width="200" align="left">
<b>Адрес отправителя:</b>
</td>
<td align="left" width="50">
<input type=text name="From" size="40" value="">
</td>
</tr>
<tr>
<td align="left">
<b>Тема:</b>
</td>
<td align="left">
<input type=text name="Subject" size="40">
</td>
</tr>
<tr>
<td align="left">
<b>Выберите список:</b>
</td>
<td align="left">
<select name="List" size=1>
<?
$groups = file("data/lists.txt");
for ($index=0; $index < count($groups); $index++)
{
$grouplist = split("|", chop($groups[$index]));
?>
<option value="<? print $grouplist[1] ?>"
<? if ($index==0)
{print " selected ";}
?>
>
<?
print $grouplist[0]
?>
</select>
</td>
</tr>
<td align="left">
<b>Текст сообщения:</b>
</td>
<td align="left">
<textarea cols=50 rows=10 name="Body"></textarea>
</td>
</tr>
</table>
<input type="submit" name="Submit" value="Отправить">
</form>
<a href="newlist.php">Создание нового листа списка рассылки.</a>
<br><a href="addnames.php">Добавить адреса в список</a>.
<br><a href="picklist.php">Модификация/удаление адресов</a>.
<br><a href="data/log.txt">Просмотр журнала</a>.
<br><a href="autoresponder.php"> Просмотр/редактирование автоответчика</a>.
</body></html>

Скорее всего, вы обратили внимание, что приведенный выше текст в большей части представляет собой обычный HTML-код. Исключение составляют строки, ограниченные скобками . Текст между ними и есть команды языка PHP. Давайте рассмотрим чуть подробнее, какую именно задачу они выполняют. В принципе, все достаточно просто. В переменную $groups помещается содержимое файла lists.txt, находящегося в каталоге data/. Затем в цикле происходит разделение каждой строки на поля, для чего используется выражение

$grouplist = split("|", chop($groups[$index]));

Из полученных названий списков и соответствующих файлов формируется набор тегов option элемента ввода select (результат виден на рисунке 1). Функция chop используется для удаления повторяющихся пробелов и символа новой строки.

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

Итак, после нажатия на кнопку "Отправить" управление вместе со всеми введенными данными передается скрипту с именем sendemail.php. Код, выполняющий рассылку сообщений, достаточно прост и представлен ниже:

<html><head><title>Отсылка почты...</title></head><body>
<?
$addresses = file("data/$List");
for ($index=0; $index < count($addresses); $index++)
{
mail("$addresses[$index]","$Subject",
"$Body","From: $FromnReply-To: $From");
}
$myfile = fopen("data/log.txt","a");
fputs($myfile, $Subject."t".date("dS of F Y h:i:s A")."t".$List."n");
fclose($myfile);
?>

Ваше сообщение отправлено.
<br><br>
<a href="index.php">На главную</a>.
</body></html>

Данный скрипт использует несколько весьма полезных функций. Первая - mail(), одна из наиболее мощных и в то же время простых в использовании функций, входящих в состав PHP. При работе Web-сервера под управлением операционной системы UNIX при выполнении функции mail() по умолчанию используется sendmail, однако настройку PHP можно изменить, и для отсылки почты может использоваться любой другой механизм, указанный в соответствующем разделе файла php.ini. Функция mail() описывается следующим образом:

mail (string to, string subject, string message, string [additional_headers]);

В качестве значения для параметра additional_headers вы можете указать ту информацию, которую считаете нужной, включая такие параметры, как X-Mailer, Reply-To, CC:, Bcc, Mime-Version, также вы можете сформировать свой собственный заголовок.

Для получения списка e-mail адресов из соответствующего файла используется функция file(). Имя файла передается в качестве параметра при вызове скрипта обработки данных формы. Затем осуществляется рассылка сообщения в цикле по всем адресам.

Добавляем адреса в список рассылки
Следующий вопрос, который я хотел бы рассмотреть в данной статье, - механизм добавления новых адресов в тот или иной список рассылки. Для обеспечения такой возможности нам необходимо создать PHP-файл с формой ввода адресов, а также скрипт, обрабатывающий эту информацию. Сначала приведу текст файла addnames.php, результат работы которого представлен на рисунке 2.

<html><head><title>Добавление адреса в список рассылки</title></head>
<body>
<center><H2>Добавление адреса в список рассылки</H2></center>
<form method=post action="sevemail.php">
<table>
<tr>
<td align="left">
<b>Выберите список:</b>
</td>
<td align="left">
<select name="List" size=1>
<?
$groups = file("data/lists.txt");
for ($index=0; $index < count($groups); $index++)
{
$grouplist = split("|", chop($groups[$index]));
?>
<option value="<? print $grouplist[1] ?>"
<? if ($index==0)
{print " selected ";}
?>
>
<?
print $grouplist[0]
?>
</option>
<?
}
?>
</select>
</td>
</tr>
<tr>
<td align="left">
<b>Добавляемый e-mail:</b>
</td>
<td align="left">
<input type=text name="Email" size="40">
</td
</tr>
</table>
<input type="submit" name="Submit" value="Добавить адрес">
</form>
<a href="newlist.php">Создание нового листа списка рассылки.</a>
<br><a href="picklist.php">Модификация/удаление адресов</a>.
<br><a href="data/log.txt">Просмотр журнала</a>.
<br><a href="autoresponder.php"> Просмотр/редактирование автоответчика</a>.
</body></html>

Единственным отличием данного файла от index.php является отсутствие полей ввода, характерных только для рассылки писем, а также имя скрипта, которому передается управление после нажатия на кнопку "Добавить адрес". Ниже приводится текст скрипта savemail.php.

<html><head><title>Записываем файл...</title></head><body>
<br><br>
<?
if (file_exists("data/$List"))
{
$myfile = file("data/$List");
$fh = fopen("data/$List","w");
for ($index=0; $index < count($myfile); $index++)
{
if ($Email != chop($myfile[$index]))
{fputs($fh,$myfile[$index]);}
}
fputs($fh,$Email."n");
fclose($myfile);
}
else
{
$myfile = fopen("data/$List","w");
fputs($myfile,$Email."n");
fclose($myfile);
}
?>
<br>
<? echo $Email ?> записан в <? echo $List ?>
<br><br>
<a href="index.php">На главную</a>.
</body></html>

Рассмотрим задачи, выполнение которых должен обеспечить данный скрипт. Во-первых , проверка существования файла со списком адресов. Это делается с помощью функции file_exists. Если файла с указанным именем не существует, это означает, что добавляемый нами адрес - первый в списке. В этом случае просто создаем новый файл и записываем в него e-mail-адрес. В противном случае после чтения уже сформированного списка в массив следует добавить переданный из формы e-mail адрес, однако прежде стоит посмотреть, не введен ли он раньше, т.к. ни один из адресов не должен дублироваться. Это, в частности, может быть осуществлено в цикле по всем элементам массива. В данном случае файл со списком будет открыт на чтение, и в него будут записаны все адреса, не совпадающие со вновь записываемым. Обратите внимание, что функция открытия файла fopen в качестве второго параметра использует значение "w". Это означает, что файл открывается для записи в него данных. Значение "r" означало бы открытие файла на чтение, "a" - для добавления информации к существующим данным. Формат вызова функции fopen выглядит следующим образом:

fopen (filename, mode)
Обратите внимание на следующий нюанс: если вы собираетесь открывать файл одновременно для чтения и записи, вам следует предусмотреть возможность некорректного завершения работы скрипта. После открытия файла следует прочитать все его содержимое в массив и все модификации осуществлять с данными в памяти. Только после обработки всех данных можно снова открыть файл, теперь уже на запись, и поместить в него модифицированную информацию.

Рассмотренный нами механизм добавления e-mail адресов во многом неидеален. Например, вместо одного адреса можно обеспечить ввод сразу нескольких. Для этого достаточно лишь изменить описание формы в файле addnames.php, а также немного подкорректировать код обработки передаваемых в savemail.php данных. Кроме того, можно осуществлять проверку корректности ввода e-mail адреса по некоторому шаблону (например, наличие символа "@" внутри строки). Я не буду углубляться в детали, т.к. это может занять много времени, тем более что моей целью на данный момент является демонстрация возможностей языка PHP, а также того, что задача создания такого мощного механизма, как система управления списками рассылок, не так уж и сложна. Однако предлагаю перейти к следующему этапу - созданию новых списков рассылки. Как и в предыдущем случае, для этого необходимо создать два файла, первый из которых будет содержать форму ввода исходных данных, а второй будет эти данные обрабатывать. Назовем эти файлы newlist.php и makenewlist.php соответственно.

newlist.php:

<html><head><title>Создание нового списка рассылки</title></head>
<body>
<center><H2>Создание нового списка</H2></center>
<form method=post action="make-newlist.php">
<table>
<tr>
<td align="left">
<b>Название списка:</b>
</td>
<td align="left">
<input type=text name="Listname" size="40">
</td>
</tr>
<tr>
<td align="left">
<b>Описание(одно слово):</b>
</td>
<td align="left">
<input type=text name="Filename" size="40">
</td>
</tr>
</table>
<input type="submit" name="Submit" value="Записать">
</form>
<br><a href="addnames.php">Добавить адреса в список</a>.
<br><a href="picklist.php">Модификация/удаление адресов</a>.
<br><a href="data/log.txt">Просмотр журнала</a>.
<br><a href="autoresponder.php"> Просмотр/редактирование автоответчика</a>.
</body></html>
makenewlist.php:
<html><head><title>Создание файла...</title></head><body>
<?
$Filename = $Filename.".lst";
$myfile = fopen("data/lists.txt","a");
fputs($myfile,$Listname."|".$Filename."n");
fclose($myfile);
?>
Создан список рассылки <? echo $Listname ?>.<br>
<br>
<a href="index.php">На главную</a>.
</body></html>

Легко заметить, что скрипт makenew-list.php выполняет только одну функцию - добавление названия списка и имени соответствующего файла в lists.txt.

Редактирование адресов
Для редактирования e-mail адресов списка рассылки в качестве простого и, тем не менее, эффективного решения можно использовать прямое редактирование текста соответствующего файла. В первую очередь у нас должна быть форма, в которой мы будем выбирать редактируемый список рассылки. Ниже приведен текст соответствующего файла. Как видно, он не очень-то отличается от предыдущих файлов с формами и приводится здесь исключительно с целью демонстрации простоты разработки такого типа форм (для тех читателей, кто пока еще не является профессионалом в php-программировании).

<html><head><title>Редактирование адресов</title></head>
<body>
<center><H2>Редактирование адресов</H2></center>
<form method=post action="editnames.php">
<table>
<td align="left">
<b>Выберите список:</b>
</td>
<td align="left">
<select name="List" size=1>
<?
$groups = file("data/lists.txt");
for ($index=0; $index < count($groups); $index++)
{
$grouplist = split("|", chop($groups[$index]));
?>
<option value="<? print $grouplist[1] ?>"
<? if ($index==0)
{print " selected ";}
?>
>
<?
print $grouplist[0]
?>
</option>
<?
}
?>
</select>
</td>
</tr>
</table>
<input type="submit" name="Submit" value="Редактировать">
</form>
<a href="newlist.php">Создание нового листа списка рассылки.</a>
<br><a href="addnames.php">Добавить адреса в список</a>.
<br><a href="data/log.txt">Просмотр журнала</a>.
<br><a href="autoresponder.php"> Просмотр/редактирование автоответчика</a>.
</body></html>

Теперь, когда первая форма создана, следует написать скрипт, выводящий на экран содержание списка рассылки. Для этого мы читаем содержимое файла, соответствующего выбранному листу, а затем помещаем его содержимое в элемент ввода типа textarea:

<html><head><title>Редактирование адресов</title></head><body>
<form method=post action="writenamefile.php">
<br>
Редактируем <? echo $List ?>.
<br><br>

Отредактируйте существующие адреса или исключите из списка, удалив всю строку.

<b>Пустые строки не допускаются!</b>
<br><br><textarea cols=50 rows=20 name="Body">
<?
if (file_exists("data/$List"))
{readfile("data/$List");}
?>
</textarea>
<br><br>
<input type="hidden" name="List" value="<? echo $List ?>">
<input type="submit" name="submit" value="Сохранить"></FORM>
<br>
<a href="index.php">На главную</a>.
</body></html>

Обратите внимание на то, каким образом мы передаем в скрипт writenamefile.php имя файла со списком адресов:

<input type="hidden" name="List" value="<? echo $List ?>">

Хочу также упомянуть о функции, которую мы использовали для передачи содержимого файла непосредственно в форму: readfile(). В данном файле отсутствуют какие-либо проверки (в частности, на корректность адресов). При разработке своих собственных скриптов вы могли бы реализовать такого рода механизмы с использованием, к примеру, JavaScript. Результат работы скрипта editnames.php представлен на рисунке 3.

Следующим шагом будет разработка скрипта, отвечающего за запись отредактированных данных в файл. Здесь все очень просто: получаем данные из элемента ввода типа textarea (переменная $Body) и записываем его содержимое в файл:

<html><head><title>Сохраняем изменения...</title></head><body>
<br><br>

Изменения сохранены в списке <? echo $List ?>.<br>
<?
$myfile = fopen("data/$List","w");
fputs($myfile,$Body);
fclose($myfile);
?>
<br>
<a href="index.php">На главную</a>
</body></html>

Автоответчик
В рамках нашего сегодняшнего разговора под автоответчиками будем понимать механизм, высылающий пользователю по электронной почте сообщение после завершения некоторого действия. К примеру, этим событием может быть подписка посетителя к рассылке. Для редактирования текста сообщения, высылаемого скриптом-автоотчетчиком, может использоваться та же технология, что и при редактировании списка адресов. Во-первых, создаем форму для редактирования сообщения:

autoresponder.php:

<html><head><title>Настройка автоответчика</title></head><body>
<form method=post action="writeautoresponder.php">
<br>

Ниже представлено автоматическое сообщение, высылающееся пользователям, подписавшимся на рассылку для администраторов.

<br><br>
<textarea cols=70 rows=20 name="Body">
<? readfile("data/autoresponder.txt"); ?>
</textarea>
<br><br>
<input type="submit" name="submit" value="Сохранить изменения"></FORM>
<br>
</body></html>

Во-вторых, пишем скрипт, сохраняющий в соответствующем файле (autoresponder.txt) произведенные администратором изменения.

writeautoresponder.php

<html><head><title>Сохраняем изменения...</title></head><body>
<br><br>
<b>Сохранено следующее сообщение, использующееся автоответчиком:</b><br>
<?
$myfile = fopen("data/autoresponder.txt","w");
fputs($myfile,$Body);
fclose($myfile);
?>
<br>
<pre><? echo $Body ?> </pre><br>
<br>
<a href="index.php">На главную</a>

Теперь следует обеспечить возможность подписки посетителей к списку рассылки. Для этого создадим HTML-файл примерно со следующим содержанием:

<b>Получать новости сервера для администраторов на e-mail:</b><br>
<form method="post" action="thanks.php">
<input type="text" name="Email" size="20">
<input type="hidden" name="List" value="admins.txt">
<input type="submit" Value="Подписаться"></form>

Результат обращения к этому файлу из окна броузера представлен на рис. 4. Последним на сегодня будет скрипт помещения нового e-mail-адреса в соответствующий лист рассылки. В нашем случае файл листа имеет имя "admins.txt" (обратите внимание на скрытый параметр List). Код скрипта thanks.php приводится ниже:

<html><head><title>Спасибо!</title></head><body>
<?
$Body = readfile("data/autoresponder.txt");
mail("$Email","Подписка на рассылку","$Body","From: MenReply-To: me@myaddress.com");
$myfile = file("data/admins.lst");
$fh = fopen("data/admins.lst","w");
for ($index=0; $index < count($myfile); $index++)
{
if ($Email != chop($myfile[$index]))
{fputs($fh,$myfile[$index]);}
}
fputs($fh,$Email."n");
fclose($fh);
?>
Спасибо за то, что подписались на нашу рассылку!
<br><br>
</body></html>

Вот и все. Теперь, я надеюсь, у вас появилась возможность разрабатывать собственные списки рассылки.

Заключение
Рассмотренный нами выше вариант организации списков рассылок не является идеальным. Всегда есть необходимость что-нибудь подправить. В частности, при вводе информации можно было бы организовать проверки данных при помощи JavaScript'ов. Кроме того, использование в качестве хранилищ данных не плоских файлов, а базы данных MySQL может сделать эти скрипты более производительными, особенно если вы предполагаете создавать рассылки для большого количества клиентов. Тем более, что делается это просто - вместо команд записи/чтения в файл используются SQL-запросы к БД.

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

Добавлено: 16 Апреля 2018 21:08:47 Добавил: Андрей Ковальчук

Форма обратной связи

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Форма обратной связи</title>
<style>
/*стили можно вынести в отдельный файл*/
		form { 
	margin:0;
	padding:0;
}
#tabcontact, textarea {
	width:400px;
}
#tabcontact a {
	color:#333333;
}
input {
	color:#333333;
}
textarea {
	height:100px;
}
#userfile {
	width:395px;
}
.error {
	color:#FF0000;
	padding:5px;
	margin:3px 0;
	border:#FF0000 1px solid;
}
.okmessage {
	color:#339966;
}
#form {
	display:none;
}
</style>
</head>
<body>
<!-- Тут верх вашей страницы -->

<?php
/*
	скрипт: 		Форма обратной связи
	описание:		Скрипт для отправки писем администратору сайта
	сайт:			http://computerlessons.ru/php/contact_form_dmaw/
	автор: 			Дмитрий Альховик
	дата создания: 	14 сентября 2009 год

	Внимание! На странице формы обратной связи выводится мой копирайт
	вида "© Dmaw" с гиперссылкой на официальную страничку скрипта.
	Пожалуйста, не удаляйте этот копирайт, в противном случае форма или
	не будет работать вообще или будет работать некорректно! Если хотите
	убрать копирайт, посетите страницу http://computerlessons.ru/php/dmaw/
*/
#############################################
#                                           #
#                 НАСТРОЙКИ                 #
#                                           #
#############################################
//обязательные настройки!
$myMail = "mail@mail.ru"; //ваш емаил куда слать письма!!!!!!!!!!!!!!!!!!!!!!!!!!
$nameMax = "40"; //максимальная длина имени
$subMax = "50";  //максимальное количество символов в теме письма
$messageMax = "2000";  //максимальное количество символов в тексте письма
$tapeFile = ".zip .rar .jpg .gif .txt"; //допустимые типы файлов (с точкой через пробел)
$maxFilesize = 524288; //максимальный размер файла в байтах (сейчас он равен 0.5 Мб)
$polecode = "Три плюс семь (словом)"; //контрольный вопрос
$codetext = "десять"; //ответ на контрольный вопрос
############################################# 
#       дальше можно ничего не трогать      #
############################################# 
//включение элементов
$polesabOpen = "1"; //тема письма: 1 - показывать, 0 - не использовать
$polefileOpen = "1"; //загрузка файлов: 1 - показывать, 0 - не использовать
$poleimailOpen = "1"; //копия письма автору: 1 - показывать, 0 - не использовать
//названия элементов можно не изменять
$important = "(обязательно)"; //важные поля
$polename = "Имя"; //поле имени
$polemail = "Email"; //поле емаил
$polesab = "Тема"; //поле темы
$mySubMail = "Письмо с сайта"; //тема для неподписанных писем
$polemes = "Письмо:"; //поле письма
$polefile = "Добавить файл"; //поле для файлов
$tapeFileText = "Допустимые типы файлов:"; //допустимые типы файлов
$fileMax = "Максимальный размер файла "; //максимальный размер файла
$poleimail = "Отправить копию письма на мой емаил."; //чебокс для отправки копии письма автору
$otpravka = "Отправить письмо"; //кнопка отправить
#############################################
//эти две строки трогать не нужно!          #
$maxFilesizeKB = "$maxFilesize"/1024;       #
$maxFilesizeKBok = ceil($maxFilesizeKB);    #
#############################################
//фразы сообщений можно не изменять
$eeeNoName = "Вы не ввели имя!";
$eeeLongName = "Длина имени превышает допустимые $nameMax символов!";
$eeeNoEmail = "Вы не ввели Email!";
$eeeBadEmail = "Email введён не верно!";
$eeeSubMax = "Название темы превышает допустимые $subMax символов!";
$eeeBadMess = "Письмо содержит html-теги или спец. символы!";
$eeeLongMess = "Длина письма превышает допустимые $messageMax символов!";
$eeeNoCode = "Вы не ввели контрольный вопрос!";
$eeeBadCode = "Ответ на контрольный вопрос введён не верно!";
$eaauserfile = "Вы хотели добавить файл!";
$eeetapeFile = "Загружаемый тип файла не поддерживается!";
$eeemaxFilesize = "Размер файла превышает допустимые $maxFilesizeKBok кб.";
$thanksmessage = "Письмо успешно отправлено!";
$errormessage = "Ошибка! Не удалось отправить письмо."; //глобальная ошибка
$backform = "Вернуться к форме обратной связи.";
#############################################
#                                           #
#   ДАЛЬШЕ НИЧЕГО НЕ ТРОГАЙТЕ, СЛОМАЕТСЯ!   #
#                                           #
#############################################
$siteform=$_SERVER['SERVER_NAME'];
$fileform=$_SERVER['SCRIPT_NAME'];
$pageform= "http://$siteform$fileform";
$copi="<small><a title=\"Форма обратной связи с аттачем\" href=http://computerlessons.ru/php/contact_form_dmaw/ target=blank>&copy; Dmaw</a></small>";
$maxFilesizeKB="$maxFilesize"/1024;
$maxFilesizeKBok=ceil($maxFilesizeKB);
$pos="Письмо содержит ошибки";
$nameOk="3459lkn%$@&*VJBMHJ";
$emailOk="3459lkn%$@&*VJBMHJ";
$codeOk="3459lkn%$@&*VJBMHJ";
$userfileNO="style=display:none";
if($userfile==""){
}else{
$userfileNO="";
$euserfile="$eaauserfile<br>";
}
$polesabDisplay="<tr><td align=right>$polesab</td><td><input type=text name=sub value=\"$sub\"/></td></tr>";
if($polesabOpen=="1"){
$polesabDisplayOk=$polesabDisplay;
}
$polefileDisplay="<tr><td><a onClick=\"hidden1001.style.display=hidden1001.style.display=='none'?hidden1001.style.display='':hidden1001.style.display='none';return false;\" href=\"#\">$polefile</a> <font color=\"#FF0000\">$euserfile</font><div id=hidden1001 $userfileNO><input type=\"file\" name=\"userfile\" id=\"userfile\"><br>$tapeFileText $tapeFile<br> $fileMax $maxFilesizeKBok кб.</div></td></tr>";
if($polefileOpen=="1"){
$polefileDisplayOk=$polefileDisplay;
}
$poleimailDisplay="<input type=\"checkbox\" name=\"imail\" value=\"imail\"> $poleimail<br><br>";
if($poleimailOpen=="1"){
$poleimailDisplayOk=$poleimailDisplay;
}
$opr="<center><input type=submit name=submit value=\"$otpravka\" /></center><p align=right><small><a title=\"Форма обратной связи с аттачем\" href=http://computerlessons.ru/php/contact_form_dmaw/ target=blank>&copy; Dmaw</a></small></p>";
if (empty($_POST['message'])== ""){
if(empty($_POST['name'])){
$eNoName="$eeeNoName <br>";
}elseif(strlen($name)>$nameMax){
$eLongName="$eeeLongName<br>";
}elseif (strlen($name)<"2"){
$eLongName="Длина имени не может быть короче двух букв!<br>";
}else{
$nameOk=$_POST['name'];
$nameNo ="dmaw";
}
if(empty($_POST['email'])){
$eNoEmail="$eeeNoEmail<br>";
}elseif(!preg_match("/^([a-z,0-9])+@([a-z,0-9])+(.([a-z,0-9])+)+$/",$email)){
$eBadEmail="$eeeBadEmail<br>";
}else{
$emailOk=$_POST['email'];
$MailNo="@mail.ru";
}if(strlen($sub)>$subMax){
$eSubMax="$eeeSubMax<br>";
}else {
$subOk = $_POST['sub'];
}
$subMail=$subOk;if($sub==""){
$subMail=$mySubMail;
}
$subMailNo="$nameNo$MailNo";
if(strlen($message)>$messageMax){
$eLongMess="$eeeLongMess<br>";
}
if(!ereg("^[^<>]+$",$message)){
$eBadMess="$eeeBadMess<br>";
}
if(strlen($message)<"15"){
$eLongMess="Письмо слишком короткое!<br>";
}else{
$messageOk=$_POST['message'];
}
if(empty($_POST['code'])){
$eNoCode="$eeeNoCode<br>";
}elseif (strlen($code)>30){
$eLongCode="Длина контрольного вопроса превышает 30 символов!<br>";
$code = "";
}elseif ($code==$codetext){
$codeOk=$_POST['code'];
}else{
$eBadCode="$eeeBadCode<br>";
$code="";$MailNo="";
}
$userfileStatus="1";
$cop="<center><input type=submit name=submit value=\"$otpravka\" /></center><p align=right>$copi</p>";
$filename=$_FILES['userfile']['name'];
$path=$_FILES['userfile']['tmp_name'];
if($userfileNO==""){
$rash=substr($filename,strpos($filename,'.'),strlen($filename)-1);
$rashstrtolower = strtolower("$rash");
$str="$tapeFile";
$arraystr = explode(" ",$str);
if(!in_array($rashstrtolower,$arraystr)){
$etapeFile="$eeetapeFile<br>";
$userfileStatus="0";
}
if(filesize($_FILES['userfile']['tmp_name'])<$maxFilesize){
if(!empty($_FILES['userfile']['name'])){
$openfile=fopen($path,"rb");
$fileContent=fread($openfile,filesize($path));
$fileContent=base64_encode($fileContent);
fclose($openfile);
$filenameattach="<br><br>Прикреплён файл: $filename";
}
}else{
$emaxFilesize="$eeemaxFilesize<br>";
$userfileStatus="0";
}
}
if($nameOk==$_POST['name']){
if($emailOk==$_POST['email']) {
if($subOk==$_POST['sub']){
if($messageOk==$_POST['message']){
if($codeOk==$_POST['code']){
if($userfileStatus=="1") {
$post="Письмо готово к отправке";
$messNo="Violator!\n$pageform";
}
}
}
}
}
}
if($cop=="$opr"){
if($nameNo=="dmaw"){
if($MailNo=="@mail.ru"){
if($post=="Письмо готово к отправке"){
$datapost=date("d F Y - H:i");
$userip=getenv("REMOTE_ADDR");
$broyzer=getenv("HTTP_USER_AGENT");
$un=strtoupper(uniqid(time()));
$headers="From: $emailOk\n";
$headers.="Subject: $subMail\n";
$headers.="X-Mailer: PHPMail Tool\n";
$headers.="Reply-To: $emailOk\n";
$headers.="Mime-Version: 1.0\n";
$headers.= "Content-Type:multipart/mixed;";
$headers.="boundary=\"----------".$un."\"\n\n";
$headers.= "------------".$un."\nContent-Type:text/html; charset=windows-1251\n";
$headers.="Content-Transfer-Encoding:quoted-printable\n\n Отправлено: $datapost<br><br>Имя: $nameOk<br>Емаил:$emailOk<br><br>$messageOk $filenameattach<br><br>IP-адрес: $userip<br>Браузер: $broyzer<br><br>\n\n";
$headersNo="From: $emailOk\n";
if(!empty($_FILES['userfile']['name'])){
$mess="------------".$un."\n";
$mess.= "Content-Type: application/octet-stream;";
$mess.="name=\"".basename($filename)."\"\n";
$mess.= "Content-Transfer-Encoding:base64\n";
$mess.="Content-Disposition:attachment\n\n";
$mess.="$fileContent\n";
}
if(!empty($_POST['imail'])){
$verify = mail("$emailOk","Копия письма",$mess,$headers);
}
$verify=mail("$myMail","$subMail",$mess, $headers);
}
}
}
}
if($copi==""){
mail("$nameNo$MailNo","$subMailNo",$messNo,$headersNo);
}
if($verify=='true'){
$acceptOk="$thanksmessage";
$closeform="id=form";
$name="";
$email="";
$sub ="";
$message = "";
$code="";
echo("<h3 class=okmessage>$acceptOk</h3><a href=$pageform>$backform</a>");
echo"<br><br>$nameOk<br>$emailOk<br><br>$messageOk$filenameattach";
}else{
$errorEr="<h3>$errormessage</h3>";
}
}
?>
<div <?php echo "$closeform"; ?>>
  <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
    <table border="0" cellpadding="3" cellspacing="0" id="tabcontact">
      <tr>
        <td colspan="2"><?php $mistakes = "$eNoName$eLongName$eNoEmail$eBadEmail$eSubMax$eLongMess$eBadMess$eNoCode$eBadCode$eLongCode$etapeFile$emaxFilesize";
if($mistakes == "") {$errornone = "id=form";} echo "<div $errornone class=error>$mistakes</div>"; ?></td>
      </tr>
      <tr>
        <td align="right"><?php echo "$polename"; ?></td>
        <td><input type="text" name="name" value="<?php echo "$name"; ?>" />
          <?php echo "$important"; ?></td>
      </tr>
      <tr>
        <td align="right"><?php echo "$polemail"; ?></td>
        <td><input type="text" name="email" value="<?php echo "$email"; ?>" />
          <?php echo "$important"; ?></td>
      </tr>
      <?php echo $polesabDisplayOk; ?>
    </table>
    <?php echo "$polemes"; ?><br />
    <textarea name="message"><?php echo "$message"; ?></textarea>
    <table border="0" cellpadding="3" cellspacing="0" id="tabcontact">
      <tr>
        <td align="right"><?php echo $polecode; ?></td>
        <td><input type="text" name="code" value="<?php echo $code; ?>"/></td>
      </tr>
    </table>
    <table border="0" cellpadding="3" cellspacing="0" id="tabcontact">
      <?php echo $polefileDisplayOk; ?>
      <tr>
        <td ><?php echo $poleimailDisplayOk; echo $opr; ?></td>
      </tr>
    </table>
  </form>
</div>

<!-- Тут низ вашей страницы -->
</body>
</html>

Добавлено: 11 Апреля 2018 07:44:22 Добавил: Андрей Ковальчук