Проблема с Mail(). Ошибки при указании From

sezon

Новичок
Проблема с Mail(). Ошибки при указании From

Нашел в просторах интернета код для отправки почты с проверкой адресов (http://www.softtime.ru/scripts/sendmessage.php):

<?php
class Mail
{
// создаем переменные, в которых хранится содержимое заголовков
var $to = '';
var $from = '';
var $reply_to = '';
var $cc = '';
var $bcc = '';
var $subject = '';
var $msg = '';
var $validate_email = true;
// проверяет допустимость почтовых адресов
var $rigorous_email_check = true;
// проверяет допустимость доменных имен по записям DNS
var $allow_empty_subject = false;
// допустимость пустого поля subject
var $allow_empty_msg = false;
// допустимость пустого поля msg

var $headers = array();
/* массив $headers содержит все поля заголовка, кроме to и subject*/

function check_fields()
/* метод, проверяющий, переданы ли все значения заголовков
и проверку допустимости почтовых адресов */
{
if(empty($this -> to))
{
return false;
}
if(!$this -> allow_empty_subject && empty($this -> subject))
{
return false;
}
if(!$this -> allow_empty_msg && empty($this -> msg))
{
return false;
}
/* если есть дополнительные заголовки, помещаем их в массив $headers*/
if(!empty($this -> from))
{
$this->headers[] = "From: $this -> from";
}


if(!empty($this -> reply_to))
{
$this -> headers[] = "Reply_to: $this -> reply_to";
}
// проверяем допустимость почтового адреса
if ($this -> validate_email)
{
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $this -> to))
{
return false;
}
return true;
}
}

function send()
/* метод отправки сообщения */
{



if(!$this -> check_fields()) return true;
if (mail($this -> to, htmlspecialchars( stripslashes(trim($this -> subject))),
htmlspecialchars(stripslashes(trim($this -> msg)))))


{
return true;
}else{
return false;
}
}
}
?>

В главном скрипте вызываю так:

include("mail_class.php");

$mail = new Mail();

//сюда подставляется реальный адрес
$mail -> to = $email;

// Тема сообщения
$mail -> subject = "test";

// Текст сообщения
$mail -> msg = "Поздравляем!\r\nВы зарегистрировались на сайте ...\r\nЛогин: $login\r\nПароль: $password";


$mail -> rigorous_email_check = 0;
if($mail->send())
{
echo("<h4>На Ваш адрес отправлено сообщение.</h4><br>");
}else
{
echo("<h4>Возникла ошибка при отправке сообщения.</h4><br>");
}

-----------------------------------------------------------
Проблема в том, что немогу вставить поле FROM.
-----------------------------------------------------------

При добавлении в главном скрипте строки:

$mail -> from = "admin@localhost"; или любой другой

появляется сообщение:

Catchable fatal error: Object of class Mail could not be converted to string in C:\wwwroot\museum\mail_class.php on line 43

на строке

$this->headers[] = "From: $this -> from";

---------------------------------------------------------------
Что не так делаю?
Хочу поменять поле FROM в теле письма.http://www.softtime.ru/scripts/sendmessage.php http://www.softtime.ru/scripts/sendmessage.php
 

Фанат

oncle terrible
Команда форума
дебильный какой-то код.
зачем тебе проверка адреса во время отправки?

Код отправки сообщения укладывается в 5 строчек. отальное - ламерство и понты.
PHP:
function email($to,$subject,$text) {
  $from="noreply@".$_SERVER['HTTP_HOST'];
  $subject="=?Windows-1251?B?".base64_encode($subject)."?=";
  $headers = "From: Automailer at ".$_SERVER['HTTP_HOST']."<$from>\r\n";
  $headers.= "Reply-To: $from\r\n";
  $headers.= "Content-Type: text/plain; charset=\"windows-1251\"\r\n";
  $headers.= "Content-Transfer-Encoding: 8bit\r\n";
  mail($to, $subject, $text, $headers);
}
поменять from и кодировку, если нужно
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: *****
Код отправки сообщения укладывается в 5 строчек. отальное - ламерство и понты.
Блин, Фоннат, ну ты-то хоть плохому не учи! А то потом придётся отвечать на вопросы "а почему моя почта не принимается!?"

