//Функция проверки переменной function html_filter($str) { $result

advertisement
<?
//Функция проверки переменной
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>";
};
};
Download