<? //Функция проверки переменной function html_filter($str) { $result = HTMLSpecialChars($str); return $result;} //Функция проверки e-mail function isEmail($email){ if (eregi("^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]+$", $email)){return TRUE;}else{return FALSE;}} //Функция отправки письма с аттачем (вложением) function XMail($from, $to, $subj, $text, $filename, $file) { $text = str_replace("\n", "<br>\n", $text); $f = fopen($file,"rb"); $un = strtoupper(uniqid(time())); $head = "From: $from\n"; $head .= "To: $to\n"; $head .= "Subject: $subj\n"; $head .= "X-Mailer: PHPMail Tool\n"; $head .= "Reply-To: $from\n"; $head .= "Mime-Version: 1.0\n"; $head .= "Content-Type:multipart/mixed;"; $head .= "boundary=\"----------".$un."\"\n\n"; $zag = "------------".$un."\nContent-Type:text/html;\n"; $zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n"; $zag .= "------------".$un."\n"; $zag .= "Content-Type: application/octet-stream;"; $zag .= "name=\"".basename($filename)."\"\n"; $zag .= "Content-Transfer-Encoding:base64\n"; $zag .= "Content-Disposition:attachment;"; $zag .= "filename=\"".basename($filename)."\"\n\n"; $zag .= chunk_split(base64_encode(fread($f,filesize($file))))."\n"; if (!@mail("$to", "$subj", $zag, $head)) return 0; else return 1; } //Функция отправки письма без аттача (вложения) function EMail($from, $to, $subj, $text) { $text = str_replace("\n", "<br>\n", $text); $un = strtoupper(uniqid(time())); $head = "From: $from\n"; $head .= "To: $to\n"; $head .= "Subject: $subj\n"; $head .= "X-Mailer: PHPMail Tool\n"; $head .= "Reply-To: $from\n"; $head .= "Mime-Version: 1.0\n"; $head .= "Content-Type:multipart/mixed;"; $head .= "boundary=\"----------".$un."\"\n\n"; $zag = "------------".$un."\nContent-Type:text/html;\n"; $zag .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n"; $zag .= "------------".$un."\n"; if (!@mail("$to", "$subj", $zag, $head)) return 0; else return 1; } //Получаем данные из формы if(isset($submit)): //Проверяем полученные из формы данные $from = trim(html_filter($from)); $to = trim(html_filter($to)); $subj = trim(html_filter($subj)); $text = trim(html_filter($text)); $filename = trim(html_filter($file_name)); //Проверяем e-mail-ы if(isEmail($from)==false){$from_error=1;} if(isEmail($to)==false){$to_error=1;} if($from_error!=1 and $to_error!=1): //Если прикреплен файл if($filename!="" and $file_size>0): if(XMail($from, $to, $subj, $text, $filename, $file)==1){header("Location:?send=ok");} endif; //Если Не прикреплен файл if($filename=="" or $file_size==0): if(EMail($from, $to, $subj, $text)==1){header("Location:?send=ok");} endif; endif; endif; ?> <html> <head> <meta http-equiv="Content-Language" content="ru"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Отправка письма с аттачем и без</title> </head> <body> <?//Печатаем ошибки if(isset($submit)): if($from_error==1):?> <font color="red">E-mail в поле From введен неправильно!</font><br> <?endif;?> <?if($to_error==1):?> <font color="red">E-mail в поле To введен неправильно!</font><br> <?endif;?> <?endif;?> <?if($send=="ok"):?><font color="green">Сообщение отправлено</font><br><br><?endif;?> <form action="<?=$PHP_SELF?>" method="post" enctype="multipart/form-data"> From:<br> <input type="text" name="from" value="<?=$from?>"><br> To:<br> <input type="text" name="to" value="<?=$to?>"><br> Subject:<br> <input type="text" name="subj" value="<?=$subj?>"><br> Text:<br><textarea cols="40" rows="10" name="text"><?=$text?></textarea><br> File:<br> <input type="file" name="file"><br> <input type="submit" name="submit" value="Отправить"> </form> </body> </html> Отправка писем при помощи PHPПрикрепление файла Письмо, содержащее прикрепленный файл, несколько отличается от простого. В нем добавляются некоторые заголовки, и немного меняется само построение, хотя несомненно само письмо остается текстовым файлом. Но давайте все по порядку. Одна из особенностей - наличие заголовка mime-version. Этот заголовок указывает стандарт, которому соответствует тело сообщения. Сообщения, соответствующие mime обязаны содержать такое поле заголовка со следующим текстом: mime-version: 1.0 Если мы хотим отослать письмо с прикрепленными файлами, то необходимо использовать заголовок content-type: multipart/mixed, который обозначает, что письмо состоит из нескольких частей, каждая из которых содержит свой заголовок content-type. Для обозначения границы этих частей необходимо использовать параметр boundary, который еще называется маркером границы. Значением этого параметра может служить любая строка. Но надо учесть, что она должна быть уникальной и не встречалась в теле письма. Иначе письмо может быть неправильно разбито на части. from: "uspenskii evgeny" <evgeny@spravkaweb.ru> to: user@domain.ru subject: hello mime-version: 1.0 content-type: multipart/mixed; boundary="spravkaweb-12345" При разделении письма на части перед маркером должны стоять два знака дефиса. А последний маркер, который обозначает конец письма, должен содержать в конце два знака дефиса. Для каждой части необходимо установить свои заголовки. После заголовков необходимо поставить два знака перевода строки. from: "uspenskii evgeny" <evgeny@spravkaweb.ru> to: user@domain.ru subject: hello mime-version: 1.0 content-type: multipart/mixed; boundary="spravkaweb-12345" --spravkaweb-1234 content-type: text/plain; charset="windows-1251" content-transfer-encoding: quoted-printable hi! here's that my file! --spravkaweb-1234 content-type: application/x-rar-compressed; name="file.rar" content-transfer-encoding:base64 content-disposition:attachment umfyiroham+qcwaadqaaaaaaaabvyxqg ...... spravkaweb-1234-Если у нас идет часть с текстом, то надо заголовок content-transfer-encoding присвоить значение quoted-printable, либо 7bit, либо 8bit. Для части с файлом этот заголовок должен быть равен base64. Заголовок content-disposition, присутствующий во второй части, указывает, как почтовой программе следует отобразить данную часть письма. Он может принимать значение attachment (этот участок не является частью письма, а просто прикреплен к нему в виде файла) и inline (включение, которое используется непосредственно в письме, например, картинка, вставляемая в html). В первой части заголовком content-type: text/plain; charset="windows-1251" указали, что это простой текст с кодировкой windows. Во второй же части заголовком content-type: application/x-rar-compressed; name="file.rar" указали, что тип файла - rar-архив, а имя файла - file.rar. Если отправляем gif-картинку, его content-type будет выглядеть: content-type: image/gif; name="file.gif" В случае, если заранее не известно, какой тип файла отправляем, или формат файла не является стандартным, следует заголовку content-type присвоить значение application/octet-stream. content-type: application/octet-stream; name="file.dat" Прикрепленные файлы должны быть размещены в письме в формате base64. Преобразовать файл в этот формат можно при помощи функции base64_encode(): // Открываем файл для чтения в бинарном формате $file=fopen("file.zip", "rb"); // Считываем его в строку $str_file $str_file=fread($file,filesize("file.zip")); // Преобразуем эту строку в base64-формат $str_file=base64_encode($str_file); Теперь переменную $str_file, которая содержит файл, можно вставлять в письмо. Для окончательного закрепления материала напишем функцию, которая отправляет письмо в html-формате по указанному адресату с прикрепленным файлом: /* $to - адрес получателя письма $from_mail - адрес отправителя письма $from_name - имя отправителя письма $subject - тема письма $message - само сообщение в html-формате $file_name - путь к файлу, который надо прикрепить к письму (это может быть имя файла, выбранного в поле <input type=file name=file_name>) */ function sendmail($to,$from_mail,$from_name,$subject,$message,$file_name) { $bound="spravkaweb-1234"; $header="from: "$from_name" <$from_mail>n"; $header.="to: $ton"; $header.="subject: $subjectn"; $header.="mime-version: 1.0n"; $header.="content-type: multipart/mixed; boundary="$bound""; $body="nn--$boundn"; $body.="content-type: text/html; charset="windows-1251"n"; $body.="content-transfer-encoding: quoted-printablenn"; $body.="$message"; $file=fopen($file_name,"rb"); $body.="nn--$boundn"; $body.="content-type: application/octet-stream;"; $body.="name="".basename($file_name).""n"; $body.="content-transfer-encoding:base64n"; $body.="content-disposition:attachmentnn"; $body.=base64_encode(fread($file,filesize($file_name)))."n"; $body.="$bound--nn"; if(mail($to, $subject, $message, $header)) { echo "<center>Письмо было успешно отправлено!</center>"; } else { echo "<center>Сообщение не отправлено!</center>"; }; };