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

Форум PHP

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

 

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

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

тема: Добавить "Сообщение отправлено" и "сообщение не отправлено"
 
 автор: fxsektor   (10.07.2007 в 10:06)   письмо автору
 
 

Здесь есть, очень ценный скрипт, я и форму и обработчик разместил на странице send.php
но проблема в том, что скрипт отправляет, но не дает отчета, отправил он его или нет
а как это сделать?
http://softtime.ru/scripts/mailattach.php

   
 
 автор: wolfandman   (10.07.2007 в 10:32)   письмо автору
 
   для: fxsektor   (10.07.2007 в 10:06)
 

Я немного переделал конечную часть скрипта:


if(!mail($mail_to, $thema, $multipart, $headers))
{return False; //если не письмо не отправлено
echo "Письмо не отправлено!";
}
else { //// если письмо отправлено
echo "Ура! Письмо отправлено успешно!";
return True;
}
exit;
}

   
 
 автор: fxsektor   (10.07.2007 в 11:50)   письмо автору
 
   для: wolfandman   (10.07.2007 в 10:32)
 

Проверь у себя, у меня не работает :(

   
 
 автор: wolfandman   (10.07.2007 в 12:29)   письмо автору
 
   для: fxsektor   (10.07.2007 в 11:50)
 

А, я понял. То что я выше писал - это функция, которая даже не вызывается.
Вот этот код рабочий, правда не очень элегантный. Я проверил
<?php 
  
if(empty($_POST['mail_to'])) exit("Введите адрес получателя"); 
  
// проверяем правильности заполнения с помощью регулярного выражения 
  
if (!preg_match("/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i"$_POST['mail_to'])) exit("Введите адрес в виде somebody@server.com"); 
  
$picture ""
  
// Если поле выбора вложения не пустое - закачиваем его на сервер 
  
if (!empty($_FILES['mail_file']['tmp_name'])) 
  { 
    
// Закачиваем файл 
    
$path $_FILES['mail_file']['name']; 
    if (
copy($_FILES['mail_file']['tmp_name'], $path)) $picture $path
  } 
  
$thm $_POST['mail_subject'];
  
$msg $_POST['mail_msg'];
  
$mail_to $_POST['mail_to'];
  
// Отправляем почтовое сообщение 
  
if(empty($picture)) {$mail=mail($mail_to$thm$msg); if ($mail) echo "ПИСЬМО ОТПРАВЛЕНО (без вложений)"; else echo "ПИСЬМО НЕ ОТПРАВЛЕНО";}
  
  else {
$send_mail=send_mail($mail_to$thm$msg$picture);
  if (
$send_mail) echo "ПИСЬМО ОТПРАВЛЕНО (с вложением)"; else echo "ПИСЬМО НЕ ОТПРАВЛЕНО";}
  
  
  
// Вспомогательная функция для отправки почтового сообщения с вложением (Trianon)
  
function send_mail($mail_to$thema$html$path)   
  { if (
$path) {  
    
$fp fopen($path,"rb");   
    if (!
$fp)   
    { print 
"Cannot open file";   
      exit();   
    }   
    
$file fread($fpfilesize($path));   
    
fclose($fp);   
    }  
    
$name "file.ext"// в этой переменной надо сформировать имя файла (без всякого пути)  
    
$EOL "\r\n"// ограничитель строк, некоторые почтовые сервера требуют \n - подобрать опытным путём
    
$boundary     "--".md5(uniqid(time()));  // любая строка, которой не будет ниже в потоке данных.  
    
$headers    "MIME-Version: 1.0;$EOL";   
    
$headers   .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL";  
    
$headers   .= "From: address@server.com";  
      
    
$multipart  "--$boundary$EOL";   
    
$multipart .= "Content-Type: text/html; charset=windows-1253$EOL";   
    
$multipart .= "Content-Transfer-Encoding: base64$EOL";   
    
$multipart .= $EOL// раздел между заголовками и телом html-части 
    
$multipart .= chunk_split(base64_encode($html));   

    
$multipart .=  "$EOL--$boundary$EOL";   
    
$multipart .= "Content-Type: application/octet-stream; name=\"$name\"$EOL";   
    
$multipart .= "Content-Transfer-Encoding: base64$EOL";   
    
$multipart .= "Content-Disposition: attachment; filename=\"$name\"$EOL";   
    
$multipart .= $EOL// раздел между заголовками и телом прикрепленного файла 
    
$multipart .= chunk_split(base64_encode($file));   

    
$multipart .= "$EOL--$boundary--$EOL";   
      
if(!
mail($mail_to$thema$multipart$headers)) 
{return 
False//если не письмо не отправлено

else { 
//// если письмо отправлено
return True

exit; 
}
?>

   
 
 автор: Hidden Demon   (10.07.2007 в 19:08)   письмо автору
 
   для: wolfandman   (10.07.2007 в 12:29)
 

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


forma.php:
<form action="send.php">....</form>

send.php:
<?
session_start
();
...
if (
mail(...))
{
 
$_SESSION['send_result'] = 'сообщение отправлено';
} else
{
 
$_SESSION['send_error'] = 'тут список ошибок';
}
?>
<html>
<head>
<meta http-equiv="Refresh" content="0; URL=<?=$_SERVER['HTTP_REFERER']?>" />
</head>
</html>

forma.php:
session_start();
...
$send_result = @$_SESSION['send_result'];
if (!empty($send_result)) unset($_SESSION['send_result']);
$send_error = @$_SESSION['send_error'];
if (!empty($send_error)) unset($_SESSION['send_error']);
...
if (!empty($send_result)) echo '<span style="color: green;">'.$send_result.'</span>';
if (!empty($send_error)) echo '<span style="color: red;">'.$send_error.'</span>';
...


какие плюсы:
- избавляемся от ненужных флажков, если результат операции передовать с помощью GET (не портим адресную строку)
- можем записать в сессионную переменную все что угодно, т.е. во время обработки пишем туда текст ошибки, а не какой-то код, а при выводе просто выводим текст переменной, а не ковыряемся к какому коду ошибки какое сообщение писать
- избавляемся от вероятного 2го раза отработки скрипта после выдачи результатов
- это работает ;)

   
Rambler's Top100
вверх

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