Вот ето вот:
$subject="=?Windows-1251?B?".base64_encode($subject)."?=";
уже неправильно.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Цитирую RFC 2047
An 'encoded-word' may not be more than 75 characters long, including
'charset', 'encoding', 'encoded-text', and delimiters. If it is
desirable to encode more text than will fit in an 'encoded-word' of
75 characters, multiple 'encoded-word's (separated by CRLF SPACE) may
be used.

While there is no limit to the length of a multiple-line header
field, each line of a header field that contains one or more
'encoded-word's is limited to 76 characters.

The length restrictions are included both to ease interoperability
through internetwork mail gateways, and to impose a limit on the
amount of lookahead a header parser must employ (while looking for a
final ?= delimiter) before it can decide whether a token is an
"encoded-word" or something else.
 

Фанат

oncle terrible
Команда форума
круто. но жалко.
разбивает мою любовь к простым вещам.
 

sezon

Новичок
Усё, разобрался.
Просто надо закомментировать строки
-------------
if (mail($this -> to, htmlspecialchars( stripslashes(trim($this -> subject))),
htmlspecialchars(stripslashes(trim($this -> msg)))))
--------------
и добавить конвертор вместо этих строк:
--------------
$hdrs = implode(" \r\n", $this->headers);
--------------
Вот что получилось:
--------------
if(!$this -> check_fields()) return false;
$hdrs = implode(" \r\n", $this->headers);
//if (mail($this -> to, htmlspecialchars( stripslashes(trim($this -> subject))),
//htmlspecialchars(stripslashes(trim($this -> msg))), $hdrs))

if (mail($this->to, $this->subject, $this->msg, $hdrs))
{
return true;
}else{
return false;
}
-------
и ведь выкладывают же для скачивания ...
*****
Вся эта "фигня" нужна для проверки вводимого адреса пользователя на достоверность через dns. А то настанет момент, когда придётся чистить базу от всех липовых адресов.
А пройдёт пол-года, то можно и забыть, как делал этот сайт.
И тогда ... можно не продолжать, и так всё понятно.
 

Фанат

oncle terrible
Команда форума
жесть.
какое отношение все это шаманство имеет к кривому синтаксису, из-за которого выскакивала ошибка?
при чем здесь проверка вводимого адреса, если речь идет об отправке?
где в этом коде проверка "через dns"?
как эта проверка поможет от липовых адресов?
 

cDLEON

Онанист РНРСlub
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $this -> to))
ВО :)
Жалко, конечно, что липу сюда всё равно засунуть можно :))
При чём прокатит даже такой:
ни_херовый_имейл[email protected]йа_злобный_хацкер
А самое прикольное - так это то, что в этот код можно воткнуть инъекцию :)
 

DiMA

php.spb.ru
Команда форума
cDLEON Какой ты злой. И SQL здесь не причем.

подумаешь, дурачек забыл о необходимости /^ ... $/, что же теперь .-)
 

cDLEON

Онанист РНРСlub
DiMA
При чём здесь SQL ? Инъекция это только SQL ?
А то, что я в хиадеры могу всунуть лишние \r\n, то, что могу надобовлять список мыл хз какой и засунуть свой костюмный текст и рассылать спам это так ерунда да? ) Ну-ну))

-~{}~ 18.04.09 21:07:

ЗЫ. Кроме ^..$ ещё есть домен info е.т.ц.
 

DiMA

php.spb.ru
Команда форума
и что тебе твои хедеры в мыле дадут? Да ничего. Разослать спаму можно и в корректно работающем скрипте, если в нем специально нет соотв. счетчиков.
 

cDLEON

Онанист РНРСlub
This is NOT PHP-specific but worth mentioning on the mail() page.

Watch out for sendmail command injection on your pages which call the mail() function.

How it works: the attacker will inject SMTP into your form unless you make it real clear where the header ends. Most people simply don't add a header or a \r\n\r\n sequence to their mail header forms.

Example : a new BCC: field can be injected so that your form can be used to deliver mail to any valid address the attacker chooses.
© [m]mail[/m]
 
Сверху