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

Форум PHP

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

 

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

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

тема: отправка письма с вложением
 
 автор: inga   (29.11.2009 в 23:46)   письмо автору
 
 

Почитала тут на форуме эту тему, но своего вопроса так и не нашла. Я хочу отправить письмо с вложенным файлом и текстом в самом письме. Вот тут прочитала как отправлять вложенный фаил http://softtime.ru/scripts/mailattach.php. Но тут пример отправки только файла, а как сделать чтобы в письме еще и текст был?
Я пробывала просто добавть строку в переменную
$multipart .= "Привет! Это Инга!";
но это ничего не дало, вложенный фаил приходит а текста "Привет! Это Инга!" нет в письме.
Подскажите как быть?

  Ответить  
 
 автор: Trianon   (29.11.2009 в 23:58)   письмо автору
 
   для: inga   (29.11.2009 в 23:46)
 

текст можно добавить к содержимому переменной $msg . Нет?
Кстати в самом примере этот текст формируется из поля <textarea> формы ввода.

  Ответить  
 
 автор: sim5   (30.11.2009 в 07:00)   письмо автору
 
   для: inga   (29.11.2009 в 23:46)
 

>Я хочу отправить письмо с вложенным файлом и текстом в самом письме

В смысле не прикрепленный файл, а файл в теле письма?

  Ответить  
 
 автор: inga   (30.11.2009 в 08:50)   письмо автору
 
   для: sim5   (30.11.2009 в 07:00)
 

хочу чтобы было в письме написано "Привет! Это инга!", а потом был тут же прикрепленный фаил.

  Ответить  
 
 автор: sim5   (30.11.2009 в 08:59)   письмо автору
 
   для: inga   (30.11.2009 в 08:50)
 

Ну тогда Trianon сказал все, я думал вы о вложении непосредственно в тело письма.

  Ответить  
 
 автор: inga   (30.11.2009 в 09:23)   письмо автору
 
   для: sim5   (30.11.2009 в 08:59)
 

я проще спрошу по другому, вот код

           $userfile = $HTTP_POST_FILES['myfile']['tmp_name'];
           $userfile_size = $HTTP_POST_FILES['myfile']['size'];
           $userfile_name = $HTTP_POST_FILES['myfile']['name'];
           $ext = strrchr($_FILES['myfile']['name'], ".");
           $name = substr($userfile_name, 0, strpos($userfile_name, '.'));
           $img = $userfile_name;
           $img1 = $name."n".$ext;
           if(!is_dir("../../napol/users_price/fale/"))
           mkdir("../../napol/users_price/fale/");
           chmod ("../../napol/users_price/fale/", 0777);
           move_uploaded_file($userfile, "../../napol/users_price/fale/".$userfile_name)
                  chmod ("../../napol/users_price/fale/", 0755);
        
$name="../../napol/users_price/fale/".$HTTP_POST_FILES['myfile']['name'];

$header="From: my@mail.ru\nReply-To: my@mail.ru\n"; 
$header.="Content-Type: multipart/mixed; boundary=\"$boundary\""; 
$body=""; 
  GLOBAL $boundary,$body,$header; 
  $file=fopen($name,"r"); 
  $text=fread($file, $userfile_size); 
  fclose($file); 
  $body.="--$boundary\n"; 
  $body.="Content-Type: application/octet-stream; name==?windows-1251?B?". base64_encode($userfile_name). "?=\n"; 
  $body.="Content-Transfer-Encoding: base64\n";
  $body.="Content-Disposition: attachment; filename==?windows-1251?B?". base64_encode($userfile_name). "?=\n\n"; 
  $body.=chunk_split(base64_encode($text))."\n"; 
mail("inga@ukr.net","test",$body,$header);

как мне тут добавить чтобы в письме было перед файлом "Привет! Это инга!"?
я пробывала сделать так:
           $userfile = $HTTP_POST_FILES['myfile']['tmp_name'];
           $userfile_size = $HTTP_POST_FILES['myfile']['size'];
           $userfile_name = $HTTP_POST_FILES['myfile']['name'];
           $ext = strrchr($_FILES['myfile']['name'], ".");
           $name = substr($userfile_name, 0, strpos($userfile_name, '.'));
           $img = $userfile_name;
           $img1 = $name."n".$ext;
           if(!is_dir("../../napol/users_price/fale/"))
           mkdir("../../napol/users_price/fale/");
           chmod ("../../napol/users_price/fale/", 0777);
           move_uploaded_file($userfile, "../../napol/users_price/fale/".$userfile_name)
                  chmod ("../../napol/users_price/fale/", 0755);
        
$name="../../napol/users_price/fale/".$HTTP_POST_FILES['myfile']['name'];

$header="From: my@mail.ru\nReply-To: my@mail.ru\n"; 
$header.="Content-Type: multipart/mixed; boundary=\"$boundary\""; 
$body=""; 
  GLOBAL $boundary,$body,$header; 
  $file=fopen($name,"r"); 
  $text=fread($file, $userfile_size); 
  fclose($file); 
  $body.="--$boundary\n"; 
  $body.="Content-Type: application/octet-stream; name==?windows-1251?B?". base64_encode($userfile_name). "?=\n"; 
  $body.="Content-Transfer-Encoding: base64\n";
  $body.="Content-Disposition: attachment; filename==?windows-1251?B?". base64_encode($userfile_name). "?=\n\n"; 
  $body.=chunk_split(base64_encode($text))."\n"; 
  $body.="Привет! Это Инга!"."\n"; 
