function fix_this_comment($r, $num, $from, $messageid) { global $db; global $alloc_from_addresses2; if ($r["commentEmailUIDORIG"] != $num) { unset($projectID); if ($r["commentMaster"] == "task" && $r["commentMasterID"]) { $q = prepare("select projectID from task where taskID = %d", $r["commentMasterID"]); $db->query($q); $task_row = $db->row(); $projectID = $task_row["projectID"]; } // Try figure out and populate the commentCreatedUser/commentCreatedUserClientContactID fields list($from_address, $from_name) = parse_email_address($from); $person = new person(); $personID = $person->find_by_email($from_address); $personID or $personID = $person->find_by_name($from_name); $sql = array(); $sql[] = prepare("commentEmailUID = '%s'", trim($num)); if ($personID) { $sql[] = prepare("commentCreatedUser = %d", $personID); $sql[] = "commentCreatedUserClientContactID = NULL"; } else { $sql[] = "commentCreatedUser = NULL"; $cc = new clientContact(); $clientContactID = $cc->find_by_email($from_address, $projectID); $clientContactID or $clientContactID = $cc->find_by_name($from_name, $projectID); $clientContactID and $sql[] = prepare("commentCreatedUserClientContactID = %d", $clientContactID); } $sql[] = prepare("commentCreatedUserText = '%s'", trim($from)); $sql[] = prepare("commentEmailMessageID = '%s'", trim($messageid)); if (!in_array($from_address, $alloc_from_addresses2)) { // don't update items that are from alloc $q = prepare("UPDATE comment SET " . implode(",", $sql) . " WHERE commentID = %d", $r["commentID"]); $db->query($q); printorlog("FIXED: " . $q . " (old uid: " . $r["commentEmailUIDORIG"] . ")", "blue"); } } else { // Try figure out and populate the commentCreatedUser/commentCreatedUserClientContactID fields list($from_address, $from_name) = parse_email_address($from); if (!in_array($from_address, $alloc_from_addresses2)) { // don't update items that are from alloc $sql = array(); $sql[] = prepare("commentEmailUID = '%s'", trim($num)); $sql[] = prepare("commentEmailMessageID = '%s'", trim($messageid)); $q = prepare("UPDATE comment SET " . implode(",", $sql) . " WHERE commentID = %d", $r["commentID"]); $db->query($q); printorlog("GOOD: " . $q, "green"); } } }
function find_email($debug = false, $get_blobs = false, $ignore_date = false) { $info = inbox::get_mail_info(); $mailbox = $this->get_value("commentMaster") . $this->get_value("commentMasterID"); $mail = new email_receive($info); $mail->open_mailbox(config::get_config_item("allocEmailFolder") . "/" . $mailbox, OP_HALFOPEN + OP_READONLY); $mail->check_mail(); $msg_nums = $mail->get_all_email_msg_uids(); $debug and print "<hr><br><b>find_email(): " . date("Y-m-d H:i:s") . " found " . count($msg_nums) . " emails for mailbox: " . $mailbox . "</b>"; // fetch and parse email foreach ((array) $msg_nums as $num) { $debug and print "<hr><br>Examining message number: " . $num; unset($mimebits); // this will stream output $mail->set_msg($num); $mail->get_msg_header(); $text = $mail->fetch_mail_text(); list($from1, $e1n) = parse_email_address($mail->mail_headers["from"]); list($from2, $e2n) = parse_email_address($this->get_value("commentCreatedUserText")); if (!$from2 && $this->get_value("commentCreatedUser")) { $p = new person(); $p->set_id($this->get_value("commentCreatedUser")); $p->select(); $from2 = $p->get_value("emailAddress"); } if (!$from2 && $this->get_value("commentCreatedUserClientContactID")) { $p = new clientContact(); $p->set_id($this->get_value("commentCreatedUserClientContactID")); $p->select(); $from2 = $p->get_value("clientContactEmail"); } $text1 = str_replace(array("\\s", "\n", "\r"), "", trim($text)); $text2 = str_replace(array("\\s", "\n", "\r"), "", trim($this->get_value("comment"))); $date = format_date("U", $this->get_value("commentCreatedTime")); $date1 = strtotime($mail->mail_headers["date"]) - 300; $date3 = strtotime($mail->mail_headers["date"]) + 300; similar_text($text1, $text2, $percent); if ($percent >= 99 && ($from1 == $from2 || !$from2 || same_email_address($from1, config::get_config_item("AllocFromEmailAddress"))) && ($date > $date1 && $date < $date3 || $ignore_date)) { $debug and print "<br><b style='color:green'>Found you! Msg no: " . $num . " in mailbox: " . $mailbox . " for commentID: " . $this->get_id() . "</b>"; foreach ((array) $mail->mail_parts as $v) { $s = $v["part_object"]; // structure $raw_data = imap_fetchbody($mail->connection, $mail->msg_uid, $v["part_number"], FT_UID | FT_PEEK); $thing = $mail->decode_part($s->encoding, $raw_data); $filename = $mail->get_parameter_attribute_value($s->parameters, "name"); $filename or $filename = $mail->get_parameter_attribute_value($s->parameters, "filename"); $filename or $filename = $mail->get_parameter_attribute_value($s->dparameters, "name"); $filename or $filename = $mail->get_parameter_attribute_value($s->dparameters, "filename"); $bits = array(); $bits["part"] = $v["part_number"]; $bits["name"] = $filename; $bits["size"] = strlen($thing); $get_blobs and $bits["blob"] = $thing; $filename and $mimebits[] = $bits; } $mail->close(); return array($mail, $text, $mimebits); } else { similar_text($text1, $text2, $percent); $debug and print "<br>TEXT: " . sprintf("%d", $text1 == $text2) . " (" . sprintf("%d", $percent) . "%)"; #$debug and print "<br>Text1:<br>".$text1."<br>* * *<br>"; #$debug and print "Text2:<br>".$text2."<br>+ + +</br>"; $debug and print "<br>FROM: " . sprintf("%d", $from1 == $from2 || !$from2 || same_email_address($from1, config::get_config_item("AllocFromEmailAddress"))); $debug and print " From1: " . page::htmlentities($from1); $debug and print " From2: " . page::htmlentities($from2); $debug and print "<br>DATE: " . sprintf("%d", $date > $date1 && $date < $date3) . " (" . date("Y-m-d H:i:s", $date) . " | " . date("Y-m-d H:i:s", $date1) . " | " . date("Y-m-d H:i:s", $date3) . ")"; $debug and print "<br>"; } } $mail->close(); return array(false, false, false); }
function expand_ip($ip, $projectID = null) { // jon alloc username // jon@jon.com alloc username or client or stranger // Jon <*****@*****.**> alloc username or client or stranger // Jon Smith alloc fullname or client fullname // username $people or $people = person::get_people_by_username(); if (preg_match("/^\\w+\$/i", $ip)) { return array($people[$ip]["personID"], $people[$ip]["name"], $people[$ip]["emailAddress"]); } // email address $people = person::get_people_by_username("emailAddress"); list($email, $name) = parse_email_address($ip); if ($people[$email]) { return array($people[$email]["personID"], $people[$email]["name"], $people[$email]["emailAddress"]); } // Jon smith if (preg_match("/^[\\w\\s]+\$/i", $ip)) { $personID = person::find_by_name($ip, 100); if ($personID) { $people = person::get_people_by_username("personID"); return array($personID, $people[$personID]["name"], $people[$personID]["emailAddress"]); } $ccid = clientContact::find_by_name($ip, $projectID, 100); if ($ccid) { $cc = new clientContact(); $cc->set_id($ccid); $cc->select(); $name = $cc->get_value("clientContactName"); $email = $cc->get_value("clientContactEmail"); } } return array(null, $name, $email); }
function same_email_address($addy1, $addy2) { list($from_address1, $from_name1) = parse_email_address($addy1); list($from_address2, $from_name2) = parse_email_address($addy2); if ($from_address1 == $from_address2) { return true; } }
function get_printable_from_address() { list($from_address, $from_name) = parse_email_address($this->mail_headers["from"]); if ($from_address && $from_name) { $f = $from_name . " <" . $from_address . ">"; } else { if ($from_name) { $f = $from_name; } else { if ($from_address) { $f = $from_address; } } } return $f; }
/** * Convert a comma separated string of names, into an array with email addresses * @param string $people * @param string $entity the related entity that can assist in the look up * @param integer $entityID the id of the related entity * @return array an array of people, indexed by their email address */ public function get_people($options = array(), $entity = "", $entityID = "") { $person_table =& get_cached_table("person"); $people = $options; if ($entity && $entityID) { $e = new $entity(); $e->set_id($entityID); $e->select(); in_array("default", $people) and $default_recipients = $e->get_all_parties(); in_array("internal", $people) and $internal_recipients = $e->get_all_parties(); } // remove default and internal from the array $clean_people = array_diff($people, array("default", "internal")); if (is_object($e)) { $projectID = $e->get_project_id(); $p = new project(); $p->set_id($projectID); $p->select(); $client = $p->get_foreign_object("client"); $clientID = $client->get_id(); } foreach ((array) $default_recipients as $email => $info) { if ($info["selected"]) { $rtn[$email] = $this->reduce_person_info($info); } } foreach ((array) $internal_recipients as $email => $info) { if ($info["selected"] && !$info["external"]) { $rtn[$email] = $this->reduce_person_info($info); } } foreach ((array) $clean_people as $person) { $bad_person = true; $person = trim($person); // personID if (is_numeric($person)) { if ($person_table[$person]["personActive"]) { $rtn[$person_table[$person]["emailAddress"]] = $person_table[$person]; $bad_person = false; continue; } // email addresses } else { if (in_str("@", $person)) { foreach ($person_table as $pid => $data) { if (same_email_address($person, $data["emailAddress"]) && $data["personActive"]) { $rtn[$data["emailAddress"]] = $data; $bad_person = false; continue 2; } } if ($ccID = clientContact::find_by_email($person)) { $cc = new clientContact(); $cc->set_id($ccID); $cc->select(); $rtn[$cc->get_value("clientContactEmail")] = $cc->row(); $bad_person = false; continue; } // If we get here, then return the email address entered list($e, $n) = parse_email_address($person); $rtn[$e] = array("emailAddress" => $e, "name" => $n); $bad_person = false; continue; // usernames, partial and full names } else { foreach ($person_table as $pid => $data) { // If matches username if (strtolower($person) == strtolower($data["username"]) && $data["personActive"]) { $rtn[$data["emailAddress"]] = $data; $bad_person = false; continue 2; } } foreach ($person_table as $pid => $data) { // If matches name if (strtolower($person) == strtolower($data["firstName"] . " " . $data["surname"]) && $data["personActive"]) { $rtn[$data["emailAddress"]] = $data; $bad_person = false; continue 2; } } foreach ($person_table as $pid => $data) { // If matches a section of name, eg: a search for "Ale" will match the full name "Alex Lance" if (strtolower($person) == strtolower(substr(strtolower($data["firstName"] . " " . $data["surname"]), 0, strlen($person))) && $data["personActive"]) { $rtn[$data["emailAddress"]] = $data; $bad_person = false; continue 2; } } if ($ccID = clientContact::find_by_nick($person, $clientID)) { $cc = new clientContact(); $cc->set_id($ccID); $cc->select(); $rtn[$cc->get_value("clientContactEmail")] = $cc->row(); $bad_person = false; continue; } if ($ccID = clientContact::find_by_name($person, $projectID)) { $cc = new clientContact(); $cc->set_id($ccID); $cc->select(); $rtn[$cc->get_value("clientContactEmail")] = $cc->row(); $bad_person = false; continue; } if ($ccID = clientContact::find_by_partial_name($person, $projectID)) { $cc = new clientContact(); $cc->set_id($ccID); $cc->select(); $rtn[$cc->get_value("clientContactEmail")] = $cc->row(); $bad_person = false; continue; } } } if ($bad_person) { die("Unable to find person: " . $person); } } foreach ((array) $rtn as $id => $p) { $rtn[$id] = $this->reduce_person_info($p); } return (array) $rtn; }
function add_comment($commands) { $commentID = comment::add_comment($commands["entity"], $commands["entityID"], $commands["comment_text"]); // add interested parties foreach ((array) $commands["ip"] as $k => $info) { $info["entity"] = "comment"; $info["entityID"] = $commentID; interestedParty::add_interested_party($info); } $emailRecipients = array(); $emailRecipients[] = "interested"; if (defined("ALLOC_DEFAULT_FROM_ADDRESS") && ALLOC_DEFAULT_FROM_ADDRESS) { list($from_address, $from_name) = parse_email_address(ALLOC_DEFAULT_FROM_ADDRESS); $emailRecipients[] = $from_address; } // Re-email the comment out comment::send_comment($commentID, $emailRecipients); return array($status, $message); }
function attach_email_to_existing_task($req = array()) { global $TPL; $info = inbox::get_mail_info(); $current_user =& singleton("current_user"); $orig_current_user =& $current_user; $req["taskID"] = sprintf("%d", $req["taskID"]); $task = new task(); $task->set_id($req["taskID"]); if ($task->select()) { $email_receive = new email_receive($info); $email_receive->open_mailbox($info["folder"]); $email_receive->set_msg($req["id"]); $email_receive->get_msg_header(); $email_receive->save_email(); $c = comment::add_comment_from_email($email_receive, $task); $commentID = $c->get_id(); $commentID and $TPL["message_good_no_esc"][] = "Created comment " . $commentID . " on task " . $task->get_task_link(array("prefixTaskID" => true)); // Possibly change the identity of current_user list($from_address, $from_name) = parse_email_address($email_receive->mail_headers["from"]); $person = new person(); $personID = $person->find_by_email($from_address); $personID or $personID = $person->find_by_name($from_name); if ($personID) { $current_user = new person(); $current_user->load_current_user($personID); singleton("current_user", $current_user); } // swap back to normal user $current_user =& $orig_current_user; singleton("current_user", $current_user); // manually add task manager and assignee to ip list $extraips = array(); if ($task->get_value("personID")) { $p = new person($task->get_value("personID")); if ($p->get_value("emailAddress")) { $extraips[$p->get_value("emailAddress")]["name"] = $p->get_name(); $extraips[$p->get_value("emailAddress")]["role"] = "assignee"; $extraips[$p->get_value("emailAddress")]["personID"] = $task->get_value("personID"); $extraips[$p->get_value("emailAddress")]["selected"] = 1; } } if ($task->get_value("managerID")) { $p = new person($task->get_value("managerID")); if ($p->get_value("emailAddress")) { $extraips[$p->get_value("emailAddress")]["name"] = $p->get_name(); $extraips[$p->get_value("emailAddress")]["role"] = "manager"; $extraips[$p->get_value("emailAddress")]["personID"] = $task->get_value("managerID"); $extraips[$p->get_value("emailAddress")]["selected"] = 1; } } // add all the other interested parties $ips = interestedParty::get_interested_parties("task", $req["taskID"], $extraips); foreach ((array) $ips as $k => $inf) { $inf["entity"] = "comment"; $inf["entityID"] = $commentID; $inf["email"] and $inf["emailAddress"] = $inf["email"]; if ($req["emailto"] == "internal" && !$inf["external"] && !$inf["clientContactID"]) { $id = interestedParty::add_interested_party($inf); $recipients[] = $inf["name"] . " " . add_brackets($k); } else { if ($req["emailto"] == "default") { $id = interestedParty::add_interested_party($inf); $recipients[] = $inf["name"] . " " . add_brackets($k); } } } $recipients and $recipients = implode(", ", (array) $recipients); $recipients and $TPL["message_good"][] = "Sent email to " . $recipients; // Re-email the comment out comment::send_comment($commentID, array("interested"), $email_receive); // File email away in the task's mail folder $mailbox = "INBOX/task" . $task->get_id(); $email_receive->create_mailbox($mailbox) and $TPL["message_good"][] = "Created mailbox: " . $mailbox; $email_receive->move_mail($req["id"], $mailbox) and $TPL["message_good"][] = "Moved email " . $req["id"] . " to " . $mailbox; $email_receive->close(); } }