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

Форум PHP

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

 

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

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

тема: Отправка письма с вложениями
 
 автор: ED   (08.11.2009 в 09:18)   письмо автору
 
 

Здравствуте все. В книге да и на самом форуме выложен код отправки письма с вложением. Попробовал сделать письмо с двумя вложениями, не получается, У меня вопрос как это можно сделать, если например надо отправить два или три вложения в одном письме.

  Ответить  
 
 автор: cheops   (14.11.2009 в 12:39)   письмо автору
 
   для: ED   (08.11.2009 в 09:18)
 

Возможно вас заинтересует тема по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=53968

  Ответить  
 
 автор: ED   (04.12.2009 в 15:03)   письмо автору
 
   для: cheops   (14.11.2009 в 12:39)
 

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


<?php

$picture = "";

// Закачиваем файл на сервер
if (!empty($_FILES['anketa_photo3']['tmp_name']))
{
$path = $_FILES['anketa_photo3']['name'];
if (copy($_FILES['anketa_photo3']['tmp_name'], $path)) {$picture = $path;}
}


// Отправляем почтовое сообщение
if(empty($picture)) mail($mail_to, $thm, $msg);
else send_mail($mail_to, $thm, $msg, $path);


// Вспомогательная функция для отправки почтового сообщения с вложением
function send_mail($mail_to, $thm, $msg, $path)
{
if ($path)
{
$fp = fopen($path,"rb");
if (!$fp)
{
print "<p align=center class=colorWarning><font size=4 color=#FF0000>Файл $path не может быть прочитан</font></p>";
exit();
}
$file = fread($fp, filesize($path));
fclose($fp);
}

//именя файла без пути
$name = $path;

//ограничитель строк
// $EOL = "r\n";
$EOL = (substr (PHP_OS, 0, 3) != "WIN") ? "\n" : "r\n";

// генерируем разделитель
$boundary = "--".md5(uniqid(time()));
$headers = "MIME-Version: 1.0;$EOL";
$headers .= "Content-Type: multipart/mixed; boundary = \"$boundary\"$EOL";
$headers .= "From: crazybox@yandex.ru";

$multipart = "--$boundary$EOL";
$multipart .= "Content-Type: text/html; charset = windows-1251$EOL";
$multipart .= "Content-Transfer-Encoding: base64$EOL";
$multipart .= $EOL;
$multipart .= chunk_split(base64_encode($msg));

$multipart = "$EOL--$boundary$EOL";
$multipart .= "Content-Type: application/octet-stream; name = \"$name\"$EOL";
$multipart .= "Content-Transfer-Encoding: base64$EOL" . $EOL;
$multipart .= "Content-Disposition: attachment; filename = \"$name\"$EOL";
$multipart .= $EOL;
$multipart .= chunk_split(base64_encode($file));
$multipart .= "$EOL--$boundary--$EOL";
}






if(!mail($mail_to, $thm, $multipart, $headers))
{
exit ("<p align=center class=colorWarning><font size=4 color=#FF0000>К сожалению, анкета не отправлена</font><br/><br/><font size=3 color=#FF0000>Попробуйте отправить анкету через некоторое время</font></p>");
}
else
{
exit ("<p align=center class=colorWarning><font size=4 color=#CCCCCC>Ваша анкета отправлена</font></p>");
}

?>

  Ответить  
 
 автор: extonec   (04.12.2009 в 15:47)   письмо автору
 
   для: ED   (04.12.2009 в 15:03)
 

могу помочь, сам как то мучался, тут мне не помогли, для начала приведите пример из html формы а именно строки инпут для файлов, и если вы используете js скрипт типа multi-file-upload (название примерно), то тоже укажите какие, заранее предположу что скорее всего собака зарыта в теге инпут там имя нужно присваивать в таком виде: name="attachfile[]"
ключевое значение [], я в php мало понимаю, но могу посоветовать еще если это не поможет посмотреть что содержит в себе массив $_FILES методом вывода print($_FILES); что бы определить передает ли он два имени и содержимого из формы

// если был файл, то прикрепляем его к письму
        if(isset($_FILES['attachfile']['name'][0])) {
                    if($_FILES['attachfile']['error'][0] == 0){
                    $mail->AddAttachment($_FILES['attachfile']['tmp_name'][0], $_FILES['attachfile']['name'][0]);
                    }
        }
        if(isset($_FILES['attachfile']['name'][1])) {
                    if($_FILES['attachfile']['error'][1] == 0){
                    $mail->AddAttachment($_FILES['attachfile']['tmp_name'][1], $_FILES['attachfile']['name'][1]);
                    }
        }

  Ответить  
 
 автор: ED   (04.12.2009 в 18:48)   письмо автору
 
   для: extonec   (04.12.2009 в 15:47)
 

