function process_inbound_mail($forumId, $suppressErrors = false) { // require_once ("lib/webmail/pop3.php"); require_once "lib/webmail/net_pop3.php"; require_once "lib/mail/mimelib.php"; //require_once ("lib/webmail/mimeDecode.php"); include_once "lib/webmail/htmlMimeMail.php"; $info = $this->get_forum($forumId); // for any reason my sybase test machine adds a space to // the inbound_pop_server field in the table. $info["inbound_pop_server"] = trim($info["inbound_pop_server"]); if (!$info["inbound_pop_server"] || empty($info["inbound_pop_server"])) { return; } $pop3 = new Net_POP3(); $pop3->connect($info["inbound_pop_server"]); $pop3->login($info["inbound_pop_user"], $info["inbound_pop_password"]); if (!$pop3) { return; } $mailSum = $pop3->numMsg(); //we don't want the operation to time out... this would result in the same messages being imported over and over... //(messages are only removed from the pop server on a gracefull connection termination... ie .not php or webserver a timeout) //$maximport should be in a admin config screen, but I don't know how to do that yet. $maxImport = 10; if ($mailSum > $maxImport) { $mailSum = $maxImport; } for ($i = 1; $i <= $mailSum; $i++) { //echo 'loop ' . $i; $aux = $pop3->getParsedHeaders($i); // If the connection is done, or the mail has an error, or whatever, // we try to delete the current mail (because something is wrong with it) // and continue on. --rlpowell if ($aux == FALSE) { $pop3->deleteMsg($i); continue; } //echo '<pre>'; //print_r ($aux); //echo '</pre>'; if (!isset($aux['From'])) { if (isset($aux['Return-path'])) { $aux['From'] = $aux['Return-path']; } else { $aux['From'] = ""; $aux['Return-path'] = ""; } } //try to get the date from the email: $postDate = strtotime($aux['Date']); if ($postDate == false) { $postDate = $this->now; } //save the original email address, if we don't get a user match, then we //can at least give some info about the poster. $original_email = $aux["From"]; //fix mailman addresses, or there is no chance to get a match $aux["From"] = str_replace(' at ', '@', $original_email); preg_match('/<?([-!#$%&\'*+\\.\\/0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\\.[-!#$%&\'*+\\.\\/0-9=?A-Z^_`a-z{|}~]+)>?/', $aux["From"], $mail); // should we throw out emails w/ invalid (possibly obfusicated) email addressses? //this should be an admin option, but I don't know how to put it there yet. $throwOutInvalidEmails = false; if (!array_key_exists(1, $mail)) { if ($throwOutInvalidEmails) { continue; } } $email = $mail[1]; $full = $pop3->getMsg($i); $message = $pop3->getBody($i); $output = mime::decode($full); //unset ($parts); //$this->parse_output($output, $parts, 0); if (isset($output["text"][0])) { $body = $output["text"][0]; } elseif (isset($output['parts'][0]["text"][0])) { $body = $output['parts'][0]["text"][0]; } elseif (isset($output['body'])) { $body = $output['body']; } elseif (isset($output['parts'][0]['html'][0])) { // some html message does not have a text part $body = $this->htmldecode(strip_tags(preg_replace('/\\n\\r/', '', $output['parts'][0]['html'][0]))); } elseif (isset($output['parts'][0]['parts'][0]['text'][0])) { $body = $output['parts'][0]['parts'][0]['text'][0]; } else { $body = ""; } // Remove 're:' and [forum]. -rlpowell $title = trim(preg_replace("/[rR][eE]:/", "", preg_replace("/\\[[-A-Za-z _:]*\\]/", "", $output['header']['subject']))); //Todo: check permissions $message_id = substr($output['header']["message-id"], 1, strlen($output['header']["message-id"]) - 2); if (isset($output['header']["in-reply-to"])) { $in_reply_to = substr($output['header']["in-reply-to"], 1, strlen($output['header']["in-reply-to"]) - 2); } else { $in_reply_to = ''; } // Determine user from email $userName = $this->table('users_users')->fetchOne('login', array('email' => $email)); //use anonomus name feature if we don't have a real name if (!$userName) { $anonName = $original_email; } // Determine if the thread already exists. $parentId = $this->table('tiki_comments')->fetchOne('threadId', array('object' => $forumId, 'objectType' => 'forum', 'parentId' => 0, 'title' => $title)); if (!$parentId) { /* This doesn't make any sense to me... why would we say an inbound email is a'thread to discuss a page'? I've updated this to just make a new thread w/ the original email info by seting $parentId = 0 // No thread already; create it. $temp_msid = ''; $parentId = $this->post_new_comment( 'forum:' . $forumId, 0, $userName, $title, sprintf(tra("Use this thread to discuss the %s page."), "[tiki-index.php?page=$title|$title]"), $temp_msid, $in_reply_to ); $this->register_forum_post($forumId,0); // First post is in reply to this one $in_reply_to = $temp_msid; */ $parentId = 0; } // post $threadid = $this->post_new_comment('forum:' . $forumId, $parentId, $userName, $title, $body, $message_id, $in_reply_to, 'n', '', '', '', $anonName, $postDate); $this->register_forum_post($forumId, $parentId); // Process attachments if (array_key_exists('parts', $output) && count($output['parts']) > 1) { $forum_info = $this->get_forum($forumId); if ($forum_info['att'] != 'att_no') { $errors = array(); foreach ($output['parts'] as $part) { if (array_key_exists('disposition', $part)) { if ($part['disposition'] == 'attachment') { if (strlen($part['d_parameters']['filename']) > 0) { $part_name = $part['d_parameters']['filename']; } else { $part_name = "Unnamed File"; } $this->add_thread_attachment($forum_info, $threadid, $errors, $part_name, $part['type'], strlen($part['body']), 1, '', $part['body'], $suppressErrors); } elseif ($part['disposition'] == 'inline') { foreach ($part['parts'] as $p) { $this->add_thread_attachment($forum_info, $threadid, $errors, '-', $p['type'], strlen($p['body']), 1, '', $p['body'], $suppressErrors); } } } } } } // Deal with mail notifications. if (array_key_exists('outbound_mails_reply_link', $info) && $info['outbound_mails_for_inbound_mails'] == 'y') { //phpinfo(); include_once 'lib/notifications/notificationemaillib.php'; sendForumEmailNotification('forum_post_thread', $threadid, $info, $title, $body, $userName, $title, $message_id, $in_reply_to, $threadid, $parentId); } $pop3->deleteMsg($i); } $pop3->disconnect(); }
if (is_a($ret, 'PEAR_Error')) { die("Error in authentication: " . $ret->getMessage()); } // print number of messages found echo $pop3->numMsg() . " message(s) in mailbox\n"; // print message headers if ($pop3->numMsg() > 0) { for ($x = 1; $x <= $pop3->numMsg(); $x++) { $hdrs = $pop3->getParsedHeaders($x); print_r($hdrs); //echo $hdrs['From'] . "\n" . $hdrs['Subject'] . "\n" . $hdrs['Message-Id'] . "\n\n"; $count = 0; // Only process emails from xxx. // if (preg_match('/evoldir\@evol.biology.mcmaster.ca/', $pop3->getBody($x))) if (preg_match('/evoldir\\@evol.biology.mcmaster.ca/', $hdrs['From'])) { $id = store_message($hdrs, $pop3->getBody($x)); if ($id != '') { // It's a new message // geocode $latlng = geocode($pop3->getBody($x)); if ($latlng) { print_r($latlng); store_latlng($id, $latlng); } // generate Tinyurl $url = 'http://tinyurl.com/api-create.php?url=http://bioguid.info/services/evoldir/get.php?id=' . $id; $tiny = get($url); $status = $hdrs['Subject'] . ' ' . $tiny; echo $status . "\n"; // Send message to twitter if ($config['oauth']) {
function process_inbound_mail($forumId) { // require_once ("lib/webmail/pop3.php"); require_once "lib/webmail/net_pop3.php"; require_once "lib/mail/mimelib.php"; //require_once ("lib/webmail/mimeDecode.php"); include_once "lib/webmail/class.rc4crypt.php"; include_once "lib/webmail/htmlMimeMail.php"; $info = $this->get_forum($forumId); // for any reason my sybase test machine adds a space to // the inbound_pop_server field in the table. $info["inbound_pop_server"] = trim($info["inbound_pop_server"]); if (!$info["inbound_pop_server"] || empty($info["inbound_pop_server"])) { return; } $pop3 = new Net_POP3(); $pop3->connect($info["inbound_pop_server"]); $pop3->login($info["inbound_pop_user"], $info["inbound_pop_password"]); if (!$pop3) { return; } $mailsum = $pop3->numMsg(); $pop3->disconnect(); for ($i = 1; $i <= $mailsum; $i++) { // Just changed the code to close and re-open the POP3 session for // each message; it used to try to retrieve everything in one // session. // // We close and re-open for each message because POP3 won't // delete mail until the client quits (so you can back out of // accidental deletions in a real user client). This doesn't apply // here, and as it stands if the mailbox gets very full, we end up // hitting the mailbox over and over without changing anything, // because eventually the session times out. // // As a side effect, $i doesn't really get used (we're always // retrieving the first message). // // -Robin Powell, 8 Nov 2004 $pop3->connect($info["inbound_pop_server"]); $pop3->login($info["inbound_pop_user"], $info["inbound_pop_password"]); $aux = $pop3->getParsedHeaders(1); // If the connection is done, or the mail has an error, or whatever, // we try to delete the current mail (because something is wrong with it) // and continue on. --rlpowell if ($aux == FALSE) { $pop3->deleteMsg(1); continue; } if (!isset($aux["From"])) { $aux['From'] = $aux['Return-path']; } preg_match('/<?([-!#$%&\'*+\\.\\/0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\\.[-!#$%&\'*+\\.\\/0-9=?A-Z^_`a-z{|}~]+)>?/', $aux["From"], $mail); $email = $mail[1]; $full = $pop3->getMsg(1); $message = $pop3->getBody(1); // print( "<pre>" ); // print_r( $full ); // print( "</pre>" ); $output = mime::decode($full); //unset ($parts); //$this->parse_output($output, $parts, 0); // print( "<pre>" ); // print_r( $output ); // print( "</pre>" ); if (isset($output["text"][0])) { $body = $output["text"][0]; } elseif (isset($output['parts'][0]["text"][0])) { $body = $output['parts'][0]["text"][0]; } elseif (isset($output['body'])) { $body = $output['body']; } else { $body = ""; } // print( "<pre>" ); // print_r( $body ); // print( "</pre>" ); // Remove 're:' and [forum]. -rlpowell $title = trim(preg_replace("/[rR][eE]:/", "", preg_replace("/\\[[-A-Za-z _:]*\\]/", "", $output['header']['subject']))); if (stristr($aux['Subject'], "=?iso-8859-1?") == $aux['Subject']) { $title = utf8_encode($title); } //Todo: check permissions $message_id = substr($output['header']["message-id"], 1, strlen($output['header']["message-id"]) - 2); if (isset($output['header']["in-reply-to"])) { $in_reply_to = substr($output['header']["in-reply-to"], 1, strlen($output['header']["in-reply-to"]) - 2); } else { $in_reply_to = ''; } // Determine user from email $userName = $this->getOne("select `login` from `users_users` where `email`=?", array($email)); if (!$userName) { $user = ''; } // Determine if the thread already exists. $parentId = $this->getOne("select `threadId` from `tiki_comments` where\n\t\t `object`=? and `objectType` = 'forum' and\n\t\t `parentId`=0 and `title`=?", array($forumId, $title)); // print( "<pre>parentid:" ); // print_r( $parentId ); // print( "</pre>" ); if (!$parentId) { // No thread already; create it. $temp_msid = ''; $parentId = $this->post_new_comment('forum:' . $forumId, 0, $userName, $title, sprintf(tra("Use this thread to discuss the %s page."), "[tiki-index.php?page={$title}|{$title}]"), $temp_msid, $in_reply_to); $this->register_forum_post($forumId, 0); // First post is in reply to this one $in_reply_to = $temp_msid; } // post $threadid = $this->post_new_comment('forum:' . $forumId, $parentId, $userName, $title, $body, $message_id, $in_reply_to); $this->register_forum_post($forumId, $parentId); // Process attachments if (array_key_exists('parts', $output) && count($output['parts']) > 1) { foreach ($output['parts'] as $part) { if (array_key_exists('disposition', $part) && $part['disposition'] == "attachment") { if (strlen($part['d_parameters']['filename']) > 0) { $part_name = $part['d_parameters']['filename']; } else { $part_name = "Unnamed File"; } $forum_info = $this->get_forum($forumId); $this->add_thread_attachment($forum_info, $threadid, '', $part['body'], $part_name, $part['type'], strlen($part['body']), 1); } } } // Deal with mail notifications. if (array_key_exists('outbound_mails_reply_link', $info) && $info['outbound_mails_for_inbound_mails'] == 'y') { //phpinfo(); include_once 'lib/notifications/notificationemaillib.php'; sendForumEmailNotification('forum_post_thread', $threadid, $info, $title, $body, $userName, $title, $message_id, $in_reply_to, $threadid, $parentId); } $pop3->deleteMsg(1); $pop3->disconnect(); } }
// Connect to the POP3 server & open the mailbox $oPop3 = new Net_POP3(); $oPop3->connect(MAILBOX_SERVER, MAILBOX_SERVER_PORT); $oPop3->login(MAILBOX_ACCOUNT, MAILBOX_PASSWORD); // Read all the messages from the mailbox and tries to create a new ticket for each one // Note: it is expected that the sender of the email exists a valid contact as a 'Contact' // in iTop (identified by her/his email address), otherwise the ticket creation will fail $iNbMessages = $oPop3->numMsg(); for ($index = 1; $index <= $iNbMessages; $index++) { $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $params['crlf'] = "\r\n"; $aHeaders = $oPop3->getParsedHeaders($index); $aSender = GetSender($aHeaders); $oDecoder = new Mail_mimeDecode($oPop3->getRawHeaders($index) . $params['crlf'] . $oPop3->getBody($index)); $oStructure = $oDecoder->decode($params); $sSubject = $aHeaders['Subject']; // Search for the text/plain body part $iPartIndex = 0; $bFound = false; $sTextBody = ''; //echo "<pre>\n"; //print_r($oStructure); //echo "</pre>\n"; if (!isset($oStructure->parts) || count($oStructure->parts) == 0) { $sTextBody = $oStructure->body; } else { // Find the first "part" of the body which is in text/plain while ($iPartIndex < count($oStructure->parts) && !$bFound) { //echo "<p>Reading part $iPartIndex</p>\n";