validator = new CValidator(); $this->validator->openEmailMessage($filename); $this->validator->parseEmail(); $this->validator->getAllNeccessaryEmails(); $this->validator->validateEmail(); // the result is in $this->validator->arrAccepted; } // }}} function processAccepted() { // {{{ echo "akceptovane mailinglisty: \n"; print_r($this->validator->arrAccepted); // $arrAccepted is a array of ids of accepted mailinglists for($i = 0; $i < Count($this->validator->arrAccepted); $i++) { // for each mailinglist we generate queue of recipients $queue_id = $this->processMessage($this->validator->arrAccepted[$i]); if ($queue_id) $this->generateRecipients($this->validator->arrAccepted[$i], $queue_id); $this->setStatistics($this->validator->arrAccepted[$i]); } return $i; // returns number of accepted files } // }}} function processMessage($list_id) { // {{{ $this->modifiedMessage = new CModifiedEmailMessage(); $this->modifyMessage($list_id); $message_queue_id = $this->insertMessageIntoQueue($list_id); global $dbh; $sql = "SELECT f_archive FROM mylist_lists WHERE id = $list_id"; $f_archive =& $dbh->getOne($sql); if ($f_archive) { $archive_id = $this->archiveMessage($list_id); if ($archive_id) { $this->setParentID($archive_id); $this->indexer = new CIndexer(); $this->indexer->subject = $this->modifiedMessage->subject; $this->indexer->header = $this->validator->emailMessage->structure->headers; $this->indexer->body = $this->emailMessage->plain_body; $this->indexer->attachements = ""; // text attachements to db, others to filesystem if ($this->messageHasAttachements()) $this->processAttachements($archive_id, $list_id); $this->indexer->indexMessage($archive_id); } } return $message_queue_id; } // }}} function modifyMessage($_list_id) { // {{{ global $dbh; global $MLIST_CRLF, $errors_to; $sql = "SELECT name, f_reply_to_mlist, f_prefix_subject, "; $sql .= "prefix, f_append_sig, signature "; $sql .= "FROM mylist_lists WHERE id = $_list_id"; $res =& $dbh->query($sql); if (PEAR::isError($res)) die($res->getMessage()); $res->fetchInto($row, DB_FETCHMODE_ASSOC); // original message is in $this->validator->emailMessage // modified message will be in $this->modifiedMessage // **************************************************** // ************* HEADERS MODIFICATIONS **************** //$_header = "From: ".$this->validator->emailMessage->structure->headers["from"].$MLIST_CRLF; $_header = "From: ".$this->validator->emailMessage->structure->headers["from"]."\n"; $_header .= "X-Mailinglist-From: ".$row["name"]."\n"; $_header .= "To: ".$row["name"]."\n"; $_header .= "Errors-To: $errors_to\n"; if (isset($this->validator->emailMessage->structure->headers["in-reply-to"])) //$_header .= "In-Reply-To: ".$this->validator->emailMessage->structure->headers["in-reply-to"].$MLIST_CRLF; $_header .= "In-Reply-To: ".$this->validator->emailMessage->structure->headers["in-reply-to"]."\n"; if (isset($this->validator->emailMessage->structure->headers["references"])) $_header .= "References: ".$this->validator->emailMessage->structure->headers["references"]."\n"; //$_header .= "References: ".$this->validator->emailMessage->structure->headers["references"].$MLIST_CRLF; if ($row["f_reply_to_mlist"]) $_header .= "Reply-To: ".$row["name"]; else $_header .= "Reply-To: ".$this->validator->emailMessage->structure->headers["from"]; // received headers if (is_array($this->validator->emailMessage->structure->headers["received"])) { Reset($this->validator->emailMessage->structure->headers["received"]); While(Current($this->validator->emailMessage->structure->headers["received"])) { //$_header .= $MLIST_CRLF."Received: ".Current($this->validator->emailMessage->structure->headers["received"]); $_header .= "\nReceived: ".Current($this->validator->emailMessage->structure->headers["received"]); Next($this->validator->emailMessage->structure->headers["received"]); } } else if (isset($this->validator->emailMessage->structure->headers["received"])) { //$_header .= $MLIST_CRLF."Received: ".$this->validator->emailMessage->structure->headers["received"]; $_header .= "\nReceived: ".$this->validator->emailMessage->structure->headers["received"]; } // ************* PREXIF SUBJECT *********************** $subject = $this->validator->emailMessage->structure->headers["subject"]; if ($row["f_prefix_subject"]) { if (!( ($pos=StrPos($subject,"[".$row["prefix"]."]")) || ($subject[0] == "[".$row["prefix"]."]") )) $this->modifiedMessage->subject = "[".$row["prefix"]."] ".$subject; else $this->modifiedMessage->subject = $subject; } else $this->modifiedMessage->subject = $subject; $_header .= "\nSubject: ".$this->modifiedMessage->subject; // **************************************************** // **************************************************** // ************** OTHERS *************** if (isset($this->validator->emailMessage->structure->headers["mime-version"])) // $_header .= $MLIST_CRLF."MIME-Version: ".$this->validator->emailMessage->structure->headers["mime-version"].$MLIST_CRLF; $_header .= "\nMIME-Version: ".$this->validator->emailMessage->structure->headers["mime-version"]; if (isset($this->validator->emailMessage->structure->headers["content-type"])) //$_header .= "Content-Type: ".$this->validator->emailMessage->structure->headers["content-type"].$MLIST_CRLF; $_header .= "\nContent-Type: ".$this->validator->emailMessage->structure->headers["content-type"]; $this->modifiedMessage->header = $_header; // ***************************************************** // **************************************************** // ************* BODY MODIFICATIONS ******************* if ($row["f_append_sig"]) { $signature = "\n\n_______________________________________________________________________________\n".$row["signature"]; if (! $this->messageHasAttachements()) { $this->modifiedMessage->body = $this->validator->emailMessage->body.$signature; $this->emailMessage->plain_body = $this->modifiedMessage->body; } else { // the message has attachements $plainbody = $this->getPlainBodyText(); $finalbody = $this->addSignature($signature,$plainbody); $this->modifiedMessage->body = $finalbody; $this->emailMessage->plain_body = $plainbody."\r\n".$signature; } } else // signature is not added { if (! $this->messageHasAttachements()) { // no attachements $this->modifiedMessage->body = $this->validator->emailMessage->body; $this->emailMessage->plain_body = $this->modifiedMessage->body; } else { // MIME message $this->modifiedMessage->body = $this->validator->emailMessage->all_body; $plainbody = $this->getPlainBodyText(); $this->emailMessage->plain_body = $plainbody; } } // **************************************************** // **************************************************** } // }}} function insertMessageIntoQueue($_list_id) { // {{{ global $dbh; $sql = "INSERT INTO mylist_queue_messages (message_header, message_body) VALUES "; $sql .= "('".AddSlashes($this->modifiedMessage->header)."', '".AddSlashes($this->modifiedMessage->body)."')"; $res =& $dbh->query($sql); if (PEAR::isError($res)) die($res->getMessage()); $sql ="SELECT id FROM mylist_queue_messages WHERE message_header LIKE '".AddSlashes($this->modifiedMessage->header)."' AND message_body LIKE '".AddSlashes($this->modifiedMessage->body)."' ORDER BY id DESC"; $res =& $dbh->query($sql); if (PEAR::isError($res)) die($res->getMessage()); $res->fetchInto($row); return $row["id"]; } // }}} function removeBrackets($messageID) { // {{{ if ( eregi("^<(.+)>$", $messageID, $textParts)) return $textParts[1]; } // }}} function generateRecipients($list_id, $queue_id) { // {{{ global $dbh; global $tb_users, $cl_users_id, $cl_users_email; $sql = "SELECT mylist_list_users.email as list_email, $tb_users.$cl_users_email as reg_email, "; $sql .= "mylist_lists.f_mail_back_to_sender "; $sql .= "FROM mylist_list_users, $tb_users, mylist_lists "; $sql .= "WHERE mylist_list_users.list_id = $list_id"; $sql .= " AND "; $sql .= "$tb_users.$cl_users_id = mylist_list_users.user_id "; $sql .= " AND "; $sql .= "mylist_lists.id = $list_id"; $res =& $dbh->query($sql); if (PEAR::isError($res)) die($res->getMessage()); while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) { if (!(!$row["f_mail_back_to_sender"] && ($this->validator->emailMessage->sender == ((StrLen($row["list_email"]) != 0) ? $row["list_email"] : $row["reg_email"]) ))) { $sql = "INSERT INTO mylist_queue "; $sql .= "(queue_message_id, recipient, dt_queued) "; $sql .= "VALUES ("; $sql .= $queue_id.", "; $sql .= "'".((StrLen($row["list_email"]) != 0)? $row["list_email"] : $row["reg_email"])."', "; $sql .= "'".Date("Y-m-d H:i:s")."')"; $res2 =& $dbh->query($sql); if (PEAR::isError($res2)) if (StrCmp("DB Error: already exists", $res2->getMessage()) != 0) die($res2->getMessage()); else echo "nepridavam - existuje list_id = $list_id, queue_id = $queue_id, email = ".((StrLen($row["list_email"]) != 0)? $row["list_email"] : $row["reg_email"])."\n"; else echo "pridavam list_id = $list_id, queue_id = $queue_id, email = ".((StrLen($row["list_email"]) != 0)? $row["list_email"] : $row["reg_email"])."\n"; } } } // }}} function archiveMessage($_list_id) { // {{{ // header, body, subject was alredy set in $this->modifyMessage(); $this->modifiedMessage->from = $this->validator->emailMessage->sender; $this->modifiedMessage->dt_header = Date("Y-m-d H:i:s", StrToTime($this->validator->emailMessage->structure->headers["date"])); $this->modifiedMessage->dt_received = Date("Y-m-d H:i:s"); $this->modifiedMessage->messageID = $this->validator->emailMessage->structure->headers["message-id"]; global $dbh; $sql = "INSERT INTO mylist_messages "; $sql .= "(list_id, messageid, `from`, dt_header, dt_received, "; $sql .= "header, subject, body) VALUES "; $sql .= "($_list_id, '".$this->modifiedMessage->messageID."', '".AddSlashes($this->modifiedMessage->from)."', '".$this->modifiedMessage->dt_header."', '".$this->modifiedMessage->dt_received."', '".AddSlashes($this->validator->emailMessage->header)."', '".AddSlashes($this->modifiedMessage->subject)."', '".AddSlashes($this->emailMessage->plain_body)."')"; $res =& $dbh->query($sql); if (PEAR::isError($res)) if (StrCmp("DB Error: already exists", $res->getMessage()) != 0) die($res->getMessage()); else return; $sql = "SELECT id FROM mylist_messages WHERE list_id = $_list_id AND messageid LIKE '".$this->modifiedMessage->messageID."'"; $res =& $dbh->query($sql); if (PEAR::isError($res)) die($res->getMessage()); $res->fetchInto($row); return $row["id"]; } // }}} function setParentID($id) { // {{{ global $dbh; $in_reply_to = $this->validator->emailMessage->structure->headers["in-reply-to"]; if (StrLen($in_reply_to) > 0) { $sql = "SELECT id FROM mylist_messages WHERE messageid LIKE '".AddSlashes($in_reply_to)."'"; $res =& $dbh->getOne($sql); if (PEAR::isError($res)) die($res->getMessage()); if ($res != "") { $sql = "UPDATE mylist_messages SET parent_id = '".AddSlashes($res)."' WHERE id = ".$id; $res =& $dbh->query($sql); if (PEAR::isError($res)) die($res->getMessage()); return; } } $references = Array(); $references = explode(" ", $this->validator->emailMessage->structure->headers["references"]); for($i=Count($references); $i > 0; $i--) { if (StrLen($references[$i-1]) > 0) { $sql = "SELECT id FROM mylist_messages WHERE messageid LIKE '".AddSlashes($references[$i-1])."'"; $res =& $dbh->getOne($sql); if (PEAR::isError($res)) die($res->getMessage()); if ($res != "") { $sql = "UPDATE mylist_messages SET parent_id = '".AddSlashes($res)."' WHERE id = ".$id; $res =& $dbh->query($sql); if (PEAR::isError($res)) die($res->getMessage()); return; } } } } // }}} function messageHasAttachements() { // {{{ if (Is_Array($this->validator->emailMessage->structure->parts)) return true; else return false; } // }}} function getPlainBodyText() { // {{{ foreach ($this->validator->emailMessage->structure->parts as $part) { if (isset($part->disposition)) { } else if (is_Array($part->parts)) { Reset($part->parts); While($field = Current($part->parts)) { if (($field->ctype_primary == "text") && ($field->ctype_secondary == "plain")) return $field->body; Next($part->parts); } } else if (($part->ctype_primary == "text") && ($part->ctype_secondary == "plain")) return $part->body; } } // }}} function addSignature($signature,$plainbody) { // {{{ $old_body = $this->validator->emailMessage->all_body; $first_sign = "content-type: text/plain"; if (($pos=StrPos(strtolower($old_body),$first_sign)) || StrToLower($old_body[0]) == $first_sign) { $body_less = SubStr($old_body,$pos); if (($pos2 = StrPos($body_less, $plainbody)) || $body_less[0] == $plain_body) { // teraz idem spravit vysledok $result = ""; $part1 = SubStr($old_body, 0 , $pos + $pos2 + StrLen($plainbody) ); $part2 = SubStr($old_body, $pos + $pos2 + StrLen($plainbody)); $result = $part1."\r\n".$signature."\r\n".$part2; return $result; } } // if something is wrong, return body without signature return $old_body; } // }}} function processAttachements($id,$list) { // {{{ global $dbh; $sql = "SELECT max_attachement_size FROM mylist_lists WHERE id = '$list'"; $row =& $dbh->getRow($sql); if (PEAR::isError($row)) die($row->getMessage()); $max_size = $row['max_attachement_size'] * 1024; foreach ($this->validator->emailMessage->structure->parts as $part) { if (isset($part->disposition) and ($part->disposition=='attachment') and ((StrLen($part->body) <= $max_size) || ($max_size == 0) )) { $filename = $part->d_parameters['filename']; if ($filename == "") $filename = "attachement"; $sql = "INSERT INTO mylist_message_atts "; $sql .= "(message_id, atts_headers, atts_body, path, filename) "; $sql .= "VALUES "; $sql .= "($id, '".$part->ctype_primary."/".$part->ctype_secondary."', "; if ($part->ctype_primary == "text") { $sql .= "'".AddSlashes($part->body)."', '', '$filename')"; $this->indexer->attachements .= $part->body."\n\n"; } else { $path = $this->copyToFilesystem($part->body); $sql .= "'', '$path', '$filename')"; } $res =& $dbh->query($sql); if (PEAR::isError($res)) die($res->getMessage()); } } } // }}} function copyToFilesystem($content) { // {{{ global $atts_dir_backend; Srand((double) MicroTime() * 1e6); $unique = Time(); $unique .= "_".Rand(0,GetRandMax()); while ( File_Exists($unique)) { $unique = Time(); $unique .= "_".Rand(0,GetRandMax()); } $fp = fopen($atts_dir_backend.$unique, 'w'); fwrite($fp, $content); fclose($fp); chmod($atts_dir_backend.$unique, 0644); return $unique; } // }}} function setStatistics($list_id) { global $dbh; $sql = "UPDATE mylist_list_stats SET times_used = times_used + 1, dt_last_used = '".Date("Y-m-d H:i:s")."' WHERE list_id = '$list_id'"; $res =& $dbh->query($sql); //if (PEAR::isError($res)) // die($res->getMessage()); // no need to die here } } // vim: fdm=marker fdl=0 fdc=3 ?>