mail("inga@ukr.net","test",$body,$header);

фаил приходит а этих слов в письме нет

  Ответить  
 
 автор: GeorgeIV   (30.11.2009 в 09:53)   письмо автору
 
   для: inga   (30.11.2009 в 09:23)
 

/

  Ответить  
 
 автор: sim5   (30.11.2009 в 11:03)   письмо автору
 
   для: inga   (30.11.2009 в 09:23)
 

Зачем объявлять тело, заголовок и разделитель глобальными?
Сперва формируете заголовок сообщения. Затем формируете тело сообщения, затем подключаете файл (это все тело сообщения), определяя, естественно, для каждой этой части заголовок.
Затем отдаете функции mail:
mail(адрес, отправитель, тело сообщения, заголовок).
Почтовое сообщение это иерархия, если оно содержит несколько частей разных типов. Для информации:

Content-type: multipart/???

С этим заголовком знаком любой разработчик, которому доводилось решать проблемы отправки писем с вложениями или HTML письмами. И зачастую письма, сформированные без использования библиотек вроде PEAR::Mail_mime отображаются не очень корректно. Практика показывает, что если при формировании письма жестко придерживаться стандарта, которы задается в RFC (в частности - RFC 2046 http://ietf.org/rfc/rfc2046.txt) - подавляющее большинство клиентских программ (включая таких любителей придерживаться стандартов, как Mozilla Thunderbird) отображает письмо корректно. Далее мы будем исходить из того, что читатель этого документа представляет себе основной синтаксис команд и понимает, что таке boundary и почему необходимо указывать Content-type для каждой из частей письма. Постараемся отметить основные ошибки.

Ошибка первая - неверный subtype

Тип multipart имеет три субтипа - mixed, alternative и related, которые используются синтаксически одинаково, но имеют разное предназначение
mixed - используется, когда в рамках одного почтового сообщения имеется несколько независимых друг от друга, и равнозначных частей. Самый простой пример такого письма - сообщение с вложением.
alternative - используется, когда в одном почтовом сообщении содержится несколько частей, содержащих одну и ту же информацию, предназначенную для отображения на различном клиентском ПО - например текстовая и HTML версия одного и того же письма.
related - используется, когда в одном почтовом сообщении содержится несколько частей, формирующих один итоговый документ. Яркий пример - HTML письмо с картинками. Запомните, по стандарту только в этом случае должны работать ссылки на Contend-id элементов (вида <img src="cid:image">).
Помните и применяйте по назначению.

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

Порядок частей, в котором они указаны в письме, зачастую имеет ключевое значения для того, как будет отображаться сообщение у клиента.
mixed - порядок частей для наших задач не имеет значения.
alternative - части должны быть расставлены по порядку, от более простых к более сложным. RFC регламентирует процесс выбора одной из версий письма клиентом пользователя примерно так: "В общем случае, почтовый клиент должен отображать последнюю доступную ему версию документа". Т.е. при формировании текстовой и HTML-версий письма необходимо вперед поставить текстовую.
related - первой в очереди должна идти основная часть (HTML документ, например). Следом - все остальные. По большому счету, стандартом регламентирован специальный параметр "start", который указывает на основную часть документа, но этим лучше не злоупотреблять.

Ошибка третья - выбор только одного субтипа

Зачастую разработчик, формирующий из программы письмо забывает, что любая из частей письма может так же иметь Content-type: multipart, а значит можно выстроить некоторое подобие древовидной структуры, гарантирующей, что каждая из частей письма займет правильное место. Вот как примерно может выглядеть структура письма, имеющего текстовую и HTML версию (HTML с картинками), а так же приложенный документ MS Word:


Content-type: multipart/mixed 
  Content-type: multipart/alternative 
    Content-type: text/plain 
    Content-type: multipart/related 
      Content-type: text/html 
      Content-type: image/jpeg 
      Content-type: image/jpeg
  Content-type: application/msword


Пара рекомендаций

Всегда делайте text/plain вариант письма - никто не может предсказать, как именно будут читать Ваше письмо.
Не ленитесь и придерживайтесь стандартов.

Совет

Если вы работаете под Денвером, у которого sendmail заглушка, то вы найдете свои отправления во временной папке. Загляните туда, откройте их в Outlook, и просмотрите исходник сообщения - вы увидите в нем ошибки допущенные вами, и место ошибки в коде.

  Ответить  
 
 автор: inga   (30.11.2009 в 14:40)   письмо автору
 
   для: sim5   (30.11.2009 в 11:03)
 

буду изучать что написали. спасибо!

  Ответить  
 
 автор: sim5   (30.11.2009 в 14:47)   письмо автору
122.5 Кб
 
   для: inga   (30.11.2009 в 14:40)
 

Ну это только рекомендации ) Не помню уже тему, где я выкладывал немного полезного о почте, поэтому повторю (эксклюзивно, для вас).
В прикреплении есть примеры исходников почтовых отправлений с разными способами вложений. Скопируйте их (из исходного текста страницы) и сохраните с расширением .eml. Проверьте в почтовом клиенте, сделайте отправку на другие почтовые серверы. Все работает, так как сформированы они согласно рекомендаций.
Если внимательно просмотреть эти исходники, то уже из них видно, как вы должны писать РНР-код. Вот это можете изучать, как дополнение.

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

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