body =""; $this->bodies = array(); $this->contenttype = "text/plain"; $this->contentdesc = ""; $this->contentdispotype = ""; $this->contentdisponame = ""; $this->contentencoding = "8bit"; $this->contentclass = ""; $this->charset = $lang['content_encoding']; // default $this->eoln = "\r\n"; $this->boundary = "-----------END_OF_TUTOS_MAIL_PART_". Date("Ymd") ."------"; $this->url = "http://\r\n"; $this->part = 1; } /** * Parser: initialize */ function parse_init() { $this->in_sub_body = false; $this->got_header = false; $this->parse_in = ""; $this->ct = ""; $this->cd = ""; $this->references = ""; } /** * output the body */ function output(&$writer) { $cnt = count($this->bodies); if ( $cnt > 1 ) { $writer->writechannel("MIME-Version: 1.0"); $writer->writechannel("Content-Type: multipart/mixed;". $this->eoln ."\tboundary=\"". $this->boundary ."\""); } else { $writer->writechannel("Content-Type: ". $this->contenttype); $writer->writechannel("Content-Description: ". $this->contentdesc); $writer->writechannel("Content-Transfer-Encoding: 8bit"); } # A empty line starts the MAIN BODY $writer->writechannel(""); if ( $cnt > 1 ) { $writer->writechannel("This is a multi-part message in MIME format."); $writer->writechannel($this->body); } else { # Send the body line by line if (ereg("text",$this->contenttype) ) { $lines = split("[\n]",$this->body); for ($j = 0; $j < count($lines); $j++) { $writer->writechannel($lines[$j]); } } else { $writer->writechannel(chunk_split(Base64_Encode($this->body))); } } foreach($this->bodies as $abody) { if ( $cnt > 1 ) { $writer->writechannel($this->eoln."--". $this->boundary); if (ereg("text",$abody->contenttype) ) { $writer->writechannel("Content-Type: ". $abody->contenttype ."; charset=\"". $abody->charset ."\""); } else { $writer->writechannel("Content-Type: ". $abody->contenttype."; name=". $abody->contentdisponame); } $writer->writechannel("Content-Description: ". $abody->contentdesc); if (ereg("text",$abody->contenttype) ) { $writer->writechannel("Content-Transfer-Encoding: 8bit"); } else { $writer->writechannel("Content-Transfer-Encoding: base64"); } if ( $abody->contentdisponame != "" ) { $writer->writechannel("Content-Disposition: ". $abody->contentdispotype ." filename=". $abody->contentdisponame); } # A empty line starts the Parts BODY $writer->writechannel(""); } # Send the body line by line if (ereg("text",$abody->contenttype) ) { $lines = split("[\n]",$abody->body); for ($j = 0; $j < count($lines); $j++) { $writer->writechannel($lines[$j]); } } else { $writer->writechannel(chunk_split(Base64_Encode($abody->body))); } } if ( $cnt > 1 ) { $writer->writechannel($this->eoln."--". $this->boundary ."--"); } } /** * add a body part * content = the body content * type = mime type of that body part default to text/plain * desc = Description * dispo = Content-Disposition */ function addBody($content,$type = "text/plain",$desc = "TUTOS Mail Part" , $dispo = "", $charset = "us-ascii") { $b = new mail_body(); if ( $type == "text/plain" ) { $b->body = StripSlashes($content); $b->contenttype = $type; } else { $b->body = $content; $b->contenttype = $type ; } $b->contentdesc = $desc; $b->contentdisponame = $dispo; $b->contentdispotype = "inline"; $b->charset = $charset; if (eregi("^multipart/",$this->contenttype)) { # this is already a multipart body # add the new body $this->bodies[] = &$b; } else if (eregi("^text/plain",$this->contenttype) && (strlen($this->body) == 0) && (count($this->bodies) == 0) ) { # we are a new mail $this->contenttype = $b->contenttype; $this->contentdesc = $b->contentdesc; $this->contentdisponame = $b->contentdisponame; $this->contentdispotype = $b->contentdispotype; $this->charset = $b->charset; $this->body = $b->body; } else { # change the existing mailbody to a subbody $b2 = new mail_body(); $b2->contenttype = $this->contenttype; $b2->contentdesc = $this->contentdesc; $b2->contentdisponame = $this->contentdisponame; $b2->contentdispotype = $this->contentdispotype; $b2->charset = $this->charset; $b2->body = $this->body; $this->bodies[] = &$b2; $this->bodies[] = &$b; $this->contenttype = "multipart/mixed"; $this->contentdesc = ""; $this->contentdisponame = ""; $this->contentdispotype = ""; $this->body = ""; } } /** * show one body */ function show_html(&$ly,$mformat,$part) { global $tutos,$lang; $skip = false; $show_headline = false; $show_text = false; $show_raw = false; $show_as_frame = false; $show_as_img = false; $select_alternative = false; #echo "PART ".$part ." FORMAT ".$mformat ." this ". $this->part ." ". $this->contenttype ."
"; $r = ""; # $r .= "p:". $this->part ."b:".$this->boundary ."e:".$this->contentencoding ."|t:". $this->contenttype ."|b:".count($this->bodies)."|len:".strlen($this->body) ."". $this->part ."
"; if ( ($part != 0) && ($part != $this->part)) { # echo "SKIP".$this->part; $skip = true; } if (strtolower($this->contenttype) == "text/plain") { $show_headline = true; $show_text = true; } elseif (strtolower($this->contenttype) == "text/calendar") { $show_headline = true; # $show_text = true; } elseif (strtolower($this->contenttype) == "text/x-vcard") { $show_headline = true; # $show_text = true; } elseif (strtolower($this->contenttype) == "text/html") { $show_headline = true; $show_as_frame = true; } elseif (strtolower($this->contenttype) == "message/rfc822") { $show_html = false; } elseif (strtolower($this->contenttype) == "message/delivery-status") { $show_html = false; } elseif (strtolower($this->contenttype) == "message/disposition-notification") { $show_html = false; } elseif (eregi("^multipart/report",$this->contenttype)) { $skip = true; } elseif (eregi("^multipart/mixed",$this->contenttype)) { $skip = true; } elseif (eregi("^multipart/alternative",$this->contenttype)) { $select_alternative = true; } elseif (eregi("^image/",$this->contenttype)) { $show_headline = true; $show_as_img = true; } elseif (eregi("^application",$this->contenttype)) { $show_headline = true; } elseif (eregi("^audio",$this->contenttype)) { $show_headline = true; } else { $r .= "Unknown|".$this->contenttype."|
\n"; $show_headline = true; } if(!$skip && ($mformat == "download") ) { $show_raw = true; $show_text = false; Header("Expires: 0"); Header("Pragma: no-cache"); Header("Content-type: " . $this->contenttype); Header("Content-Disposition: attachment; filename=\"". $this->contentdisponame ."\""); Header("Content-Description: Upload from TUTOS" ); } elseif (!$skip && ($mformat == "show") ) { $show_raw = true; $show_text = false; Header("Expires: 0"); Header("Pragma: no-cache"); Header("Content-type: " . $this->contenttype); } elseif (!$skip && $show_headline) { if ($mformat == 'reply') { $r .= ""; } else { $r .= "\n"; $r .= " ". $this->contentencoding ."|". $this->contenttype ."|"; $r .= "\n"; $r .= "\n"; $xx = "[". makelink($this->getShowLink(), $lang['MailAttachmentShow'],$lang['MailAttachmentShow']) ."]"; $xx .= " [". makelink($this->getDownloadLink(), $lang['MailAttachmentDownload'],$lang['MailAttachmentDownload']) ."]"; if ($this->contentdesc) { $r .= "\n"; $r .= $ly->showfield($lang['Description']); $r.= $ly->showdata($this->contentdesc,2); $r .= "".$xx."\n"; $xx = ""; $r .= "\n"; } $r .= "\n"; $r .= $ly->showfield($lang['MailSize']); $r.= $ly->showdata(strlen($this->body) ." Bytes",2); $r .= "".$xx."\n"; $xx = ""; $r .= "\n"; if ($this->contentdispotype && !empty($this->contentdisponame)) { $r .= "\n"; $r .= $ly->showfield($lang['MailAttachmentNew']); $r.= $ly->showdata(decodeheader($this->contentdisponame) ,3); $r .= "\n"; } } } if ($show_text && $part > 0) { $show_raw = true; $show_text = false; } if ($skip) { // show nada } elseif ($show_text) { if ($mformat == 'reply') { $r .= ""; } else { $r .= "
\n";
      }
      if ($this->contentencoding == "quoted-printable") {
        $r .= wordwrap(quoted_printable_decode($this->body),80);
      } else if ($this->contentencoding == "base64") {
        $r .= wordwrap(base64_decode($this->body),80);
      } else if (($this->contentencoding == "8bit") || ($this->contentencoding == "7bit")) {
        if ($mformat == 'reply') {
          $r .= wordwrap($this->body,80);
        } else {
          $r .= wordwrap(urlreplace(myentities($this->body),80));
        }
      }
      if ($mformat == 'reply') {
        $r .= "";
      } else {
        $r .= "
\n"; } } elseif ($show_raw) { if ($this->contentencoding == "quoted-printable") { $r .= quoted_printable_decode($this->body); } else if ($this->contentencoding == "base64") { $r .= base64_decode($this->body); } else if (($this->contentencoding == "8bit") || ($this->contentencoding == "7bit")) { if (strtolower($this->contenttype) == "text/html") { $r .= urlreplace($this->body,0); } else { $r .= urlreplace($this->body); } } } elseif ($show_as_frame) { if ($mformat == 'reply') { $r .= "--------\n"; } else { $r .= "\n"; $r .= "\n"; $r .= "\n"; } } elseif ($show_as_img) { if ($mformat == 'reply') { $r .= "--------\n"; } else { $r .= "\n"; $r .= "getShowLink() ."\">\n"; $r .= "\n"; } } else { // show only a link for download and for display } if ($select_alternative) { // check for text/plain foreach($this->bodies as $abody) { if (strtolower($abody->contenttype) == "text/plain") { $r .= $abody->show_html($ly,$mformat,$part); break; } else if (strtolower($abody->contenttype) == "text/html") { $r .= $abody->show_html($ly,$mformat,$part); break; } // show all foreach($this->bodies as $abody) { $r .= $abody->show_html($ly,$mformat,$part); } } } else { foreach($this->bodies as $abody) { $r .= $abody->show_html($ly,$mformat,$part); } } return $r; } /** * set the url where we find this mailpart */ function seturl($url) { $this->url = $url; } /** * get the url where we find this mailpart (or all if main == true) */ function geturl($main = false) { if ($main) { $url= addUrlParameter($this->url,"part=0"); } else { $url= addUrlParameter($this->url,"part=".$this->part); } return $url; } /** * get the url where we find this mailpart */ function getShowLink() { $url= addUrlParameter($this->geturl(),"mformat=show"); return $url; } /** * get the url where we download this mailpart */ function getDownloadLink() { $url= addUrlParameter($this->geturl(),"mformat=download"); return $url; } /** * set the PartNr of this mailbody */ function setPart($id) { $this->part = $id; } /** * Parser: parse a single line of mail */ function parse_line($line,$short) { # echo "XXX".myentities($line) ."
"; if (!$this->got_header && (trim($line) == "")) { $this->parse_in = ""; $this->got_header = true; // now we are in the body return; } else if (!$this->got_header) { // analyze if (ereg("^Subject:(.*)",$line,$reg)) { $this->parse_in = ""; $this->subject = trim($reg[1]); } else if (ereg("^From:(.*)",$line,$reg)) { $this->parse_in = ""; $this->setFromTxt(trim($reg[1])); } else if (eregi("^From(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (ereg("^To:(.*)",$line,$reg)) { $this->addTo($reg[1]); $this->parse_in = 'To'; } else if (eregi("^Cc:(.*)",$line,$reg)) { $this->addCc(trim($reg[1])); $this->parse_in = 'Cc'; } else if (eregi("^Date:(.*)",$line,$reg)) { $this->parse_in = ""; $this->date = trim($reg[1]); } else if (eregi("^Return-Receipt-To:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Reply-To:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Received:(.*)",$line,$reg)) { $this->hdr[] = $line; $this->parse_in = 'Received'; } else if (eregi("^Importance:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Content-Id:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^MIME-Version:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Return-Path:(.*)",$line,$reg)) { $this->parse_in = ""; # echo "XXXX". $line ."XXXX"; $this->hdr[] = $line; } else if (eregi("^in-reply-to:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^references:(.*)",$line,$reg)) { $this->parse_in = "references"; $this->references = $reg[1]; } else if (eregi("^Message-ID:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Organization:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Sensitivity:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Disposition-Notification-To:(.*)",$line,$reg)) { } else if (eregi("^User-Agent:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Disposition-Notification-To:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Content-Length:(.*)",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Lines:",$line,$reg)) { $this->parse_in = ""; $this->hdr[] = $line; } else if (eregi("^Content-type:(.*)",$line,$reg)) { $this->parse_in = "Content-type"; $this->ct = $line; # echo "XXXX". $line ."XXXX"; } else if (eregi("^Content-Disposition:(.*)",$line,$reg)) { $this->parse_in = "Content-Disposition"; $this->cd = $reg[1]; } else if (eregi("^Content-class:(.*)",$line,$reg)) { $this->parse_in = ""; $this->contentclass = trim($reg[1]); } else if (eregi("^Content-transfer-encoding:(.*)",$line,$reg)) { $this->parse_in = ""; $this->contentencoding = trim($reg[1]); # echo "enc |". $this->contentencoding ."
\n"; } else if (eregi("^Content-Description:(.*)",$line,$reg)) { $this->parse_in = ""; $this->contentdesc = trim($reg[1]); # echo "desc |". $this->contentdesc ."
\n"; } else if (ereg("^X-.*:(.*)",$line,$reg)) { $this->parse_in = "X"; $this->hdr[] = $line; } else if ($this->parse_in == "X") { $this->hdr[] = $line; } else if ($this->parse_in == "To") { $this->addTo($line); } else if ($this->parse_in == "Cc") { $this->addCc($line); } else if ($this->parse_in == "references") { $this->references .= $line; } else if ($this->parse_in == "Content-type") { $this->ct .= $line; } else if ($this->parse_in == "Content-Disposition") { $this->cd .= $line; } else if ($this->parse_in == "Received") { $this->hdr[] = $line; } else { trigger_error("unknown mailheader | ". $line ."|". $this->parse_in ."|". strlen($line) ."\n"); $this->parse_in = ""; } } // analyze content type if ($this->ct && ($this->parse_in != "Content-type")) { $x = eregi("boundary=[\"]([-_=0-9A-Za-z/.]*)[\"]",$this->ct,$reg); if ($x) { $this->boundary = $reg[1]; } eregi("Content-type:[ ]*([0-9A-Za-z./-]*)",$this->ct,$reg); $this->contenttype = $reg[1]; # echo "ct |". $this->contenttype ."|". $this->ct."
\n"; $this->ct = ""; } // analyze content dispo if ($this->cd && ($this->parse_in != "Content-Disposition")) { # $cd = "blabla; filename=\"1231\""; $x = eregi("([a-z]*)[\r\n\t ;]*filename=[\"]?([-_=0-9A-Za-z/?.]*)[\"]?",$this->cd,$reg); if ($x) { $this->contentdispotype = $reg[1]; $this->contentdisponame = $reg[2]; # echo "dispo |". $this->contentdisponame ."
\n"; } $this->cd = ""; } if ($this->got_header && $short) { return; } // Subbody Handling # if (substr(trim($line),0,strlen($this->boundary)+2) == "--".$this->boundary) { if (trim($line) == "--".$this->boundary) { // content of a subbody starts $this->in_sub_body = true; $x = new mail_body(); $x->setPart($this->part.".". (1+count($this->bodies))); $x->setUrl($this->url); $x->parse_init(); $this->bodies[] = &$x; return; } if (trim($line) == "--".$this->boundary ."--") { $this->in_sub_body = false; } if ($this->in_sub_body) { $this->bodies[count($this->bodies)-1]->parse_line($line,$short); } else if ($this->got_header) { $this->body .= $line; # echo $this->got_header."-".$this->part ."|B| ". $line ."||
\n"; } } } /** * * @package BASE * @module mail */ class mail extends mail_body { /** * initialize mail */ function mail(&$user) { parent::mail_body(); $this->dbconn = $user->dbconn; $this->user = $user; $this->subject = ""; $this->resetTo(); $this->hdr = array(); $this->fd = false; $this->prio = 0; $this->date = ""; $this->from_adr = ""; $this->replyurl= "mail_new.php"; // Parser $this->parse_init(); } /** * splt name adress string */ function split_name_email($str) { $name = ""; $em = ""; $reg[1] = ""; $reg[2] = ""; $madr = "[a-zA-Z0-9/.-]*@[a-zA-Z0-9._-]*"; if (ereg("(.*)[ ]*<(". $madr .")>",$str,$reg)) { $name = trim($reg[1],"\" "); $em = $reg[2]; } else if (ereg("<(". $madr .")>",$str,$reg)) { $em = $reg[1]; $r = "<". AsEmail($reg[1],$reg[1]) .">"; } else if (ereg("(".$madr.")",$str,$reg)) { $em = $reg[1]; $r = AsEmail($str,$reg[1],$reg[1]); } else { $em = $str; } $name = trim($name,"\""); # echo "N:".$name ." E:".$em ." pre:".myentities($str) ."
"; return array($name,$em); } /** * format a from/to/cc for TUTOS */ function adr_format($str) { global $lang; $r = ""; $addlink = ""; list($name,$em) = mail::split_name_email($str); $name = decodeHeader($name); $pre = " WHERE "; $q = "SELECT * from ". $this->dbconn->prefix ."location "; $q .= " ". $pre . $this->dbconn->Like("email_1",$em); $pre = " or "; $q .= " ". $pre . $this->dbconn->Like("email_2",$em); check_dbacl( $q, $this->user->id); $res = $this->dbconn->Exec($q); if ( 0 != $res->numrows()) { $l = new location($this->dbconn); $l->read_result($res,0); $l->read_ref(); if ($name != "") { $name = $l->ref->getLink($name); } else { $name = $l->ref->getLink(); } } else { // show a link to allow adding the address to TUTOS $l = "address_new.php"; $fn = trim(substr($name,0,strpos($name," "))); $ln = trim(substr($name,strpos($name," "))); $l= addUrlParameter($l,"email_1=".UrlEncode($em),true); $l= addUrlParameter($l,"f_name=".UrlEncode($fn),true); $l= addUrlParameter($l,"l_name=".UrlEncode($ln),true); $addlink = " ". makelink($l,"[add]",$lang['AdrCreateInfo']); } $res->free(); $r .= " ". $em; $r = $name ." <". AsEmail($em,$em,$em) .">" . $addlink; return $r; } /** * initialize with an imap structure (using the compiled in imap/pop) */ function init_by_phpimap($mailbox,$msgno,$short) { $b1 = imap_fetchheader($mailbox->mbox,imap_msgno($mailbox->mbox,$msgno),FT_PEEK); $b2 = imap_body($mailbox->mbox,imap_msgno($mailbox->mbox,$msgno)); $this->init_by_text($b1."\n".$b2,$short); $this->replyurl= addUrlParameter($this->replyurl,"mno=".$msgno); if ($mailbox->addpath) { $this->replyurl= addUrlParameter($this->replyurl,"mpath=".Base64_Encode($mailbox->addpath)); } $this->replyurl= addUrlParameter($this->replyurl,"mid=".$mailbox->id); } /** * parse a mail from an eml file */ function init_by_text($str,$short) { $this->parse_init(); foreach (split("[\n]",$str) as $line) { # echo $this->got_header ."xx ". $line ."
\n"; $this->parse_line($line."\n",$short); } } /** * parse a mail from an eml file */ function init_by_file($filename,$short) { $this->parse_init(); $contenttype = ""; $fp = fopen($filename,"rb"); if (!$fp) { Fatal_Error("NIX"); } while (!feof($fp)) { $this->parse_line(fgets($fp,4096),$short); } fclose($fp); } /** * parse a mail from an tutos_document */ function init_by_file_obj(&$obj,$short) { $this->init_by_file($obj->base ."/". $obj->fileloc,$short); $this->replyurl= addUrlParameter($this->replyurl,"fid=".$obj->id); } /** * get the url where we can build a reply or forwward of this mail */ function getReplyUrl() { return $this->replyurl; } /** * long info (used in docmanagement) */ function info($ly,$mformat,$part) { global $lang; $r = ""; if ( ($mformat == "html") && ($part == 0)) { $r .= $ly->DataTableStart(); $r .= "\n"; $r .= " ". $lang['MailboxEmail'] ."\n"; $r .= "\n"; $r .= "\n"; $r .= " \n"; $url = $this->getReplyUrl(); $u= addUrlParameter($url,"reply=1"); $r .= "[". makelink($u,$lang['MailReply'],$lang['MailReplyI']) ."]"; $u= addUrlParameter($url,"reply=2"); $r .= " [". makelink($u,$lang['MailReplyAll'],$lang['MailReplyI']) ."]"; $u= addUrlParameter($url,"reply=3"); $r .= " [". makelink($u,$lang['MailForward'],$lang['MailForwardI']) ."]"; $r .= "\n"; $r .= "\n"; $r .= "\n"; $r .= $ly->showfield($lang['MailFrom']); $r .= $ly->showdata($this->adr_format($this->from_adr),3); $r .= "\n"; $r .= "\n"; $r .= $ly->showfield($lang['MailDate']); $r .= $ly->showdata($this->date,3); $r .= "\n"; $r .= "\n"; $r .= $ly->showfield($lang['MailTo']); $to = ""; $pre = ""; foreach ($this->to_adr as $t) { $to .= $pre. $this->adr_format($t); $pre = "
\n"; } $r .= $ly->showdata($to,3); $r .= "\n"; if (count($this->cc_adr)) { $r .= "\n"; $r .= $ly->showfield($lang['MailCc']); $to = ""; $pre = ""; foreach ($this->cc_adr as $t) { $to .= $pre . $this->adr_format($t); $pre = "
\n"; } $r .= $ly->showdata($to,3); $r .= "\n"; } $r .= "\n"; $r .= $ly->showfield($lang['MailSubject']); $r .= $ly->showdata( decodeHeader($this->subject),3); $r .= "\n"; } $r .= $this->show_html($ly,$mformat,$part); if ( ($mformat == "html") && ($part == 0)) { $r .= $ly->DataTableEnd(); } return $r; } /** * short info (used in docmanagement / and mailforwarding) */ function shortinfo($format = "html") { global $lang; $r = ""; if ($format == "plain") { if ($this->from_adr != "") { list($name,$em) = mail::split_name_email(decodeHeader($this->from_adr)); $r .= $lang['MailFrom'] .":\t". $name; if ($name) { $r .= " <". $em .">\n"; } else { $r .= $em ."\n"; } } else if (is_object($this->from)) { $r .= $lang['MailFrom'] .":\t". $this->from->getLink(); } $r .= $lang['MailDate'] .":\t". $this->date ."\n"; $r .= $lang['MailTo'].":\t" ; $to = ""; $pre = ""; foreach ($this->to_adr as $t) { list($name,$em) = mail::split_name_email(decodeHeader($t)); $to .= $pre. $name; if ($name) { $to .= " <". $em .">\n"; } else { $to .= $em ."\n"; } $pre = "\t"; } if ($to != "") $r .= $to; if (count($this->cc_adr)) { $r .= $lang['MailCc'] .":\t"; $to = ""; $pre = ""; foreach ($this->cc_adr as $t) { list($name,$em) = mail::split_name_email(decodeHeader($t)); $to .= $pre. $name; if ($name) { $to .= " <". $em .">\n"; } else { $to .= $em ."\n"; } $pre = "\t"; } if ($to != "") $r .= $to ."\n"; } $r .= $lang['MailSubject'] .":\t". decodeHeader($this->subject) ."\n"; } else { $r .= $lang['MailboxEmail'] ."\n"; if ($this->from_adr != "") { $r .= $lang['MailFrom'] .":\t". $this->adr_format($this->from_adr) ."\n"; } else if (is_object($this->from)) { $r .= $lang['MailFrom'] .":\t". $this->from->getLink() ."\n"; } $r .= $lang['MailTo'].":\t" ; $to = ""; $pre = ""; foreach ($this->to_adr as $t) { $to .= $pre. $this->adr_format($t) ."\n"; $pre = "\t"; } $r .= $to ."\n"; if (count($this->cc_adr)) { $r .= $lang['MailCc'] .":\t"; $to = ""; foreach ($this->cc_adr as $t) { $to .= $this->adr_format($t) ."\n"; } $r .= $to ."\n"; } $r .= $lang['MailSubject'] .":\t". decodeHeader($this->subject) ."\n"; } return $r; } /** * start of a html formatted mail * might be required by some outlook stuff */ function HtmlStart() { global $tutos,$lang; $msg = ""; $msg .= "\n"; $msg .= "\n"; $msg .= "\n"; $msg .= " \n"; $msg .= " \n"; $msg .= "\n"; $msg .= "\n"; $msg .= "
\n";
    return $msg;
  }
  /**
   *  end of a html formatted mail
   */
  function HtmlEnd() {
    return "
\n\n"; } /** * set the senders name * a reply to will also set to the same name (TUTOS can not be addressed directly) */ function setFrom(&$obj) { $this->from = &$obj; } function setFromTxt($from) { $this->from_adr = $from; } /** * reset the addresses where to send the mail */ function resetTo() { $this->sent = array(); $this->cc_adr = array(); $this->to_adr = array(); $this->cc = array(); $this->to = array(); $this->bcc_adr = array(); $this->bcc = array(); } /** * set the address where to send the mail * if obj is a team , than a mail will be send to every team member */ function addTo($obj) { if ( $obj == "" ) { return; } if ( ! is_Object($obj) ) { $x = split(",",$obj); foreach ($x as $y) { if (trim($y)) { $this->to_adr[] = trim($y); } } return; } if ( $obj->id < 1 ) { return; } $obj->fill_maillist($this->to); } /** * get the To List as a string * */ function getTo() { $to = ""; $pre = ""; foreach($this->to as $i => $obj) { if ( isset($this->sent[$obj->id]) && ($this->sent[$obj->id] == 1) ) { continue; } $t = $obj->default_email(); if ( $t == "" ) { continue; } if (isset($this->charset) ) { $x = "=?". $this->charset ."?B?" . base64_encode( $obj->getFullName() ) . "?="; } else { $x = $obj->getFullName(); } $to .= $pre ."\"". $x ."\" <". $t .">"; $pre = ","; $this->sent[$obj->id] = 1; } if ( count($this->to_adr) ) { foreach($this->to_adr as $i => $obj) { list($name,$em) = mail::split_name_email($obj); if (isset($this->charset) ) { $name = "=?". $this->charset ."?B?" . base64_encode( $name ) . "?="; } $to .= $name ." <". $em .">"; $pre = ","; } } return $to; } /** * get the To List as a string * */ function getToAscii() { $to = ""; $pre = ""; $x = array(); foreach($this->to as $i => $obj) { if ( isset($this->sent[$obj->id]) && ($this->sent[$obj->id] == 1) ) { continue; } if (!is_object($obj)){ continue; } $t = $obj->default_email(); if ( $t == "" ) { continue; } if ( isset($x[$t]) ) { continue; } $x[$t] = 1; $to .= $pre . $t ; $pre = ","; } if ( count($this->to_adr) ) { foreach($this->to_adr as $i => $t) { if ( isset($x[$t]) ) { continue; } $x[$t] = 1; $to .= $pre . $t ; $pre = ","; } } return $to; } /** * set the Cc * */ function addCc($obj) { if ( $obj == "" ) { return; } if ( ! is_Object($obj) ) { $x = split(",",$obj); foreach ($x as $y) { if (trim($y)) { $this->cc_adr[] = trim($y); } } return; } if ( $obj->id < 1 ) { return; } $obj->fill_maillist($this->cc); } /** * get the cc List as a string * */ function getCc() { $cc = ""; $pre = ""; if ( count($this->cc) ) { foreach($this->cc as $i => $obj) { if ( isset($this->sent[$obj->id]) && ($this->sent[$obj->id] == 1) ) { continue; } $t = $obj->default_email(); if ( $t == "" ) { continue; } if (isset($this->charset) ) { $x = "=?". $this->charset ."?B?" . base64_encode( $obj->getFullName() ) . "?="; } else { $x = $obj->getFullName(); } $cc .= $pre ."\"". $x ."\" <". $t .">"; $pre = ","; $this->sent[$obj->id] = 1; } } if ( count($this->cc_adr) ) { foreach($this->cc_adr as $i => $obj ) { list($name,$em) = mail::split_name_email($obj); if (isset($this->charset) ) { $name = "=?". $this->charset ."?B?" . base64_encode( $name ) . "?="; } $cc .= $name ." <". $em .">"; $pre = ","; } } return $cc; } /** * get the cc List as a string * */ function getCcAscii() { $cc = ""; $pre = ""; $x = array(); if ( count($this->cc) ) { foreach($this->cc as $i => $obj) { if ( isset($this->sent[$obj->id]) && ($this->sent[$obj->id] == 1) ) { continue; } if (!is_object($obj)){ continue; } $t = $obj->default_email(); if ( $t == "" ) { continue; } if ( isset($x[$t]) ) { continue; } $x[$t] = 1; $cc .= $pre . $t ; $pre = ","; } } if ( count($this->cc_adr) ) { foreach($this->cc_adr as $i => $t) { if ( isset($x[$t]) ) { continue; } $x[$t] = 1; $cc .= $pre . $t ; $pre = ","; } } return $cc; } /** * set the Bcc * */ function addBcc($obj) { if ( $obj == "" ) { return; } if ( ! is_Object($obj) ) { $this->bcc_adr[] = $obj; return; } if ( $obj->id < 1 ) { return; } $obj->fill_maillist($this->bcc); } /** * get the Bcc List as a string * */ function getBcc() { $bcc = ""; $pre = ""; if ( count($this->bcc) ) { foreach($this->bcc as $i => $obj) { if ( isset($this->sent[$obj->id]) && ($this->sent[$obj->id] == 1) ) { continue; } $t = $obj->default_email(); if ( $t == "" ) { continue; } if (isset($this->charset) ) { $x = "=?". $this->charset ."?B?" . base64_encode( $obj->getFullName() ) . "?="; } else { $x = $obj->getFullName(); } $bcc .= $pre ."\"". $x ."\" <". $t .">"; $pre = ","; $this->sent[$obj->id] = 1; } } if ( count($this->bcc_adr) ) { foreach($this->bcc_adr as $i => $obj ) { $bcc .= $pre ." <". $obj .">"; $pre = ","; } } return $bcc; } /** * get the Bcc List as a string * */ function getBccAscii() { $bcc = ""; $pre = ""; $x = array(); if ( count($this->bcc) ) { foreach($this->bcc as $i => $obj) { if ( isset($this->sent[$obj->id]) && ($this->sent[$obj->id] == 1) ) { continue; } if (!is_object($obj)){ continue; } $t = $obj->default_email(); if ( $t == "" ) { continue; } if ( isset($x[$t]) ) { continue; } $x[$t] = 1; $bcc .= $pre . $t ; $pre = ","; } } if ( count($this->bcc_adr) ) { foreach($this->bcc_adr as $i => $t) { if ( isset($x[$t]) ) { continue; } $x[$t] = 1; $bcc .= $pre . $t ; $pre = ","; } } return $bcc; } /** * add addional header lines * */ function addHeader($arg,$val) { $val = rtrim($val); $this->hdr[] = $arg .": ". $val; } /** * set the subject * */ function setSubject($s) { $this->subject = $s; } /** * get the subject * */ function getSubject() { return $this->subject; } /** * set the address where to send the mail * if obj is a team , than a mail will be send to every team member */ function resetBody() { $this->bodies = array(); } /** * open a channel to the mailer */ function open_channel(&$from,&$rcpt) { global $tutos; $msg = ""; if ( $tutos[mailmode] == 1 ) { $this->fd = popen($tutos[sendmail]." -t -i","w"); if ( $this->fd == false ) { $msg .= "could not connect to sendmail server
\n"; return $msg; } } else if ( ($tutos[mailmode] == 2) || ($tutos[mailmode] == 4) ) { $errno = 0; $errstr = ""; # POP before SMTP # using the same host as smtp (some code stolen from squirrelmail) if ( $tutos[popbeforesmtp] == 1 ) { $fd = fsockopen($tutos[smtphost],110, $errno, $errstr); if ( $fd == false ) { $msg .= "could not connect to pop server for popbeforesmtp
\n"; return $msg . $errno ." ". $errstr; } $tmp = fgets($fd, 1024); /* banner */ if (!eregi("^\+OK", $tmp, $regs)) { return $msg . $tmp; } fputs($fd, "USER ". $tutos[popbeforesmtp_user] . $this->eoln); $tmp = fgets($fd, 1024); if (!eregi("^\+OK", $tmp, $regs)) { return $msg . $tmp; } fputs($fd, 'PASS '. $tutos[popbeforesmtp_pass] . $this->eoln); $tmp = fgets($fd, 1024); if (!eregi("^\+OK", $tmp, $regs)) { return $msg . $tmp; } @fputs($fd, "QUIT".$this->eoln); /* log off */ fclose ($fd); } $this->fd = fsockopen($tutos[smtphost],25,$errno,$errstr); if ( $this->fd == false ) { $msg .= "could not connect to smtp server
\n"; return $msg . $errno ." ". $errstr; } $this->readsmtp($msg); // Read the Greetings if ($tutos[mailmode] == 4) { fputs($this->fd,"EHLO ". $_SERVER['SERVER_NAME'] . $this->eoln); //EHLO is correct if (!$this->readsmtp($msg)) return $msg; fputs($this->fd,"AUTH LOGIN" . $this->eoln); if (!$this->readsmtp($msg)) return $msg; fputs($this->fd,base64_encode($tutos[smtp_username]) . $this->eoln); if (!$this->readsmtp($msg)) return $msg; fputs($this->fd,base64_encode($tutos[smtp_password]) . $this->eoln); if (!$this->readsmtp($msg)) return $msg; } else { $this->writechannel("HELO ". $_SERVER['SERVER_NAME']); if (!$this->readsmtp($msg)) return $msg; } $this->writechannel("MAIL From: <". $from .">"); if (!$this->readsmtp($msg)) { return $msg; }; foreach($rcpt as $i => $obj ) { # Parse the name and/or email part list($name,$em) = mail::split_name_email($obj); $this->writechannel("RCPT To: <". $em .">"); $this->readsmtp($msg); } $this->writechannel("DATA"); if (!$this->readsmtp($msg)) { return $msg; }; # $this->readsmtp($msg); } else { $msg .= "Unknown Mailmode ". $tutos[mailmode] ." fix config.pinc
"; return $msg; } return $msg; } /** * close the channel to the mailer */ function close_channel() { global $tutos; $msg = ""; if ( $tutos[mailmode] == 1 ) { pclose($this->fd); } else if ( ($tutos[mailmode] == 2) || ($tutos[mailmode] == 4) ) { $this->writechannel($this->eoln."."); $this->readsmtp($msg); $this->writechannel("quit"); $this->readsmtp($msg); fclose ($this->fd); } $this->fd = false; return $msg; } /** * write to smtp channel */ function writechannel($str) { fputs($this->fd,$str.$this->eoln) || die ("Error writing to mail channel"); } /** * check for errors */ function readsmtp(&$msg) { global $tutos; if ( ($tutos[mailmode] != 2) && ($tutos[mailmode] != 4) ) { return true; } $line = fgets($this->fd,1024); if (empty($line)) { return true; } if ( ereg("^220",$line ) ) { return true; } if ( ereg("^221",$line ) ) { return true; } if ( ereg("^235",$line ) ) { // The OK response from AUTH LOGIN return true; } if ( ereg("^250",$line ) ) { return true; } if ( ereg("^354",$line ) ) { return true; } if ( ereg("^334",$line ) ) { // The response from AUTH LOGIN return true; } if ( ereg("^5",$line ) ) { $msg .= $line ."
\n"; return false; } $msg .= $line ."
\n"; return false; } /** * send this mail */ function send() { global $lang, $tutos; $msg = ""; if ( $this->from_adr != "" ) { $from = $this->from_adr; } else { $from = $this->from->default_email(); } if ( $from == "" ) { $msg .= sprintf($lang['Err0034'],$this->from->getLink()) ."
\n"; return $msg; } if ( (($tutos[mailmode] == 1) && !is_executable($tutos[sendmail])) || (($tutos[mailmode] == 2) && empty($tutos[smtphost])) || ($tutos[mailmode] == 0) || ($tutos[demo] == 1) ) { $msg .= sprintf($lang['Err0033'],$this->subject) ."
\n"; if ( isset($this->to) ) { foreach($this->to as $i => $obj) { $msg .= "to: ". $obj->getFullname() ."
\n"; } } if ( isset($this->to_adr) ) { foreach($this->to_adr as $i => $obj) { $msg .= "to: ". $obj ."
\n"; } } if ( isset($this->cc) ) { foreach($this->cc as $i => $obj) { $msg .= "cc: ". $obj->getFullname() ."
\n"; } } if ( isset($this->cc_adr) ) { foreach($this->cc_adr as $i => $obj) { $msg .= "cc: ". $obj ."
\n"; } } if ( isset($this->bcc) ) { foreach($this->bcc as $i => $obj) { $msg .= "bcc: ". $obj->getFullname() ."
\n"; } } if ( isset($this->bcc_adr) ) { foreach($this->bcc_adr as $i => $obj) { $msg .= "bcc: ". $obj ."
\n"; } } return $msg; } if ( count($this->to) + count($this->to_adr) == 0 ) { $msg .= $lang['Err0035'] ." (3)
\n"; return $msg; } if ( strlen($this->body) + count($this->bodies) == 0 ) { return "no text" . $msg; } # # Make a list of all recipents # $to = $this->getTo(); $rcpt = array(); foreach($this->to as $obj) { $t = $obj->default_email(); if ( $t == "" ) { continue; } $rcpt[] = $t; $msg .= sprintf($lang['MailSent'],myentities($this->subject),myentities($obj->getFullname())) ."
\n"; } if ( count($this->to_adr) ) { foreach($this->to_adr as $obj) { $rcpt[] = $obj; $msg .= sprintf($lang['MailSent'],myentities($this->subject),myentities($obj)) ."
\n"; } } # # CC # if ( count($this->cc) ) { foreach($this->cc as $obj) { if ( $this->sent[$obj->id] == 1 ) { continue; } $t = $obj->default_email(); if ( $t == "" ) { continue; } $rcpt[] = $t; $msg .= sprintf($lang['MailSentCc'],myentities($this->subject),myentities($obj->getFullname($t))) ."
\n"; } } if ( count($this->cc_adr) ) { foreach($this->cc_adr as $obj) { $rcpt[] = $obj; $msg .= sprintf($lang['MailSentCc'],myentities($this->subject),myentities($obj)) ."
\n"; } } if ( count($rcpt) == 0 ) { # No recipents $msg .= $lang['Err0035'] ." (2)
\n"; return $msg; } // get the cc addresses $cc = $this->getCc(); # # BCC # if ( count($this->bcc) ) { foreach($this->bcc as $obj) { if ( $this->sent[$obj->id] == 1 ) { continue; } $t = $obj->default_email(); if ( $t == "" ) { continue; } $rcpt[] = $t; $msg .= sprintf($lang['MailSentBcc'],myentities($this->subject),myentities($obj->getFullname($t))) ."
\n"; } } if ( count($this->bcc_adr) ) { foreach($this->bcc_adr as $obj) { $rcpt[] = $obj; $msg .= sprintf($lang['MailSentBcc'],myentities($this->subject),myentities($obj)) ."
\n"; } } if ( count($rcpt) == 0 ) { # No recipents $msg .= $lang['Err0035'] ." (1)
\n"; return $msg; } $omsg = $this->open_channel($from,$rcpt); if ($omsg != "") { return $msg . $omsg; } # die(myentities($to)); $x = "=?". $lang['content_encoding'] ."?B?" . base64_encode($this->from->getFullName()) . "?="; $this->writechannel("From: \"". $x ." (TUTOS)\" <". $from .">"); $this->writechannel("Reply-To: \"". $x ."\" <". $from .">"); $this->writechannel("Date: ". Date("r")); # encode subject line $subj = "=?". $this->charset ."?B?" . base64_encode( $this->subject ) . "?="; $this->writechannel("Subject: ". $subj); $this->writechannel("To: ". $to); if ( $cc != "" ) { $this->writechannel("Cc: ". $cc); } foreach ($this->hdr as $i) { $this->writechannel($i); } $this->writechannel("X-Mailer: TUTOS ". $tutos[version] ."/PHP " . phpversion() ." ". PHP_OS); # if (!$this->readsmtp($msg)) { # return $msg; # }; $this->output($this); $msg .= $this->close_channel(); return $msg; } } ?>