93 $this->helo_rply = null;
115 public function Connect($host, $port = 0, $tval = 30) {
120 if($this->connected()) {
122 $this->error = array(
"error" =>
"Already connected to a server");
131 $this->smtp_conn = @fsockopen($host,
137 if(empty($this->smtp_conn)) {
138 $this->error = array(
"error" =>
"Failed to connect to server",
140 "errstr" => $errstr);
141 if($this->do_debug >= 1) {
142 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": $errstr ($errno)" . $this->CRLF .
'<br />';
149 if(substr(PHP_OS, 0, 3) !=
"WIN")
150 socket_set_timeout($this->smtp_conn, $tval, 0);
155 if($this->do_debug >= 2) {
156 echo
"SMTP -> FROM SERVER:" . $announce . $this->CRLF .
'<br />';
172 $this->error = null; # to avoid confusion
174 if(!$this->connected()) {
175 $this->error = array(
"error" =>
"Called StartTLS() without being connected");
179 fputs($this->smtp_conn,
"STARTTLS" . $this->CRLF);
182 $code = substr($rply,0,3);
184 if($this->do_debug >= 2) {
185 echo
"SMTP -> FROM SERVER:" . $rply . $this->CRLF .
'<br />';
190 array(
"error" =>
"STARTTLS not accepted from server",
191 "smtp_code" => $code,
192 "smtp_msg" => substr($rply,4));
193 if($this->do_debug >= 1) {
194 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
200 if(!stream_socket_enable_crypto($this->smtp_conn,
true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
215 fputs($this->smtp_conn,
"AUTH LOGIN" . $this->CRLF);
218 $code = substr($rply,0,3);
222 array(
"error" =>
"AUTH not accepted from server",
223 "smtp_code" => $code,
224 "smtp_msg" => substr($rply,4));
225 if($this->do_debug >= 1) {
226 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
232 fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);
235 $code = substr($rply,0,3);
239 array(
"error" =>
"Username not accepted from server",
240 "smtp_code" => $code,
241 "smtp_msg" => substr($rply,4));
242 if($this->do_debug >= 1) {
243 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
249 fputs($this->smtp_conn, base64_encode(
$password) . $this->CRLF);
252 $code = substr($rply,0,3);
256 array(
"error" =>
"Password not accepted from server",
257 "smtp_code" => $code,
258 "smtp_msg" => substr($rply,4));
259 if($this->do_debug >= 1) {
260 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
274 if(!empty($this->smtp_conn)) {
275 $sock_status = socket_get_status($this->smtp_conn);
276 if($sock_status[
"eof"]) {
278 if($this->do_debug >= 1) {
279 echo
"SMTP -> NOTICE:" . $this->CRLF .
"EOF caught while checking if connected";
298 $this->helo_rply = null;
299 if(!empty($this->smtp_conn)) {
301 fclose($this->smtp_conn);
302 $this->smtp_conn = 0;
329 public function Data($msg_data) {
332 if(!$this->connected()) {
333 $this->error = array(
334 "error" =>
"Called Data() without being connected");
338 fputs($this->smtp_conn,
"DATA" . $this->CRLF);
341 $code = substr($rply,0,3);
343 if($this->do_debug >= 2) {
344 echo
"SMTP -> FROM SERVER:" . $rply . $this->CRLF .
'<br />';
349 array(
"error" =>
"DATA command not accepted from server",
350 "smtp_code" => $code,
351 "smtp_msg" => substr($rply,4));
352 if($this->do_debug >= 1) {
353 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
370 $msg_data = str_replace(
"\r\n",
"\n",$msg_data);
371 $msg_data = str_replace(
"\r",
"\n",$msg_data);
372 $lines = explode(
"\n",$msg_data);
383 $field = substr($lines[0],0,strpos($lines[0],
":"));
385 if(!empty($field) && !strstr($field,
" ")) {
389 $max_line_length = 998;
391 while(list(,$line) = @each($lines)) {
393 if($line ==
"" && $in_headers) {
397 while(strlen($line) > $max_line_length) {
398 $pos = strrpos(substr($line,0,$max_line_length),
" ");
402 $pos = $max_line_length - 1;
403 $lines_out[] = substr($line,0,
$pos);
404 $line = substr($line,
$pos);
406 $lines_out[] = substr($line,0,
$pos);
407 $line = substr($line,
$pos + 1);
414 $line =
"\t" . $line;
417 $lines_out[] = $line;
420 while(list(,$line_out) = @each($lines_out)) {
421 if(strlen($line_out) > 0)
423 if(substr($line_out, 0, 1) ==
".") {
424 $line_out =
"." . $line_out;
427 fputs($this->smtp_conn,$line_out . $this->CRLF);
432 fputs($this->smtp_conn, $this->CRLF .
"." . $this->CRLF);
435 $code = substr($rply,0,3);
437 if($this->do_debug >= 2) {
438 echo
"SMTP -> FROM SERVER:" . $rply . $this->CRLF .
'<br />';
443 array(
"error" =>
"DATA not accepted from server",
444 "smtp_code" => $code,
445 "smtp_msg" => substr($rply,4));
446 if($this->do_debug >= 1) {
447 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
469 if(!$this->connected()) {
470 $this->error = array(
471 "error" =>
"Called Hello() without being connected");
497 fputs($this->smtp_conn, $hello .
" " . $host . $this->CRLF);
500 $code = substr($rply,0,3);
502 if($this->do_debug >= 2) {
503 echo
"SMTP -> FROM SERVER: " . $rply . $this->CRLF .
'<br />';
508 array(
"error" => $hello .
" not accepted from server",
509 "smtp_code" => $code,
510 "smtp_msg" => substr($rply,4));
511 if($this->do_debug >= 1) {
512 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
517 $this->helo_rply = $rply;
539 if(!$this->connected()) {
540 $this->error = array(
541 "error" =>
"Called Mail() without being connected");
545 $useVerp = ($this->do_verp ?
"XVERP" :
"");
546 fputs($this->smtp_conn,
"MAIL FROM:<" . $from .
">" . $useVerp . $this->CRLF);
549 $code = substr($rply,0,3);
551 if($this->do_debug >= 2) {
552 echo
"SMTP -> FROM SERVER:" . $rply . $this->CRLF .
'<br />';
557 array(
"error" =>
"MAIL not accepted from server",
558 "smtp_code" => $code,
559 "smtp_msg" => substr($rply,4));
560 if($this->do_debug >= 1) {
561 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
579 public function Quit($close_on_error =
true) {
582 if(!$this->connected()) {
583 $this->error = array(
584 "error" =>
"Called Quit() without being connected");
589 fputs($this->smtp_conn,
"quit" . $this->CRLF);
594 if($this->do_debug >= 2) {
595 echo
"SMTP -> FROM SERVER:" . $byemsg . $this->CRLF .
'<br />';
601 $code = substr($byemsg,0,3);
604 $e = array(
"error" =>
"SMTP server rejected quit command",
605 "smtp_code" => $code,
606 "smtp_rply" => substr($byemsg,4));
608 if($this->do_debug >= 1) {
609 echo
"SMTP -> ERROR: " . $e[
"error"] .
": " . $byemsg . $this->CRLF .
'<br />';
613 if(empty($e) || $close_on_error) {
635 if(!$this->connected()) {
636 $this->error = array(
637 "error" =>
"Called Recipient() without being connected");
641 fputs($this->smtp_conn,
"RCPT TO:<" . $to .
">" . $this->CRLF);
644 $code = substr($rply,0,3);
646 if($this->do_debug >= 2) {
647 echo
"SMTP -> FROM SERVER:" . $rply . $this->CRLF .
'<br />';
650 if($code != 250 && $code != 251) {
652 array(
"error" =>
"RCPT not accepted from server",
653 "smtp_code" => $code,
654 "smtp_msg" => substr($rply,4));
655 if($this->do_debug >= 1) {
656 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
678 if(!$this->connected()) {
679 $this->error = array(
680 "error" =>
"Called Reset() without being connected");
684 fputs($this->smtp_conn,
"RSET" . $this->CRLF);
687 $code = substr($rply,0,3);
689 if($this->do_debug >= 2) {
690 echo
"SMTP -> FROM SERVER:" . $rply . $this->CRLF .
'<br />';
695 array(
"error" =>
"RSET failed",
696 "smtp_code" => $code,
697 "smtp_msg" => substr($rply,4));
698 if($this->do_debug >= 1) {
699 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
726 if(!$this->connected()) {
727 $this->error = array(
728 "error" =>
"Called SendAndMail() without being connected");
732 fputs($this->smtp_conn,
"SAML FROM:" . $from . $this->CRLF);
735 $code = substr($rply,0,3);
737 if($this->do_debug >= 2) {
738 echo
"SMTP -> FROM SERVER:" . $rply . $this->CRLF .
'<br />';
743 array(
"error" =>
"SAML not accepted from server",
744 "smtp_code" => $code,
745 "smtp_msg" => substr($rply,4));
746 if($this->do_debug >= 1) {
747 echo
"SMTP -> ERROR: " . $this->error[
"error"] .
": " . $rply . $this->CRLF .
'<br />';
768 $this->error = array(
"error" =>
"This method, TURN, of the SMTP ".
769 "is not implemented");
770 if($this->do_debug >= 1) {
771 echo
"SMTP -> NOTICE: " . $this->error[
"error"] . $this->CRLF .
'<br />';
800 while(!feof($this->smtp_conn)) {
801 $str = @fgets($this->smtp_conn,515);
802 if($this->do_debug >= 4) {
803 echo
"SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF .
'<br />';
804 echo
"SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF .
'<br />';
807 if($this->do_debug >= 4) {
808 echo
"SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF .
'<br />';
811 if(substr($str,3,1) ==
" ") {
break; }