예제 #1
0
 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();
 }
예제 #2
0
파일: pop.php 프로젝트: rdmpage/bioguid
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']) {
예제 #3
0
 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();
     }
 }
예제 #4
0
// 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";