| version 1.3, 2005/03/30 12:53:55 |
version 1.4, 2005/04/10 19:42:45 |
|
|
| require_once "validator.php"; |
require_once "validator.php"; |
| require_once "../../mylist.config.php"; |
require_once "../../mylist.config.php"; |
| require_once "../shared/emailMessage.php"; |
require_once "../shared/emailMessage.php"; |
| |
require_once "../../mylist_indexer.php"; |
| |
|
| // an object of CReceiver class processes an incomming message |
// an object of CReceiver class processes an incomming message |
| // it agregates CValidator class that returns IDs of mailinglist into which was the message sent (all conditions like senders allowed, max_message_size, etc are validated) |
// it agregates CValidator class that returns IDs of mailinglist into which was the message sent (all conditions like senders allowed, max_message_size, etc are validated) |
| Line 18 class CReceiver { |
|
| Line 18 class CReceiver { |
|
| // contains modified headers (prefix, signature, etc) |
// contains modified headers (prefix, signature, etc) |
| var $modifiedMessage; |
var $modifiedMessage; |
| |
|
| |
var $indexer; // indexes message |
| |
|
| // this function decides wheter an incomming email message will be accepted or not |
// this function decides wheter an incomming email message will be accepted or not |
| // all conditions (senders allowed, max_message_size) must be ok |
// all conditions (senders allowed, max_message_size) must be ok |
| Line 42 class CReceiver { |
|
| Line 42 class CReceiver { |
|
| for($i = 0; $i < Count($this->validator->arrAccepted); $i++) |
for($i = 0; $i < Count($this->validator->arrAccepted); $i++) |
| { // for each mailinglist we generate queue of recipients |
{ // for each mailinglist we generate queue of recipients |
| $queue_id = $this->processMessage($this->validator->arrAccepted[$i]); |
$queue_id = $this->processMessage($this->validator->arrAccepted[$i]); |
| $this->generateRecipients($this->validator->arrAccepted[$i], $queue_id); |
if ($queue_id) |
| |
$this->generateRecipients($this->validator->arrAccepted[$i], $queue_id); |
| } |
} |
| |
|
| } |
} |
| Line 55 class CReceiver { |
|
| Line 56 class CReceiver { |
|
| |
|
| global $dbh; |
global $dbh; |
| |
|
| |
|
| $sql = "SELECT f_archive FROM mylist_lists WHERE id = $list_id"; |
$sql = "SELECT f_archive FROM mylist_lists WHERE id = $list_id"; |
| |
|
| $f_archive =& $dbh->getOne($sql); |
$f_archive =& $dbh->getOne($sql); |
| |
|
| if ($f_archive) |
if ($f_archive) |
| { |
{ |
| $this->archiveMessage($list_id); |
$archive_id = $this->archiveMessage($list_id); |
| $this->indexMessage($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); |
| |
|
| |
$this->indexer->indexMessage($archive_id); |
| |
} |
| } |
} |
| |
|
| return $message_queue_id; |
return $message_queue_id; |
| } |
} |
| |
|
| Line 96 class CReceiver { |
|
| Line 109 class CReceiver { |
|
| $_header .= "X-Mailinglist-From: ".$row["name"]."\n"; |
$_header .= "X-Mailinglist-From: ".$row["name"]."\n"; |
| $_header .= "To: ".$row["name"]."\n"; |
$_header .= "To: ".$row["name"]."\n"; |
| $_header .= "Errors-To: $errors_to\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; |
| |
|
| |
if (isset($this->validator->emailMessage->structure->headers["references"])) |
| |
$_header .= "References: ".$this->validator->emailMessage->structure->headers["references"].$MLIST_CRLF; |
| |
|
| if ($row["f_reply_to_mlist"]) |
if ($row["f_reply_to_mlist"]) |
| $_header .= "Reply-To: ".$row["name"]; |
$_header .= "Reply-To: ".$row["name"]; |
| Line 123 class CReceiver { |
|
| Line 141 class CReceiver { |
|
| |
|
| // ************* PREXIF SUBJECT *********************** |
// ************* PREXIF SUBJECT *********************** |
| |
|
| |
$subject = $this->validator->emailMessage->structure->headers["subject"]; |
| |
|
| if ($row["f_prefix_subject"]) |
if ($row["f_prefix_subject"]) |
| { |
{ |
| $this->modifiedMessage->subject = "[".$row["prefix"]."] ".$this->validator->emailMessage->structure->headers["subject"]; |
if (!( ($pos=StrPos($subject,"[".$row["prefix"]."]")) || ($subject[0] == "[".$row["prefix"]."]") )) |
| |
$this->modifiedMessage->subject = "[".$row["prefix"]."] ".$subject; |
| } |
} |
| else |
else |
| $this->modifiedMessage->subject = $this->validator->emailMessage->structure->headers["subject"]; |
$this->modifiedMessage->subject = $subject; |
| |
|
| |
|
| $_header .= $MLIST_CRLF."Subject: ".$this->modifiedMessage->subject; |
$_header .= $MLIST_CRLF."Subject: ".$this->modifiedMessage->subject; |
| |
|
| |
|
| $this->modifiedMessage->header = $_header; |
|
| |
|
| // **************************************************** |
// **************************************************** |
| // **************************************************** |
// **************************************************** |
| |
|
| |
|
| |
// ************** OTHERS *************** |
| |
|
| |
if (isset($this->validator->emailMessage->structure->headers["mime-version"])) |
| |
$_header .= "MIME-Version: ".$this->validator->emailMessage->structure->headers["mime-version"].$MLIST_CRLF; |
| |
|
| |
if (isset($this->validator->emailMessage->structure->headers["content-type"])) |
| |
$_header .= "Content-Type: ".$this->validator->emailMessage->structure->headers["content-type"].$MLIST_CRLF; |
| |
|
| |
$this->modifiedMessage->header = $_header; |
| |
|
| |
// ***************************************************** |
| |
|
| |
|
| |
|
| |
|
| |
|
| // **************************************************** |
// **************************************************** |
| // ************* BODY MODIFICATIONS ******************* |
// ************* BODY MODIFICATIONS ******************* |
| |
|
| |
|
| if ($row["f_append_sig"]) |
if ($row["f_append_sig"]) |
| { |
{ |
| $this->modifiedMessage->body = $this->validator->emailMessage->body."\n_______________________________________________________________________________\n".$row["signature"]; |
if (! $this->messageHasAttachements()) |
| |
{ |
| |
$this->modifiedMessage->body = $this->validator->emailMessage->body."\n_______________________________________________________________________________\n".$row["signature"]; |
| |
|
| |
$this->emailMessage->plain_body = $this->modifiedMessage->body; |
| |
} |
| |
else |
| |
{ |
| |
// the message has attachements |
| |
$plainbody = $this->getPlainBodyText(); |
| |
$finalbody = $this->addSignature($row["signature"],$plainbody); |
| |
$this->modifiedMessage->body = $finalbody; |
| |
$this->emailMessage->plain_body = $plainbody."\r\n".$row["signature"]; |
| |
|
| |
} |
| } |
} |
| else |
else |
| |
{ |
| $this->modifiedMessage->body = $this->validator->emailMessage->body; |
$this->modifiedMessage->body = $this->validator->emailMessage->body; |
| |
$this->emailMessage->plain_body = $this->modifiedMessage->body; |
| |
} |
| |
|
| // **************************************************** |
// **************************************************** |
| // **************************************************** |
// **************************************************** |
| } |
} |
| Line 159 class CReceiver { |
|
| Line 212 class CReceiver { |
|
| function insertMessageIntoQueue($_list_id) |
function insertMessageIntoQueue($_list_id) |
| { |
{ |
| global $dbh; |
global $dbh; |
| |
|
| |
|
| $sql = "INSERT INTO mylist_queue_messages (message_header, message_body) VALUES "; |
$sql = "INSERT INTO mylist_queue_messages (message_header, message_body) VALUES "; |
| $sql .= "('".AddSlashes($this->modifiedMessage->header)."', '".AddSlashes($this->modifiedMessage->body)."')"; |
$sql .= "('".AddSlashes($this->modifiedMessage->header)."', '".AddSlashes($this->modifiedMessage->body)."')"; |
| |
|
| $res =& $dbh->query($sql); |
$res =& $dbh->query($sql); |
| |
|
| if (PEAR::isError($res)) |
if (PEAR::isError($res)) |
| die($res->getMessage()); |
die($res->getMessage()); |
| |
|
| Line 176 class CReceiver { |
|
| Line 226 class CReceiver { |
|
| if (PEAR::isError($res)) |
if (PEAR::isError($res)) |
| die($res->getMessage()); |
die($res->getMessage()); |
| |
|
| $res->fetchInto($row, DB_FETCHMODE_ASSOC); |
$res->fetchInto($row); |
| return $row["id"]; |
return $row["id"]; |
| } |
} |
| |
|
| Line 239 class CReceiver { |
|
| Line 289 class CReceiver { |
|
| { |
{ |
| // header, body, subject was alredy set in $this->modifyMessage(); |
// header, body, subject was alredy set in $this->modifyMessage(); |
| $this->modifiedMessage->from = $this->validator->emailMessage->sender; |
$this->modifiedMessage->from = $this->validator->emailMessage->sender; |
| // $this->modifiedMessage->dt_header = $this->validator->emailMessage->structure->headers["date"]; |
$this->modifiedMessage->dt_header = Date("Y-m-d H:i:s", StrToTime($this->validator->emailMessage->structure->headers["date"])); |
| $this->modifiedMessage->dt_received = NULL; |
$this->modifiedMessage->dt_received = Date("Y-m-d H:i:s"); |
| $this->modifiedMessage->messageID = $this->validator->emailMessage->structure->headers["message-id"]; |
$this->modifiedMessage->messageID = $this->validator->emailMessage->structure->headers["message-id"]; |
| // print_r($this->modifiedMessage); |
|
| // print_r($this->validator->emailMessage); |
|
| |
|
| global $dbh; |
global $dbh; |
| |
|
| $sql = "INSERT INTO mylist_messages "; |
$sql = "INSERT INTO mylist_messages "; |
| $sql .= "(list_id, messageid, dt_header, dt_received, "; |
$sql .= "(list_id, messageid, `from`, dt_header, dt_received, "; |
| $sql .= "header, subject, body) VALUES "; |
$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->modifiedMessage->header)."', '".AddSlashes($this->modifiedMessage->subject)."', '".AddSlashes($this->modifiedMessage->body)."')"; |
$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)."')"; |
| $sql .= "($_list_id, '".$this->modifiedMessage->messageID."', '".$this->modifiedMessage->dt_header."', '".$this->modifiedMessage->dt_received."', '".AddSlashes($this->modifiedMessage->header)."', '".AddSlashes($this->modifiedMessage->subject)."', '".AddSlashes($this->modifiedMessage->body)."')"; |
|
| |
|
| |
|
| $res =& $dbh->query($sql); |
$res =& $dbh->query($sql); |
| if (PEAR::isError($res)) |
if (PEAR::isError($res)) |
| if (StrCmp("DB Error: already exists", $res->getMessage()) != 0) |
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()); |
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 indexMessage($_list_id) |
} |
| |
|
| |
|
| |
function addSignature($signature,$plainbody) |
| |
{ |
| |
$old_body = $this->validator->emailMessage->body; |
| |
$first_sign = "Content-Type: text/plain"; |
| |
|
| |
if (($pos=StrPos($old_body,$first_sign)) || $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; |
| |
|
| |
|
| |
} |
| |
|
| } |
} |
| |
|
| |
} |
| |
|
| |
|
| |
function processAttachements($id) |
| |
{ |
| |
|
| |
global $dbh; |
| |
|
| |
foreach ($this->validator->emailMessage->structure->parts as $part) |
| |
{ |
| |
|
| |
if (isset($part->disposition) and ($part->disposition=='attachment')) |
| |
{ |
| |
$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); |
| |
|
| |
return $unique; |
| |
} |
| |
|
| function moveFile($accepted) |
function moveFile($accepted) |
| { |
{ |
| global $dir_accepted, $dir_rejected; |
global $dir_accepted, $dir_rejected; |