diff --git a/phpgwapi/inc/class.send.inc.php b/phpgwapi/inc/class.send.inc.php index ff25bb8921..094fde37ff 100644 --- a/phpgwapi/inc/class.send.inc.php +++ b/phpgwapi/inc/class.send.inc.php @@ -27,27 +27,29 @@ /* $Id$ */ -class send { - var $err = array("code","msg","desc"); - var $to_res = array(); - - function send() { - $this->err["code"] = " "; - $this->err["msg"] = " "; - $this->err["desc"] = " "; - } + class send + { + var $err = array("code","msg","desc"); + var $to_res = array(); + function send() + { + $this->err["code"] = " "; + $this->err["msg"] = " "; + $this->err["desc"] = " "; + } + function msg($service, $to, $subject, $body, $msgtype='', $cc='', $bcc='', $from='', $sender='') { global $phpgw_info, $phpgw, $attach_sig; if ($from == '') - { - $from = $phpgw_info['user']['fullname'].' <'.$phpgw_info['user']['preferences']['email']['address'].'>'; - } - if ($sender == '') - { - $sender = $phpgw_info['user']['fullname'].' <'.$phpgw_info['user']['preferences']['email']['address'].'>'; - } + { + $from = $phpgw_info['user']['fullname'].' <'.$phpgw_info['user']['preferences']['email']['address'].'>'; + } + if ($sender == '') + { + $sender = $phpgw_info['user']['fullname'].' <'.$phpgw_info['user']['preferences']['email']['address'].'>'; + } if ($service == "email") { @@ -76,7 +78,9 @@ class send { if ($phpgw_info['user']['preferences']['email']['email_sig'] && $attach_sig) { - $body .= "\n-----\n".$phpgw_info['user']['preferences']['email']['email_sig']; + //$body .= "\n-----\n".$phpgw_info['user']['preferences']['email']['email_sig']; + $get_sig = $this->sig_html_to_text($phpgw_info['user']['preferences']['email']['email_sig']); + $body .= "\n-----\n" .$get_sig; } if (ereg('Message-Boundary', $body)) @@ -130,163 +134,259 @@ class send { } elseif ($type == 'nntp') { - } - } + // nothing is here? + } + } // ==================================================[ some sub-functions ]=== - function socket2msg($socket) { - $followme = "-"; $this->err["msg"] = ""; - do { - $rmsg = fgets($socket,255); -// echo "< $rmsg
\n"; - $this->err["code"] = substr($rmsg,0,3); - $followme = substr($rmsg,3,1); - $this->err["msg"] = substr($rmsg,4); - if (substr($this->err["code"],0,1) != 2 && substr($this->err["code"],0,1) != 3) { - $rc = fclose($socket); - return false; - } - if ($followme = " ") { break; } - } while ($followme = "-"); - return true; + function socket2msg($socket) + { + $followme = "-"; + $this->err["msg"] = ""; + do + { + $rmsg = fgets($socket,255); + // echo "< $rmsg
\n"; + $this->err["code"] = substr($rmsg,0,3); + $followme = substr($rmsg,3,1); + $this->err["msg"] = substr($rmsg,4); + if (substr($this->err["code"],0,1) != 2 && substr($this->err["code"],0,1) != 3) + { + $rc = fclose($socket); + return false; + } + if ($followme = " ") + { + break; + } + } + while ($followme = "-"); + return true; } - function msg2socket($socket,$message) { // send single line\n - // echo "raw> $message
\n"; - // echo "hex> ".bin2hex($message)."
\n"; - $rc = fputs($socket,"$message"); - if (!$rc) { - $this->err["code"] = "420"; - $this->err["msg"] = "lost connection"; - $this->err["desc"] = "Lost connection to smtp server."; - $rc = fclose($socket); - return false; - } - return true; + function msg2socket($socket,$message) + { + // send single line\n + // echo "raw> $message
\n"; + // echo "hex> ".bin2hex($message)."
\n"; + $rc = fputs($socket,"$message"); + if (!$rc) + { + $this->err["code"] = "420"; + $this->err["msg"] = "lost connection"; + $this->err["desc"] = "Lost connection to smtp server."; + $rc = fclose($socket); + return false; + } + return true; } - function put2socket($socket,$message) { // check for multiple lines 1st - $pos = strpos($message,"\n"); - if (!is_int($pos)) { // no new line found - $message .= "\r\n"; - $this->msg2socket($socket,$message); - } else { // multiple lines, we have to split it - do { - $msglen = $pos + 1; - $msg = substr($message,0,$msglen); - $message = substr($message,$msglen); - $pos = strpos($msg,"\r\n"); - if (!is_int($pos)) { // line not terminated - $msg = chop($msg)."\r\n"; - } - $pos = strpos($msg,"."); // escape leading periods - if (is_int($pos) && !$pos) { - $msg = "." . $msg; - } - if (!$this->msg2socket($socket,$msg)) { return false; } - $pos = strpos($message,"\n"); - } while (strlen($message)>0); - } - return true; + function put2socket($socket,$message) + { + // check for multiple lines 1st + $pos = strpos($message,"\n"); + if (!is_int($pos)) + { + // no new line found + $message .= "\r\n"; + $this->msg2socket($socket,$message); + } + else + { + // multiple lines, we have to split it + do + { + $msglen = $pos + 1; + $msg = substr($message,0,$msglen); + $message = substr($message,$msglen); + $pos = strpos($msg,"\r\n"); + if (!is_int($pos)) + { + // line not terminated + $msg = chop($msg)."\r\n"; + } + $pos = strpos($msg,"."); // escape leading periods + if (is_int($pos) && !$pos) + { + $msg = "." . $msg; + } + if (!$this->msg2socket($socket,$msg)) + { + return false; + } + $pos = strpos($message,"\n"); + } + while (strlen($message)>0); + } + return true; } - function check_header($subject,$header) { // check if header contains subject - // and is correctly terminated - $header = chop($header); - $header .= "\n"; - if (is_string($subject) && !$subject) { // no subject specified - return $header; - } - $theader = strtolower($header); - $pos = strpos($theader,"\nsubject:"); - if (is_int($pos)) { // found after a new line - return $header; - } - $pos = strpos($theader,"subject:"); - if (is_int($pos) && !$pos) { // found at start - return $header; - } - $pos = substr($subject,"\n"); - if (!is_int($pos)) $subject .= "\n"; - $subject = "Subject: " .$subject; - $header .= $subject; - return $header; + function check_header($subject,$header) + { + // check if header contains subject and is correctly terminated + $header = chop($header); + $header .= "\n"; + if (is_string($subject) && !$subject) + { + // no subject specified + return $header; + } + $theader = strtolower($header); + $pos = strpos($theader,"\nsubject:"); + if (is_int($pos)) + { + // found after a new line + return $header; + } + $pos = strpos($theader,"subject:"); + if (is_int($pos) && !$pos) + { + // found at start + return $header; + } + $pos = substr($subject,"\n"); + if (!is_int($pos)) $subject .= "\n"; + $subject = "Subject: " .$subject; + $header .= $subject; + return $header; + } + + function sig_html_to_text($sig) + { + // convert HTML chars in the email sig to normal text + // note: initially include a "magic_quote" like escape slash with the single and double quotes + $sig_clean = $sig; + $sig_clean = ereg_replace('>', '>', $sig_clean); + $sig_clean = ereg_replace('<', '<', $sig_clean); + $sig_clean = ereg_replace('"', '\"', $sig_clean); + $sig_clean = ereg_replace(''', '\'', $sig_clean); + $sig_clean = ereg_replace('&', '&', $sig_clean); + // now strip the "magic_quote" like escape slashs + $sig_clean = stripslashes($sig_clean); + return $sig_clean; } // ==============================================[ main function: smail() ]=== - function smail($to,$subject,$message,$header) { - global $phpgw_info; + function smail($to,$subject,$message,$header) + { + global $phpgw_info; - $fromuser = $phpgw_info["user"]["preferences"]["email"]["address"]; - $mymachine = $phpgw_info["server"]["hostname"]; - $errcode = ""; $errmsg = ""; // error code and message of failed connection - $timeout = 5; // timeout in secs + $fromuser = $phpgw_info["user"]["preferences"]["email"]["address"]; + $mymachine = $phpgw_info["server"]["hostname"]; + // error code and message of failed connection + $errcode = ""; + $errmsg = ""; + // timeout in secs + $timeout = 5; - // now we try to open the socket and check, if any smtp server responds - $socket = fsockopen($phpgw_info["server"]["smtp_server"],$phpgw_info["server"]["smtp_port"],$errcode,$errmsg,$timeout); - if (!$socket) { - $this->err["code"] = "420"; - $this->err["msg"] = "$errcode:$errmsg"; - $this->err["desc"] = "Connection to ".$phpgw_info["server"]["smtp_server"].":".$phpgw_info["server"]["smtp_port"]." failed - could not open socket."; - return false; - } else { - $rrc = $this->socket2msg($socket); - } + // now we try to open the socket and check, if any smtp server responds + $socket = fsockopen($phpgw_info["server"]["smtp_server"],$phpgw_info["server"]["smtp_port"],$errcode,$errmsg,$timeout); + if (!$socket) + { + $this->err["code"] = "420"; + $this->err["msg"] = "$errcode:$errmsg"; + $this->err["desc"] = "Connection to ".$phpgw_info["server"]["smtp_server"].":".$phpgw_info["server"]["smtp_port"]." failed - could not open socket."; + return false; + } + else + { + $rrc = $this->socket2msg($socket); + } - // now we can send our message. 1st we identify ourselves and the sender - $cmds = array ( - "\$src = \$this->msg2socket(\$socket,\"HELO \$mymachine\r\n\");", - "\$rrc = \$this->socket2msg(\$socket);", - "\$src = \$this->msg2socket(\$socket,\"MAIL FROM:<\$fromuser>\r\n\");", - "\$rrc = \$this->socket2msg(\$socket);" - ); - for ($src=true,$rrc=true,$i=0; $imsg2socket(\$socket,\"HELO \$mymachine\r\n\");", + "\$rrc = \$this->socket2msg(\$socket);", + "\$src = \$this->msg2socket(\$socket,\"MAIL FROM:<\$fromuser>\r\n\");", + "\$rrc = \$this->socket2msg(\$socket);" + ); + for ($src=true,$rrc=true,$i=0; $imsg2socket($socket,'RCPT TO:<'.$toaddr[$i].">\r\n"); - $rrc = $this->socket2msg($socket); - $this->to_res[$i][addr] = $toaddr[$i]; // for lateron validation - $this->to_res[$i][code] = $this->err["code"]; - $this->to_res[$i][msg] = $this->err["msg"]; - $this->to_res[$i][desc] = $this->err["desc"]; - } + // now we've got to evaluate the $to's + $toaddr = explode(",",$to); + $numaddr = count($toaddr); + for ($i=0; $i<$numaddr; $i++) + { + $src = $this->msg2socket($socket,'RCPT TO:<'.$toaddr[$i].">\r\n"); + $rrc = $this->socket2msg($socket); + // for lateron validation + $this->to_res[$i][addr] = $toaddr[$i]; + $this->to_res[$i][code] = $this->err["code"]; + $this->to_res[$i][msg] = $this->err["msg"]; + $this->to_res[$i][desc] = $this->err["desc"]; + } - //now we have to make sure that at least one $to-address was accepted - $stop = 1; - for ($i=0;$ito_res);$i++) { - $rc = substr($this->to_res[$i][code],0,1); - if ($rc == 2) { // at least to this address we can deliver - $stop = 0; - } - } - if ($stop) return false; // no address found we can deliver to + //now we have to make sure that at least one $to-address was accepted + $stop = 1; + for ($i=0;$ito_res);$i++) + { + $rc = substr($this->to_res[$i][code],0,1); + if ($rc == 2) + { + // at least to this address we can deliver + $stop = 0; + } + } + if ($stop) + { + // no address found we can deliver to + return false; + } - // now we can go to deliver the message! - if (!$this->msg2socket($socket,"DATA\r\n")) return false; - if (!$this->socket2msg($socket)) return false; - if ($header != "") { - $header = $this->check_header($subject,$header); - if (!$this->put2socket($socket,$header)) return false; - if (!$this->put2socket($socket,"\r\n")) return false; - } - $message = chop($message); - $message .= "\n"; - if (!$this->put2socket($socket,$message)) return false; - if (!$this->msg2socket($socket,".\r\n")) return false; - if (!$this->socket2msg($socket)) return false; - if (!$this->msg2socket($socket,"QUIT\r\n")) return false; - Do { - $closing = $this->socket2msg($socket); - } while ($closing); - return true; + // now we can go to deliver the message! + if (!$this->msg2socket($socket,"DATA\r\n")) + { + return false; + } + if (!$this->socket2msg($socket)) + { + return false; + } + if ($header != "") + { + $header = $this->check_header($subject,$header); + if (!$this->put2socket($socket,$header)) + { + return false; + } + if (!$this->put2socket($socket,"\r\n")) + { + return false; + } + } + $message = chop($message); + $message .= "\n"; + if (!$this->put2socket($socket,$message)) + { + return false; + } + if (!$this->msg2socket($socket,".\r\n")) + { + return false; + } + if (!$this->socket2msg($socket)) + { + return false; + } + if (!$this->msg2socket($socket,"QUIT\r\n")) + { + return false; + } + do + { + $closing = $this->socket2msg($socket); + } + while ($closing); + return true; } // end of class