Здесь форма ввода смесь JAWA, PHP и HTML.
///////////////////////////////////////////////////////

фрагмент HTML (форма ввода)


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- saved from url=(0014)about:internet -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Gold model. Анкета.</title>
<meta http-equiv="autor" content="EMD" />
<meta http-equiv="Keywords" content="" />
<meta http-equit="DESCRIPTION" content="Gold-model" />
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
//////Проверка форм перед отправкой ONCLICK="return validate(this.form)"
function validate(form) {
if (!form.anketa_photo3.value) {
alert('Пожалуйста, вложите вашу фотографию')
return false
}
}
</SCRIPT>
</head>
<body>
<?php
// Обработчик HTML-формы
if(!empty($_POST))
{
include "anketa_check.php";
}
?>

<form enctype='multipart/form-data' method="post" >
<table align="right" width="900" height="750" border="0" cellspacing="30" cellpadding="0" <?php echo "background=images/background$n.jpg"; ?> >
<tr>
<td align="right" valign="middle" width="50%">

span class="colorBrick">Фотография (свободная тема)</span>

</td>
<td align="left" valign="middle" width="50%">

<input type=file class="colorHederGo" name="anketa_photo3" maxlength=64 <?php echo "value='$f8'"; ?> >

<input name="submit" type="submit" class="colorHederGo" value='Отправить анкету' ONCLICK="return validate(this.form)" />

</td>
</tr>
</table>
</form>

</body>
</html>



/////////////////////////////////
Затем идет файл проверки и подготовки к отправке аnketa_check.php
/////////////////////////////////
<?php
//Различные проверки

$f8 = "$anketa_photo3";

//Подготовка к отправке
$mail_to = "crazybox@yandex.ru";
$thm = "Анкета";
$msg = "$fio \n$data \n$pol \n$massa \n$rost \n$grud_plecho \n$talia \n$bedra \n$gorod \n$phone";

@include ("anketa_go.php");

?>

///////////////////////////////////////////////
после этого, файл отправки сообщения anketa_go.php (код которого был приведен до этого)
Вроде все просто но???????????
//////////////////////////////////////////////

  Ответить  
 
 автор: Slo_Nik   (05.12.2009 в 00:41)   письмо автору
 
   для: ED   (04.12.2009 в 18:48)
 

Вам надо отправить письмо с несколькими вложениями?
если да, то в форме , для input type='file' имя задайте name='file[]', потом с помощью цикла for вы загружаете файлы на сервер, используя при этом move_uploaded_file(), а не copy().
Если Вы не прикрепляете файл к письму, само письмо приходит по назначению?

  Ответить  
 
 автор: ED   (05.12.2009 в 09:15)   письмо автору
 
   для: Slo_Nik   (05.12.2009 в 00:41)
 

Суть анкеты такова, что информация без фото не представляет интерес,. Просто письмо приходит. Я даже пробовал заменить
else send_mail($mail_to, $thm, $msg, $path);
на
else mail($mail_to, $thm, $msg, $path);
в этом случае приходит письмо и имя файла без пути. А насчет количества вложений, мне уже хотя бы одно отправлялось, как положено

  Ответить  
 
 автор: Slo_Nik   (05.12.2009 в 13:27)   письмо автору
 
   для: ED   (05.12.2009 в 09:15)
 

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

  Ответить  
 
 автор: ED   (05.12.2009 в 15:37)   письмо автору
 
   для: Slo_Nik   (05.12.2009 в 13:27)
 

Нет отдельная директория не создана. Да еще хотел сказать, что на сервер фото загружается. Мне кажется, что дело в заголовках.

  Ответить  
 
 автор: Slo_Nik   (06.12.2009 в 00:15)   письмо автору
 
   для: ED   (05.12.2009 в 15:37)
 

в этой строке $EOL = (substr (PHP_OS, 0, 3) != "WIN") ? "\n" : "r\n"; пропущен слеш, допишите "\r\n".
на мой взгляд в этой строке лишнее (выделил жирным)
$multipart .= "Content-Transfer-Encoding: base64$EOL" . $EOL;

  Ответить  
 
 автор: ED   (08.12.2009 в 15:18)   письмо автору
 
   для: Slo_Nik   (06.12.2009 в 00:15)
 

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

  Ответить  
 
 автор: GeorgeIV   (08.12.2009 в 16:07)   письмо автору
 
   для: ED   (08.12.2009 в 15:18)
 

Может у адресата просто режутся вложения?

  Ответить  
 
 автор: Slo_Nik   (08.12.2009 в 16:16)   письмо автору
 
   для: ED   (08.12.2009 в 15:18)
 

