
Опытный
 
Профиль
Группа: Участник
Сообщений: 327
Регистрация: 4.11.2004
Репутация: нет Всего: 15
|
| Цитата(Akina @ 24.2.2005, 18:26) | | Зачем класс? если сендмэйл подключен - его и пользуем... |
я допустим, используя класс, для того чтобы отправить не только текст, но и встроенные изображения в тело письма, да и приаттачить файлы. 1. Новой версии, которая у меня работала, я не могут найти, так что очень древняя, но рабочая версия... (спасибо книги "Профессиональное PHP программирование") Итак. файл mailsimple.php | Код | <?php /* * Базовый класс MailSimple * Использует встроенную функция mail(...), для того чтобы отправить письмо. * Использует настройки php.ini для правильной работы mail(...); */
include("errormsg.php");
// mailsimple.php
class MailSimple { // основные параметры var $to=""; // адрес того, кому отправляем сообщением (может быть несколько) var $from=""; // адрес того, кто отправляет сообщение var $replyTo=""; // адрес, на который будет приходить ответ об удачном/неудачном отправлении письма var $cc=""; // адреса, кому придут копии соообщения от отправителя, все получатели видят, кто ещё получил копии var $bcc=""; // слепая копия - копия сообщения, но получатели не видят кто ещё получил копии, кроме него var $subj=""; // заголовок сообщения электронной почты var $body=""; // тело сообщения электронной почты
// дополнительные параметры var $ereg_check=true; // проверка почтовых адресов с помощью регулярных выражений (true - да) var $subj_empty=false; // возможность отправить электронного сообщения с пустым заголовком (false - нет) var $body_empty=false; // возможность отправить электронного сообщения с пустым телом (false - нет) var $view_email=array(); // используется для вывода электронного письма на экран, в удобном виде
// переменная для создания экземпляра класса ошибок var $ErrorMessageSimple='ErrorMessageSimpleClass'; var $E;
// конструктор function MailSimple() { $this->ERR__=new $this->ErrorMessageSimple(); }
// проверка на пустоту заголовка с учетом доп. параметров // проверка почтовых адресов c помощью регулярного выражения function checkMail() { if(empty($this->to)){ $this->E=$this->ERR__->E_EMPTY_MAIL_TO; return false; }
if(empty($this->subj) && !$this->subj_empty) { $this->E=$this->ERR__->E_EMPTY_SUBJ; return false; }
if(empty($this->body) && !$this->body) { $this->E=$this->ERR__->E_EMPTY_BOBY; return false; }
// замена; на , в полях: to, cc, bcc $this->to=ereg_replace(";", ",", $this->to); $this->cc=ereg_replace(";", ",", $this->cc); $this->bcc=ereg_replace(";", ",", $this->bcc);
if(!empty($this->from)) $this->headers[]="From: $this->from"; if(!empty($this->replyTo)) $this->headers[]="Reply-To: $this->replyTo";
if($this->validate_email) { $toM=explode(",",$this->to); if(!empty($this->cc)) $ccM=explode(",", $this->cc); if(!empty($this->bcc)) $bccM=explode(",", $this->bcc);
if(!$this->eregMail($toM)) { $this->E=$this->ERR__->E_TO_EMAIL; return false; }
if(is_array($ccM) && !$this->eregMail($ccM)) { $this->E=$this->ERR__->E_CC_EMAIL; return false; }
if(is_array($bccM) && !$this->eregMail($bccM)) { $this->E=$this->ERR__->E_BCC_EMAIL; return false; } }
return true; }
// проверка, почтовых адресов c помощью регулярного выражения function eregMail($_email) { foreach($_email as $temp) { if(!eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+))*$",$temp)) { return false; } } return true; }
// включение заголовков function buildTitle() { if(!empty($this->cc)) $this->headers[]="Cc: $this->cc"; if(!empty($this->bcc)) $this->headers[]="Bcc: $this->bcc"; }
// вывод сообщения письма function viewMail() { if($this->checkMail()) return false;
$this->headers=array(); $this->buildTitle(); $this->headers[]="From: $this->from"; $this->headers[]="To: $this->to"; $this->headers[]="Subject: $this->subject";
$viewM=implode("\r\n",$this->headers); $viewM.="\r\n"; $viewM.=$this->body;
return $viewM; }
function sendMail() { if(!$this->checkMail()) return true; $this->buildTitle();
if(mail($this->to,stripslashes(trim($this->subj)),stripslashes($this->body),implode("\r\n",$this->headers))) return true; else { $this->E=$this->ERR__->E_SEND; return false; } }
}
?>
| файл errormsg.php| Код | <?php
class ErrorMessageSimple {
// сообщения об ошибках var $E_EMPTY_MAIL_TO; var $E_EMPTY_SUBJ; var $E_EMPTY_BOBY; var $E_TO_EMAIL; var $E_CC_EMAIL; var $E_BCC_EMAIL; var $E_SEND; function ErrorMessageSimple() { $this->E_EMPTY_MAIL_TO="Empty to field."; $this->E_EMPTY_SUBJ="Empty subject field."; $this->E_EMPTY_BOBY="Emmpty body field."; $this->E_TO_EMAIL="To - incorrectly set field."; $this->E_CC_EMAIL="Cc - incorrectly set field."; $this->E_BCC_EMAIL="Bcc - incorrectly set field."; $this->E_SEND="Not send, because error"; }
} class ErrorMessageSMTP {
// сообщения об ошибках var $E_SMTP_HOST; var $E_SMTP_CONN; var $E_SMTP_NOT_CONN; var $E_INIT_SOCKET; var $E_UNKNOWN; var $E_HELO_NOT; var $E_HELO_FAILED; var $E_QUIT_FAILED; var $E_MAIL_NOT; var $E_RCPT_NOT; var $E_DATA_NOT;
function ErrorMessageSMTP() { $this->E_SMTP_HOST="SMTP host not set yet"; $this->E_INIT_SOCKET="Couldn't initialize the socket"; $this->E_SMTP_CONN="Failed to connect"; $this->E_UNKNOWN="Unknown response from the server"; $this->E_SMTP_NOT_CONN="Not connect to SMTP server"; $this->E_HELO_NOT="HELO command needs an arguments"; $this->E_HELO_FAILED="HELO command failed"; $this->E_MAIL_NOT="MAIL command needs an arguments"; $this->E_RCPT_NOT="RCPT command needs an arguments"; $this->E_DATA_NOT="DATA command needs an arguments"; $this->E_QUIT_FAILED="QUIT command failed"; }
} ?>
| файл mailsmtp.php Вот этот файл Вам и нужен, со всеми остальными, пока нет времени, потом комментарии напишу.
| Код | <?php include "mailsimple.php";
class MailSMTP extends MailSimple { var $smtp_host=""; var $smtp_port=25; var $socket=0; // сокет, через который общается сценарий и сервер SMTP var $response_code=0; var $response_msg=""; var $ErrorMessageSMTP='ErrorMessageSMTP'; var $E; function MailSMTP() { $this->ER__=new $this->ErrorMessageSMTP(); } function connect() { if(empty($this->smtp_host)) { $this->E=$this->ER__->E_SMTP_HOST; return false; } $this->socket=fsockopen($this->smtp_host,$this->smtp_port,&$err_no,&$err_str); if(!$this->socket) { if(!$err_no){ $err_str=$this->ER__->E_INIT_SOCKET; } $this->E=$this->ER__->E_SMTP_CONN . "$err_no: $err_str"; return false; } if(!$this->getAns()) { $this->E=$this->ER__->E_UNKNOWN . " : " . $this->response_msg; return false; } if($this->response_code!=220){ $this->E=$this->ER__->E_SMTP_CONN." ".$this->response_code." ".$this->response_msg; return false; } return true; } function getAns() { if(!$this->socket) { $this->E=$this->ER__->E_SMTP_NOT_CONN; return false; } $server_response=fgets($this->socket,1024); if(ereg("^([0-9]{3})(.*)$",$server_response,$match)) { $this->response_code=$match[1]; $this->response_msg=$match[2]; return true; } $this->response_msg=$server_response; return false; } function see($_command,$_arg='') { if($this->socket) { $this->E=$this->ER__->E_SMTP_NOT_CONN; return false; } switch($_command) {
case "HELO": if (empty($_arg)) { $this->E=$this->ER__->E_HELO_NOT; return false; } $smtp_cmd="HELO $_arg\r\n"; fwrite($this->socket,$smtp_cmd); if(!$this->getAns()){ $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg; return false; } if($this->response_code!=250){ $this->E=$this->ER__->E_HELO_FAILED." ".$this->response_code." ".$this->response_msg; return false; } break; case "MAIL": if(empty($_arg)) { $this->E=$this->ER__->E_MAIL_NOT; return false; } $smtp_cmd="MAIL FROM: $_arg\r\n"; fwrite($this->socket,$smtp_cmd); if(!$this->getAns()) { $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg; return false; } if($this->response_code!=250){ $this->E=$this->ER__->E_MAIL_FAILED." ".$this->response_code." ".$this->response_msg; return false; } break; case "RCPT": if(empty($_arg)) { $this->E=$this->ER__->E_RCPT_NOT; return false; } $toM=explode(",",$_arg); foreach ($toM as $temp){ $smtp_cmd="RCPT TO: $temp\r\n"; fwrite($this->socket,$smtp_cmd); if(!$this->getAns()) { $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg; return false; }
if($this->response_code!=250){ $this->E=$this->ER__->E_RCPT_FAILED." ".$this->response_code." ".$this->response_msg; return false; } } break; case "DATA": if(empty($_arg)) { $this->E=$this->ER__->E_DATA_NOT; return false; } $smtp_cmd="DATA\r\n"; fwrite($this->socket,$smtp_cmd); if(!$this->getAns()) { $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg; return false; } if($this->response_code!=354){ $this->E=$this->ER__->E_DATA_FAILED." ".$this->response_code." ".$this->response_msg; return false; } $smtp_cmd="$_arg\r\n"."."."\r\n"; fwrite($this->socket,$smtp_cmd); if(!$this->getAns()) { $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg; return false; } if($this->response_code!=250){ $this->E=$this->ER__->E_DATA_FAILED." ".$this->response_code." ".$this->response_msg; return false; } break; case "QUIT": $smtp_cmd="QUIT\r\n"; fwrite($this->socket,$smtp_cmd); if(!$this->getAns()) { $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg; return false; } if($this->response_code!=221){ $this->E=$this->ER__->E_QUIT_FAILED." ".$this->response_code." ".$this->response_msg; return false; } break; default: $this->E=$this->ER__->E_UNRECOG; return false; break; } return true; } function sendMail() { if($this->checkMail()) return false; $this->buildTitle(); if(!$this->connect()) return false; if(!$this->see("HELO",$GLOBALS["SERVER_NAME"])) return false; if(!$this->see("MAIL", $this->from)) return false; if(!$this->see("RCPT", $this->to)) return false; if(!empty($this->to)) $this->headers[]="To: $this->to"; if(!empty($this->subject)) $this->headers[]="Subject: $this->subject"; if(!$this->see("DATA", implode("\r\n",$this->headers) . "\r\n\r\n" . $this->body)) return false; if(!$this->see("QUIT")) return false; fclose($this->socket); return true; }
} ?>
| файл testsmtp.php Честно признаюсь, т.к. это старая версия, не уверен что работает, хотя...
| Код | <?php include("mailsmtp.php");
$mail=new MailSMTP(); $mail->smtp_host="mail.ru"; $mail->to="[email protected]"; $mail->from="[email protected]"; $mail->subject="Test"; $mail->body="Is it work?"; if($mail->sendMail()){ echo("Success : $mail->subj"); } else die("Error : $mail->subj " . $mail->E); echo("<br>"); echo(str_replace("\r\n","<br",$mail->viewMail())); ?>
|
Все удачи. Это сообщение отредактировал(а) Наставник - 24.2.2005, 18:42
|