WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




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


Прислал: Аркадий Бабулин [ 09.11.2001 @ 13:32 ]
Раздел:: [ Статьи по PHP ]


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

Я написал класс (точнее, если быть честным - это стандартное решение подобной проблемы. Вы можете найти такой же класс на 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); } } ?>
Уложив этот класс в отдельный файл, Вы можете использовать его где угодно. Работающий пример прилагается. Если есть вопросы - обращайтесь.


 :::::   пишет 09.11.2001 @ 19:23 
Kruto !!! Mne ponravilos'!!!
Tol'ko ya pochti ne ponyal ni chego :(((

 :::::  Solid пишет 10.11.2001 @ 00:56 
Во втором абзаце не закрыта скобка ;)
 :::::   пишет 11.11.2001 @ 05:28 
Никак не могу получить желаемого результата! 8(

Или код не праилен (я брал и на php.spb.ru b тут), или я не то делаю?

А нужно позарез!!!!!!

Мож кто поможет?
 :::::  ThE0ReTiC пишет 12.11.2001 @ 01:11 
Ты бы хоть мыло оставил, а то позарез нужно, а сам неивестно кто :))) Мое мыло знаешь - пиши.
 :::::  dina пишет 16.11.2001 @ 18:02 
Автор, я запустила скрипт, взятый отсюда, письмо отправляется с вложенным файлом, даже правильно mime-тип определяется, но только сам файл ПУСТОЙ приходитю.

Что делать?
 :::::  ThE0ReTiC пишет 16.11.2001 @ 18:12 
Знаю Была такая фишка. Дело не в скрипте. просто он для того, чтобы
приаттачить файл аплоадит его. Настрой пермишны на папку, куда падает
файл (в данном примере корень). Плюс не у всех РНР работает как
mod_Apache. Соотвественно переменная среды $DOCUMENT_ROOT может быть
недоступна. Замени на относительный путь.
 :::::  Владислав пишет 21.01.2002 @ 19:51 
Твой класс странно написан. Либо под линукс онли либо под пивом. Текстовые сообщения отправляет на ура. При отсылке слишком (для него, видимо) больших файлов заставляет вылетать сам пхп с ошибкой в модуле msvcrt.dll (виндовый). В других случаях аттачит пустые файлы; тесктовые файлы и, как ни странно, *.reg аттачит корректно. Странно. Но, я думаю, после небольшой доработки он и текстовые слать не будет :)

скрипт, что я использовал для доступа к классу, вот:
<?
/// отсылка
include("mailclass.inc");

echo"<p style=\"font-family: Courier New; font-size:15px \"><br><<---------------данные-файла--------------->><br>";
echo"размер......... $userfile_size<br>";
echo"расположение... $userfile<br>";
echo"тип............ $userfile_type<br>";
echo"имя............ $userfile_name<br>";
echo"<<------------------------------------------>><br><br><br><br><br></p>";
$filename = 'test\\'.$userfile_name;
//if (is_uploaded_file($userfile)) move_uploaded_file($userfile, $filename);
copy($userfile, $filename);
$content_type = $userfile_type;
$fd = fopen($filename, "rb");
$data = fread($fd, $userfile_size);
fclose($fd);
$data_size=sizeof($data);

echo"<p style=\"font-family: Courier New; font-size:15px \"><br><<---------------данные-файла--------------->><br>";
echo"расположение на сервере... $filename<br>";
echo"расположение у клиента ... $userfile<br>";
echo"тип....................... $userfile_type<br>";
echo"размер.................... $data_size<br>";
echo"<<------------------------------------------>><br><br><br><br><br></p>";

$mail = new multi_mail;
$mail->from = "mdaemon@tertium.ru";
$mail->to = $mailto_addr;
$mail->subject="_____";
$mail->body = $mess.'Вам должен был прийти файл: '.$userfile_name;
$mail->attach_file($userfile_name, $data, $content_type);

$mail->send_mail();
?>

От себя добавлю - это один из вариантов скрипта, я раз пять его переписывал, один хрен.
Есть ли какие-нть рекомендации?
 :::::  ThE0ReTiC пишет 21.01.2002 @ 19:54 
Если честно, написан действительно подNIX. Точнее тестировался на FreeBSD.Там все работает. Прсто я предпочитаю с почтой работать на никсовой машине. Но я посмотрю.
 :::::  monarchp пишет 11.01.2004 @ 11:05 
а как быть если нужно приаттачить не один файл, а несколько..?
как их указывать - через запятую или ; или ещё как...?
 :::::  Evgeniy пишет 01.12.2006 @ 14:57 
Проблема взял этот скрипт, а он не работает
Я не могу понять в чем засада
Кто может помогите

После выполнения скрипт выдает такое сообщение
from = "egan@ukr.net"; $mail->to = $to; $mail->subject = "File from me again"; $mail->body = "This is a text body. See file in Attachemnt Release C 15"; @copy($filez,$DOCUMENT_ROOT."/$filez_name"); $file_name = '/'.$filez_name; $file_type = $filez_type; $file_desc = @fopen($file_name,"r"); $file_data = @fread($file_desc,filesize($file_name)); @fclose($file_desc); echo"$file_name
"; $file_size = filesize($file_name); echo"File size: $file_size
"; echo"$filez_type
"; echo"$filez_name
"; @chdir('test/'); $mail -> attach_file($filez_name,$file_data,$file_type); $mail->send_mail(); echo"Sended OK to ".$mail->to; ?>

И не отправляет его

Заранее благодарю за любую информацию
Евгений
egan@ukr.net

Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0477948