у Вас вывод уровень ошибок выставлен?

>Может у адресата просто режутся вложения?

попробуйте на разные адреса отослать письмо, хотя я думаю результат будет тот же...

вынисете функцию send_mail в отдельный файл и подключите её до вызова в скрипте

  Ответить  
 
 автор: ED   (08.12.2009 в 17:39)   письмо автору
 
   для: Slo_Nik   (08.12.2009 в 16:16)
 

Попробовал. Все устал боротся. Плохо если, что то не допонимаешь (в силу нехватки знаний). У меня большая просьба, если у кого есть проверенный рабочий скрипт и если не жалко, вышлите пожалуйста. Заранее благодарен.

  Ответить  
 
 автор: Slo_Nik   (08.12.2009 в 19:07)   письмо автору
 
   для: ED   (08.12.2009 в 17:39)
 

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

  Ответить  
 
 автор: ED   (08.12.2009 в 20:24)   письмо автору
5 Кб
 
   для: Slo_Nik   (08.12.2009 в 19:07)
 

Полностью вся анкета в архиве

  Ответить  
 
 автор: Slo_Nik   (08.12.2009 в 22:07)   письмо автору
151.8 Кб
 
   для: ED   (08.12.2009 в 20:24)
 

я же Вам писал, что надо выставить уровень ошибок!!!
вот поэтому у Вас и идут проблемы.
получается, что у Вас не инициализированная переменная $picture, в которой имя файла. это в файле anketa_go.php.
в файле anketa.php не инициализированная переменная $LayerText и переменная $n на строке 106, которая вообще не понятно откуда берётся.
и ещё куча неинициализированных переменных.
скрин прилагаю.
инициализируйте переменные.
и зачем Вам ставить подавление ошибок перед include ?

  Ответить  
 
 автор: Slo_Nik   (08.12.2009 в 22:16)   письмо автору
 
   для: ED   (08.12.2009 в 20:24)
 

<input type="text" class="mail" name="anketa_rost" size="10" maxlength="6" ONKEYPRESS="return numOnly(event)" <?php echo "value='$f2'"; ?> > и зачем так присваивать значение атрибуту value ?

<input type="text" name="name" value="<?php echo $f1 ?>"> так будет правильней

  Ответить  
 
 автор: Slo_Nik   (08.12.2009 в 22:31)   письмо автору
 
   для: ED   (08.12.2009 в 20:24)
 

по файлу anketa_go.php
в этом файле, после отправки сообщения, получаются не инициализированые переменные $headers и $multipart, насколько я понимаю из-за того, что Вы пытаетесь их использовать вне функции, где они определены, Вы их вынесли за границы функции.
и поэтому в значении у них " ";
обращаться к ним надо внутри функции
поэтому вложение и не попадает с сообщение.

<?php
function send_mail($mail_to$thm$msg$path){
// тут вы подготавливаете файл к отправке, формируете заголовки и т.д
 
.......................................................................................
........................................................................................
....................................................................................... 
   
// тут отправляете само сообщение
  
if(!mail()){
    return 
false;
  }
  else{
   return 
true;
  }
}
?>

а текст письма у Вас приходит потому, что вы до функции send_mail присвоили значение этим переменным $mail_to, $thm

  Ответить  
 
 автор: ED   (09.12.2009 в 06:55)   письмо автору
 
   для: Slo_Nik   (08.12.2009 в 22:31)
 

После работы попробую все исправить и большое Вам спасибо, что уделили мне время.

  Ответить  
 
 автор: ED   (09.12.2009 в 19:53)   письмо автору
 
   для: ED   (09.12.2009 в 06:55)
 

Спасибо Slo_Nik . Вся проблема была в последнем файле anketa_go.php.
Во первых как вы сказали я вынес переменные $headers и $multipart за границу функции.
Во вторых переменную $EOL в некоторых строках скрипта надо ставить через пробел
В третьих я заменил строку
$multipart .= chunk_split(base64_encode($msg));
на
$multipart .= $msg;
И все заработало.
У меня к вам вот какой вопрос. Корректно ли будет выглядеть построение файла temp.php.

<script >
--код--
</script>
<html>
<head>
<meta>
<meta>
</head>
<body>
--код--
</body>
</html>

Если не корректно, то почему?
А так в принципе все работает.

  Ответить  
 
 автор: Slo_Nik   (09.12.2009 в 23:39)   письмо автору
 
   для: ED   (09.12.2009 в 19:53)
 

как я понимаю, в файле temp.php Вы хотите вставить код javascript?
если да, то скрипт разместите или в head или body , всё зависит от конкретной ситуации

  Ответить  
Rambler's Top100
вверх

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