Сам по себе протокол не предназначен для отправки нетекстовой информации. Поэтому было введено расширение MIME. Оно позволяет помимо текстовой информации, отправлять вложения. Вот пример письма, в которое вложен текстовый документ: Код (Text): From: user@server.com To: admin@server.com Subject: =?utf-8?B?VGVzdCBtZXNzYWdlLg==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundarydadea6878885170f292e94279eeee0e6" --Boundarydadea6878885170f292e94279eeee0e6 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGVsbG8sIFdvcmxkIQ== --Boundarydadea6878885170f292e94279eeee0e6 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="document.txt" 3fLuIO/w6Ozl8CDy5erx8 u7i7uPuIOTu6vPs5e3y4C4= --Boundarydadea6878885170f292e94279eeee0e6-- Разберём его на куски. Код (Text): From: user@server.com To: admin@server.com Subject: =?utf-8?B?VGVzdCBtZXNzYWdlLg==?= Стандартные поля сообщения: От, Кому и Тема. Заметим, что тема в кодировке UTF-8 и закодирована при помощи base64, т.к. по стандарту в письме не должно быть символов с кодами > 128 (7bit encoding). Код (Text): MIME-Version: 1.0 Определяет используемую версию MIME. Сейчас в ходу версия 1.0, возможностей которой, пока, хватает. Код (Text): Content-Type: multipart/mixed; boundary="Boundarydadea6878885170f292e94279eeee0e6" Эта строчка сообщает о том, что в письме содержится смешанный контент и определяет, так называемый, boundary. Boundary - своего рода ограничитель, применяемый для отделения разных частей письма. Подбирается самостоятельно на основе того, что он не должен встречаться в теле письма. Код (Text): --Boundarydadea6878885170f292e94279eeee0e6 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGVsbG8sIFdvcmxkIQ== Заголовки и текст письма, закодированный при помощи всё того же base64 в кодировке UTF-8. Данный блок должен начинаться с двух дефисов и boundary. После boundary обязательный перевод строки. Также не забываем разделить заголовки и текст новой строкой. Код (Text): --Boundarydadea6878885170f292e94279eeee0e6 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="document.txt" 3fLuIO/w6Ozl8CDy5erx8u7i7uPuIOTu6vPs5e3y4C4= Само вложение так же состоит из двух частей: заголовков и тела. Начинаться должно так же с двух дефисов, boundary и перевода строки. Content-Type определяет тип содержимого. application/octet-stream - стандартный тип для бинарных данных, хотя в данном случае и приложен текстовый документ, его так же можно рассматривать, как поток байтов. Content-Transfer-Encoding определяет способ кодирования тела вложения. В данном случае это base64, который поддерживаю все популярные почтовые клиенты. Content-Disposition определяет то, как клиент должен отобразить файл. attachment указыват на что это вложенный файл с именем в filename. Тело письмо отделяется от заголовков пустой строкой. Код (Text): --Boundarydadea6878885170f292e94279eeee0e6-- Последняя строка закрывает MIME документ. Она должна начинаться и заканчиваться с двух дефисов и boundary между ними. Во и всё. Позже расскажу как приложить несколько файлов, как приложить несколько картинок и отобразить их в HTML странице, как добавить альтернативное сообщение для браузеров без поддержки MIME ну и покажу пример реализации на PHP.
Отправляется файл но на почтових сайтах не показуется! Когда прикрепляю файл на почте уже этот файл выглядит как куча символов В чем может быть проьлема? Часть HTML письма отображается нормально. а часть прикрепленного файла отак: --093485703948503498504385034 Content-Type: application/octet-stream;name="phpqT13Bk" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="phpqT13Bk" /9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAOQAA/+4ADkFkb2JlAGTAAAAAAf/b AIQABwUFBQUFBwUFBwoGBgYKDAkHBwkMDQsLDAsLDREMDAwMDAwRDQ8QERAPDRQUFhYUFB4dHR0e ISEhISEhISEhIQEHCAgODA4aEREaHRcTFx0hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEh ISEhISEhISEhISEhISEhISEh/8AAEQgA9QF8AwERAAIRAQMRAf/EAI8AAAAHAQEAAAAAAAAAAAAA AAABAgMEBQYHCAEBAQEBAAAAAAAAAAAAAAAAAAECAxAAAgEDAwIEBAQDBgMHAgcBAQIDABEEIRIF MQZBUSITYXEyFIFCFQeRoSOxwVJiMxZygiTR4fGSorJD8DTC4lNjg0QXVBEBAQEAAwEBAAAAAAAA AAAAABEBIQISMUH/2gAMAwEAAhEDEQA/AODxKdwIrKpZjDG6ggmoqWkbLHZtVI1+dFS8PHJBYAWU dT4UQ9/UVwH9F9b0U48bu39KS - десь еще куча текста 093485703948503498504385034-- Что может быть не так ???? Проверял на двух почтах mail i google[/u]
Спасибо.Но здесь конкретный файл вкладывается.А мне нужен вариант,когда ио ОБЗОРА выбирается любой файл ,прикрепляется и отправляется. Я свою тему выставила только что на форум,может поможете.
Сначала надо тогда файл загрузить на сервер, а потом прикрепить к письму. Загрузку можно сделать на ajax, без перезагрузки страницы. Поищите, скриптов загрузки достаточно много. Если это не так важно, то можно почитать Отправка письма с вложением.
Довольно удобная штука (на мой взгляд) - class.phpmailer.php - там есть готовые методы для прикрепления картинок к письму. Чтобы вставить прикреплённое изображение в html-письмо - в атрибуте src тега img нужно написать cid:название_картинки Название картинки должно соответствовать названию, которое передали в метод AddEmbeddedImage вторым (или третьим) параметром. Я передаю и вторым и третьим одно и тоже: Код (PHP): <?php $html = '<html> <head> <meta http-equiv="Content-type" content="text/html; charset=Windows-1251" /> <title>Тема письма</title> </head> <body> <div> Картинка 1 ниже:<br /> <img src="cid:pict1.jpg" /> </div> <br /> <br /> <div> Картинка 2 ниже:<br /> <img src="cid:pict2.jpg" /> </div> </body> </html>'; $path = dirname(__FILE__); require($path . DIRECTORY_SEPARATOR . 'class.phpmailer.php'); $mailer = new PHPMailer(); $mailer->From = 'admin@site.ru'; $mailer->CharSet = 'Windows-1251'; $mailer->FromName = 'site.ru admin'; $mailer->Subject = 'Тема письма'; $mailer->AddEmbeddedImage($path . DIRECTORY_SEPARATOR . 'img1.jpg', 'pict1.jpg', 'pict1.jpg', 'base64', 'image/jpeg'); $mailer->AddEmbeddedImage($path . DIRECTORY_SEPARATOR . 'img2.jpg', 'pict2.jpg', 'pict2.jpg', 'base64', 'image/jpeg'); $mailer->Body = $html; $mailer->IsHTML(true); $mailer->AddAddress('recipient@mail.ru'); $sended = $mailer->Send(); ?>
Всё просто - создаёшь на странице невидимый iframe, а у формы прописываешь target на этот iframe. Когда файл отправляется - ответ от сервера придёт в него. Далее с помощью JS смотришь, что там пришло и выполняешь нужные действия. Я обычно в таких случаях в этот iframe тоже отправляю некий JS-код, который дёрнет какую-то функцию родительского окна и заставит выполнять нужные действия.
Почему же не аяксом? Тут JavaScript и PHP взаимодействуют для обмена данными клиента и сервера без перезагрузки - чем не аякс?
перезагрузка есть, только той страницы которая во фрэйме http://forum.php.su/topic.php?forum=40&topic=2864
Ну, у меня такое понимание, что аякс - это сама технология, при которой пользователь что-то делает с сайтом - заполняет формы, отправляет данные и получает ответы от системы, оставаясь на той странице, которая у него загружена в браузере, то есть не перезагружается та видимая страница, на которой он находится, которая у него в браузере открыта. А каким именно методом это достигается - будь то xmlHttpRequest или обычная отправка формы в невидимый iframe и анализ пришедшего результата - вообще абсолютно пофигу. Суть от этого ничуть не меняется. Активная страница пользователя не перезагрузилась, а обмен данными идёт где-то там "за кулисами", и не важно как именно.
По-моему, ты говоришь про XMLHttpResponse / Microsoft.XMLHTTP. Но это не синонимы слова Ajax, на сколько я понимаю. Это лишь одна из его составляющих...
для этого есть слово "суть". все остальное - основные частоиспользуемые механизмы, которые сразу идут из коробки, но в принципе могут быть реализованы тремя строчками js.
Не могу разобраться, помогите! Подскажите, пожалуйста, новичку. Исходные данные. Есть файл index.html: <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Отправка сообщения с вложением</title> <link type="text/css" rel="stylesheet" href="style.css"> </head> <body> <H3> <center><font color="#1E90FF">Отправка сообщения с вложением</font></H3> <center> <form action="simple_mail.php" enctype="multipart/form-data" method="post"> <p>Кому: <input type="text" name="mail_to" maxlength="32"></p> <p>Subject: <input type="text" name="mail_subject" maxlength="64"></p> <p>Сообщение: <textarea cols="50" rows="8" name="mail_msg"></textarea></p> <p>File: <input type="file" name="mail_file" maxlength="64"></p> <p><input type="submit" value="Отправить"></p> </form> </table> </center> </body> </html> Есть файл simple_mail.php: <?php if(empty($_POST['mail_to'])) exit("Введите адрес получателя"); // проверяем правильности заполнения с помощью регулярного выражения if (!preg_match("|^([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})|is", strtolower($email))) 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_to, $thm, $msg); else send_mail($mail_to, $thm, $msg, $picture); // Вспомогательная функция для отправки почтового сообщения с вложением (Trianon) function send_mail($mail_to, $thema, $html, $path) { if ($path) { $fp = fopen($path,"rb"); if (!$fp) { print "Cannot open file"; exit(); } $file = fread($fp, filesize($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-1251$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; } ?> Проблема в следующем: все поля формы, включая вложения, заполнены. После нажатия "Отправить", в браузере появляется следующее сообщение: <?php if(empty($_POST['mail_to'])) exit("Введите адрес получателя"); // проверяем правильности заполнения СЃ помощью регулярного выражения if (!preg_match("|^([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})|is", strtolower($email))) 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_to, $thm, $msg); else send_mail($mail_to, $thm, $msg, $picture); // Вспомогательная функция для отправки почтового сообщения СЃ вложением (Trianon) function send_mail($mail_to, $thema, $html, $path) { if ($path) { $fp = fopen($path,"rb"); if (!$fp) { print "Cannot open file"; exit(); } $file = fread($fp, filesize($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-1251$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; } ?> Вопрос: что я делаю не так?
Могу предложить PHP библиотеку для отправки почтовых сообщений. Возможности библиотеки: Работа с Mail, Sendmail и SMTP Массовая рассылка CC и BCCs HTML или Обычный текст писем Вложения Перенос строк Приоритеты BCC Batch Mode, позволяет разбивать большие списки адресов на мелкие пакеты. Инструменты отладки Скачиваем по ссылке, подключаем файл. Пример отправки письма с вложением: Код (Text): $email = new Email(); $email->from("your@your-site.com", "Your Name"); $email->to("someone@example.com"); $email->subject("Тема письма"); $email->message("Тут моё сообщение"); $email->attach("/path/to/file.ext"); $email->send(); echo $email->print_debugger(); P.S. Взято из фреймворка CodeIgniter. Можно подключать и использовать на любом сайте написанном на PHP, независимо от движка/фреймворка/CMS.