<?php
// Based on Invision Power Services Kernel [Email Functions]
class SimpleMailSender
{
var $from = "";
var $to = "";
var $subject = "";
var $message = "";
var $smtp_fp = FALSE;
var $smtp_msg = "";
var $smtp_port = 25;
var $smtp_host = "localhost";
var $smtp_user = "";
var $smtp_pass = "";
var $smtp_code = "";
var $mail_method = 'mail';
var $error_msg;
var $error_help;
var $error;
function send_mail()
{
$this->to = preg_replace( "/[ \t]+/" , "" , $this->to );
$this->from = preg_replace( "/[ \t]+/" , "" , $this->from );
$this->to = preg_replace( "/,,/" , "," , $this->to );
$this->from = preg_replace( "/,,/" , "," , $this->from );
$this->to = preg_replace( "#\#\[\]'\"\(\):;/\$!Ј%\^&\*\{\}#" , "", $this->to );
$this->from = preg_replace( "#\#\[\]'\"\(\):;/\$!Ј%\^&\*\{\}#" , "", $this->from);
if ( ($this->from) )
{
if ($this->mail_method != 'smtp')
{
if ( ! @mail( $this->to, $this->subject, $this->message) )
{
$this->fatal_error("Could not send the email", "Failed at 'mail' command");
return FALSE;
}
else
{
return TRUE;
}
}
else
{
return $this->smtp_send_mail();
}
}
else
{
$this->fatal_error("From empty");
return FALSE;
}
}
function smtp_get_line()
{
$this->smtp_msg = "";
while ( $line = fgets( $this->smtp_fp, 515 ) )
{
$this->smtp_msg .= $line;
if ( substr($line, 3, 1) == " " )
{
break;
}
}
}
function smtp_send_cmd($cmd)
{
$this->smtp_msg = "";
$this->smtp_code = "";
fputs( $this->smtp_fp, $cmd."\r\n" );
$this->smtp_get_line();
$this->smtp_code = substr( $this->smtp_msg, 0, 3 );
return $this->smtp_code == "" ? FALSE : TRUE;
}
function smtp_error($err = "")
{
$this->smtp_msg = $err;
$this->fatal_error( $err );
return FALSE;
}
function smtp_crlf_encode($data)
{
$data .= "\n";
$data = str_replace( "\n", "\r\n", str_replace( "\r", "", $data ) );
$data = str_replace( "\n.\r\n" , "\n. \r\n", $data );
return $data;
}
function smtp_send_mail()
{
$this->smtp_fp = @fsockopen( $this->smtp_host, intval($this->smtp_port), $errno, $errstr, 30 );
if ( ! $this->smtp_fp )
{
$this->smtp_error("Could not open a socket to the SMTP server");
return FALSE;
}
$this->smtp_get_line();
$this->smtp_code = substr( $this->smtp_msg, 0, 3 );
if ( $this->smtp_code == 220 )
{
$data = $this->smtp_crlf_encode($this->message);
$this->smtp_send_cmd("HELO ".$this->smtp_host);
if ( $this->smtp_code != 250 )
{
$this->smtp_error("HELO");
return FALSE;
}
if ($this->smtp_user OR $this->smtp_pass)
{
$this->smtp_send_cmd("AUTH LOGIN");
if ( $this->smtp_code == 334 )
{
$this->smtp_send_cmd( base64_encode($this->smtp_user) );
if ( $this->smtp_code != 334 )
{
$this->smtp_error("Username not accepted from the server");
return FALSE;
}
$this->smtp_send_cmd( base64_encode($this->smtp_pass) );
if ( $this->smtp_code != 235 )
{
$this->smtp_error("Password not accepted from the server");
return FALSE;
}
}
else
{
$this->smtp_error("This server does not support authorisation");
return FALSE;
}
}
$this->smtp_send_cmd("MAIL FROM:".$this->from);
if ( $this->smtp_code != 250 )
{
$this->smtp_error();
return FALSE;
}
$this->smtp_send_cmd("RCPT TO:".$this->to);
if ( $this->smtp_code != 250 )
{
$this->smtp_error("Incorrect email address: $this->to");
return FALSE;
}
$this->smtp_send_cmd("DATA");
if ( $this->smtp_code == 354 )
{
fputs( $this->smtp_fp, $data."\n." );
}
else
{
$this->smtp_error("Error on write to SMTP server");
return FALSE;
}
$this->smtp_send_cmd(".");
if ( $this->smtp_code != 250 )
{
$this->smtp_error();
return FALSE;
}
$this->smtp_send_cmd("quit");
if ( $this->smtp_code != 221 )
{
$this->smtp_error();
return FALSE;
}
@fclose( $this->smtp_fp );
return TRUE;
}
else
{
$this->smtp_error();
return FALSE;
}
}
function fatal_error($msg, $help="")
{
$this->error_msg = $msg;
$this->error_help = $help;
return FALSE;
}
}
?>
Помогите решить проблему.. (PHP, отправка почты через SMTP сокетами)
Код:
Когда я отсылаю сообщение и в теле письма пишу !: или Privet :) Poka сообщение приходит пустым :(
В чем дело? Я так понимаю тут проблема с ":" изза хидеров? :confused:
Выпиши тот фрагмент кода где у тебя есть подозрения. А то читать весь код как-то неохота...
Блин... Неохота читать столько букв...
Код:
function smtp_crlf_encode($data)
{
$data .= "\n";
$data = str_replace( "\n", "\r\n", str_replace( "\r", "", $data ) );
$data = str_replace( "\n.\r\n" , "\n. \r\n", $data );
return $data;
}
{
$data .= "\n";
$data = str_replace( "\n", "\r\n", str_replace( "\r", "", $data ) );
$data = str_replace( "\n.\r\n" , "\n. \r\n", $data );
return $data;
}
Тут?
Код:
$this->smtp_send_cmd("DATA");
if ( $this->smtp_code == 354 )
{
fputs( $this->smtp_fp, $data."\n." );
}
else
{
$this->smtp_error("Error on write to SMTP server");
return FALSE;
}
if ( $this->smtp_code == 354 )
{
fputs( $this->smtp_fp, $data."\n." );
}
else
{
$this->smtp_error("Error on write to SMTP server");
return FALSE;
}
Или тут что-то не так?
Может и где-то еще...
Почта отсылается нормально, автентификация работает, только вот проблемы с ":" в теле письма... :(