|
|
|
| Здравствуйте!
Изучаю PHP по книгам Кузнецова и Симдянова. Написал скрипт отправки почты, который человечно работает с UTF-8.
Хотелось бы получить оценку и здоровую критику.
<?php
function send_email($name_from, // имя отправителя
$email_from, // email отправителя
$name_to, // имя получателя
$email_to, // email получателя
$subject, // тема письма
$body, // текст письма
$bcc // Слепая копия нескольким абонентам, нумерованый массив, необязательный параметр
) {
//Убираем лишние пробелы
$name_from = trim($name_from);
$email_from = trim($email_from);
$name_to = trim($name_to);
$email_to = trim($email_to);
$subject = trim($subject);
//Обрезаем переменные до пристойных размеров
function utf8_substr($str,$from,$len){ //Функция по человечески обрезает utf-8
return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
'$1',$str);
}
$name_from = utf8_substr($name_from, 0, 40);
$email_from = utf8_substr($email_from, 0, 30);
$name_to = utf8_substr($name_to, 0, 40);
$email_to = utf8_substr($email_to, 0, 30);
$subject = utf8_substr($subject, 0, 100);
//Защищаемся от sql injection
$name_from = htmlspecialchars(stripcslashes($name_from));
$email_from = htmlspecialchars(stripcslashes($email_from));
$name_to = htmlspecialchars(stripcslashes($name_to));
$email_to = htmlspecialchars(stripcslashes($email_to));
$subject = htmlspecialchars(stripcslashes($subject));
$body = htmlspecialchars(stripcslashes($body));
if(!empty($bcc)) foreach($bcc as $val) $bcc_clean[] = htmlspecialchars(stripcslashes($val));
//Приводим заголовки к ASCII стандарту
$from = '=?utf-8?B?'.base64_encode($name_from).'?=';
$to = '=?utf-8?B?'.base64_encode($name_to).'?= <'.$email_to.'>';
$subject = '=?utf-8?B?'.base64_encode($subject).'?=';
//Состовляем заголовки
$headers = "From: ".$from." <".$email_from.">\r\n";
$headers .= "Content-type: text/plain; charset=utf-8\r\n";
$headers .= "Mime-Version: 1.0\r\n";
//Добовляем заголовок со слепыми копиями, если задан необязательный параметр $bcc(нумерованный массив)
if(!empty($bcc_clean)) foreach($bcc_clean as $val) $headers .= "Bcc: $val\r\n";
//Отправляем
return mail($to, $subject, $body, $headers);
}
?>
|
| |
|
|
|
|
|
|
|
для: xxxleoxxx
(02.06.2010 в 19:48)
| | Вы вообще представляте, что такое sql injection?
А письмо в текстовом формате после htmlspecialchars когда либо получали? | |
|
|
|
|
|
|
|
для: sim5
(02.06.2010 в 19:56)
| | Ну с защитой от иньекций я не прав.
А что не так с htmlspecialchars? Отправляем же в формате text/plain | |
|
|
|
|
|
|
|
для: xxxleoxxx
(02.06.2010 в 19:58)
| | >А что не так с htmlspecialchars?
>Отправляем же в формате text/plain
Вот именно поэтому и. | |
|
|
|
|
|
|
|
для: xxxleoxxx
(02.06.2010 в 19:58)
| | От иньекции чего? Вы почту отправляете или...?
>//Приводим заголовки к ASCII стандарту
Это кто вам об этом сказал?
Почитайте, что такое почта, ее форматы, как вообще проверяются поля адресов и что в них нельзя допускать, и т.д., и т.п., а уж потом пишите скрипт свой. | |
|
|
|
|
|
|
|
для: sim5
(02.06.2010 в 20:04)
| | В комментариях я не так выразился. Я хотел защитить от введения нежелательных скриптов в форму, где должно быть текстовое письмо.
А в каком тогда формате передаются заголовки? Разве не ASCII? | |
|
|
|
|
|
|
|
для: xxxleoxxx
(02.06.2010 в 20:10)
| | Можете привести хорошие примеры подобного скрипата? | |
|
|
|
|
|
|
|
для: xxxleoxxx
(02.06.2010 в 20:10)
| | Вы отправляете письмо в utf, какие еще вопросы? Заголовки (не все подряд конечно) кодируют для того, чтобы русские (для нас родных) символы отправленные в ASCII приходили удобоваримыми, а не в виде крякозябриков.
Выбрасывайте свой скрипт, и сперва прочтите о почте все, что только возможно почитать о ней. | |
|
|
|
|
|
|
|
для: sim5
(02.06.2010 в 20:15)
| | http://softtime.ru/forum/read.php?id_forum=1&id_theme=74229&page=1 | |
|
|
|
|
|
|
|
для: xxxLEOxxx
(03.06.2010 в 12:11)
| | Я вам уже сказал - читайте и изучайте, и как видно по "новинке", вы этого пока не сделали. | |
|
|
|
|
|
|
|
для: sim5
(03.06.2010 в 12:20)
| | А вы могли бы более явно указать на ошибки? | |
|
|
|
|
|
|
|
для: xxxleoxxx
(03.06.2010 в 12:55)
| | Открывайте имеющиеся у вас книги, либо ищите поисковиком темы, типа "как отправить почту на PHP" - получите массу материала, которую нужно будет изучить.
Разберите уже имеющиеся скрипты отправки почты, руководствуясь прочитанным - тоже будет полезно для вас.
Если вы хотите писать код, в данном случае отправки почты, то вы должны знать хорошо эту тему. Писать же код, а потом спрашивать об ошибках, убирая те, на которые укажут, и так далее, это пустая трата времени.
В вашем скрипте не просто ошибки, в вашем скрипте незнание этого вопроса. Вы не для меня его пишите, для себя, не я вам должен указывать, а вы знать. | |
|
|
|
|
|
|
|
для: sim5
(03.06.2010 в 13:07)
| | Дело в том, что я уже довольно многое прочитал на эту тему. И действительно не понимаю о чем вы. | |
|
|
|
|
|
|
|
для: xxxleoxxx
(03.06.2010 в 14:04)
| | Ну тогда я не знаю, что и сказать. Как так читать, чтобы потом такое писать....
Существуют готовые классы отправки почты, непример, phpmailer. Скачайте его из сети, разберите его код, и внимательно. Может это поможет вам понять как пишется код на базе полученных знаний и рекомендаций RFC. | |
|
|
|
|
|
|
|
для: xxxleoxxx
(03.06.2010 в 14:04)
| | Для начала можно тут глянуть одним глазом. | |
|
|
|