--- /dev/null
+Insipid has a feature to fetch new links from e-mails.
+Those e-mails are read from a configured IMAP mailbox.
+
+You need to enable the imap functions within PHP and
+have a IMAP mailbox on a SSL/TLS email server.
+
+Set the config variables in the config file.
+Make sure you an individual marker string!
+There is no "security" within this method. Only the special string you can define.
+The new links will be hidden at first. You need to verify them before they are
+visible in your list.
\ No newline at end of file
Bookmarks are put into categories and should have tags.
-New links will be checked and tried to get as much as possible information automatically.
\ No newline at end of file
+New links will be checked and tried to get as much as possible information automatically.
+
+If you enable the email importer, emails contents will be automatically added to the database.
\ No newline at end of file
-Apache (2 and up) with PHP extension
+Apache (2 and up) with PHP extension (+imap if you us the email importer)
PHP (5 and up) with MySQL extension -> mysqli; curl enabled
MySQL database 5.6.x and up
\ No newline at end of file
# user config
define('FRONTEND_USERNAME','luke');
-define('FRONTEND_PASSWORD','thefather');
\ No newline at end of file
+define('FRONTEND_PASSWORD','father');
+
+# settings for importing from e-mail
+# SSL/TLS only
+# imap
+define('EMAIL_SERVER','');
+define('EMAIL_SERVER_USER','');
+define('EMAIL_SERVER_PASS','');
+define('EMAIL_SERVER_PORT',993);
+define('EMAIL_SERVER_MAILBOX','INBOX'); # default INBOX
+define('EMAIL_MARKER','to-insipid- ');
\ No newline at end of file
--- /dev/null
+<?php
+/**
+ * Insipid
+ * Personal web-bookmark-system
+ *
+ * Copyright 2016-2017 Johannes Keßler
+ *
+ * Development starting from 2011: Johannes Keßler
+ * https://www.bananas-playground.net/projekt/insipid/
+ *
+ * creator:
+ * Luke Reeves <luke@neuro-tech.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/gpl-3.0.
+ *
+ */
+
+mb_http_output('UTF-8');
+mb_internal_encoding('UTF-8');
+ini_set('error_reporting',-1); // E_ALL & E_STRICT
+# time settings
+date_default_timezone_set('Europe/Berlin');
+
+define('DEBUG',true);
+
+## check request
+$_urlToParse = filter_var($_SERVER['QUERY_STRING'],FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
+if(!empty($_urlToParse)) {
+ # see http://de2.php.net/manual/en/regexp.reference.unicode.php
+ if(preg_match('/[\p{C}\p{M}\p{Sc}\p{Sk}\p{So}\p{Zl}\p{Zp}]/u',$_urlToParse) === 1) {
+ die('Malformed request. Make sure you know what you are doing.');
+ }
+}
+
+## set the error reporting
+ini_set('log_errors',true);
+ini_set('error_log','error.log');
+if(DEBUG === true) {
+ ini_set('display_errors',true);
+}
+else {
+ ini_set('display_errors',false);
+}
+
+require('../config.php');
+require('../lib/simple-imap.class.php');
+
+## DB connection
+mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); # throw exeptions
+$DB = new mysqli(DB_HOST, DB_USERNAME,DB_PASSWORD, DB_NAME);
+if ($DB->connect_errno) exit('Can not connect to MySQL Server');
+$DB->set_charset("utf8mb4");
+$DB->query("SET collation_connection = 'utf8mb4_bin'");
+
+# the email reader
+$EmailReader = new SimpleImap();
+try {
+ $EmailReader->connect();
+ #if(DEBUG === true) {$EmailReader->mailboxStatus();}
+}
+catch (Exception $e) {
+ error_log('Email server connection failed: '.var_export($e->getMessage(),true));
+}
+
+try {
+ $EmailReader->process();
+}
+catch (Exception $e) {
+ error_log('Can not process email messages: '.var_export($e->getMessage(),true));
+}
+
+$DB->close();
+# END
\ No newline at end of file
--- /dev/null
+[20-Aug-2017 19:32:30 Europe/Berlin] PHP Warning: require(config.php): failed to open stream: No such file or directory in /home/banana/code/insipid/webroot/job/email-import.php on line 56
+[20-Aug-2017 19:32:30 Europe/Berlin] PHP Fatal error: require(): Failed opening required 'config.php' (include_path='.:/usr/share/php5:/usr/share/php') in /home/banana/code/insipid/webroot/job/email-import.php on line 56
+[20-Aug-2017 19:42:37 Europe/Berlin] PHP Notice: Undefined variable: EmailReader in /home/banana/code/insipid/webroot/job/email-import.php on line 66
+[20-Aug-2017 19:42:37 Europe/Berlin] PHP Fatal error: Class name must be a valid object or a string in /home/banana/code/insipid/webroot/job/email-import.php on line 66
+[20-Aug-2017 19:43:13 Europe/Berlin] PHP Fatal error: Class 'EmailReader' not found in /home/banana/code/insipid/webroot/job/email-import.php on line 67
+[20-Aug-2017 19:43:23 Europe/Berlin] Email server connection failed: 'Missing EMAIL_SERVER'
+[20-Aug-2017 19:43:25 Europe/Berlin] Email server connection failed: 'Missing EMAIL_SERVER'
+[20-Aug-2017 19:43:49 Europe/Berlin] Email server connection failed: 'Missing EMAIL_SERVER'
+[20-Aug-2017 19:43:59 Europe/Berlin] Email server connection failed: 'Missing EMAIL_SERVER'
+[20-Aug-2017 19:46:06 Europe/Berlin] Email server connection failed: 'Missing EMAIL_SERVER'
+[20-Aug-2017 20:07:56 Europe/Berlin] PHP Fatal error: Call to undefined function imap_open() in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 51
+[20-Aug-2017 20:52:35 Europe/Berlin] PHP Fatal error: Uncaught Error: Cannot use object of type stdClass as array in /home/banana/code/insipid/webroot/lib/simple-imap.class.php:76
+Stack trace:
+#0 /home/banana/code/insipid/webroot/job/email-import.php(83): SimpleImap->process()
+#1 {main}
+ thrown in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 20:53:03 Europe/Berlin] PHP Fatal error: Uncaught Error: Cannot use object of type stdClass as array in /home/banana/code/insipid/webroot/lib/simple-imap.class.php:77
+Stack trace:
+#0 /home/banana/code/insipid/webroot/job/email-import.php(83): SimpleImap->process()
+#1 {main}
+ thrown in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 20:56:57 Europe/Berlin] PHP Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW), expecting ',' or ')' in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 83
+[20-Aug-2017 21:01:58 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:01:59 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:00 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:00 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:31 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:32 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:32 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:32 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:32 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:32 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:02:32 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 76
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:14 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:15 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:15 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:15 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:15 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:15 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
+[20-Aug-2017 21:06:15 Europe/Berlin] PHP Notice: Trying to get property of non-object in /home/banana/code/insipid/webroot/lib/simple-imap.class.php on line 77
--- /dev/null
+<?php
+
+/**
+ * simple IMAP SSL/TLS email connection based on the imap PHP functions
+ * the code supports SSL/TLS and IMAP only
+ *
+ * @author banana
+ *
+ */
+class SimpleImap {
+
+ private $_connection;
+
+ private $_inbox;
+
+ private $_server = EMAIL_SERVER;
+ private $_user = EMAIL_SERVER_USER;
+ private $_pass = EMAIL_SERVER_PASS;
+ private $_port = EMAIL_SERVER_PORT;
+ private $_mailbox = EMAIL_SERVER_MAILBOX;
+
+ private $_connectionstring = '';
+
+ function __construct() {
+ # create the mailboxstring
+ $this->_connectionstring = '{'.$this->_server.':'.$this->_port.'/imap/ssl}';
+ }
+
+ function __destruct() {
+ imap_close($this->_connection);
+ }
+
+
+
+ /**
+ * connect to the e-mail server
+ * with this code SSL/TLS only
+ *
+ * @see http://ca.php.net/manual/en/function.imap-open.php
+ */
+ public function connect() {
+
+ if(empty($this->_server)) {
+ throw new Exception('Missing EMAIL_SERVER');
+ }
+ if(empty($this->_port)) {
+ throw new Exception('Missing EMAIL_SERVER_PORT');
+ }
+ if(empty($this->_user)) {
+ throw new Exception('Missing EMAIL_SERVER_USER');
+ }
+
+ # create the connection
+ $this->_connection = imap_open($this->_connectionstring.$this->_mailbox, $this->_user, $this->_pass);
+
+ if(!$this->_connection) {
+ throw new Exception('Failed IMAP connection: '.var_export(imap_last_error(),true));
+ }
+ }
+
+ /**
+ * process the given mailbox and check for the special messages
+ */
+ function process() {
+ $messagecount = imap_num_msg($this->_connection);
+
+ if($messagecount === false) {
+ throw new Exception('Can not read the messages in given mailbox');
+ }
+
+ $messages = array();
+
+ for($i = 1; $i <= $messagecount; $i++) {
+ $subject = '';
+
+ # first we check the header.
+
+ # extract the subject....
+ $headerinfo = imap_rfc822_parse_headers(imap_fetchheader($this->_connection, $i));
+ $subjectArr = imap_mime_header_decode($headerinfo->subject);
+ foreach ($subjectArr as $el) {
+ $subject .= $el->text;
+ }
+
+ if(!empty($subject)) {
+ # check the special stuff
+ $markerextract = substr($subject, 0, strlen(EMAIL_MARKER));
+ if($markerextract == EMAIL_MARKER) {
+ # valid message
+ var_dump($subject);
+ }
+ }
+
+ /*
+ $messages[] = array(
+ 'index' => $i,
+ 'header' => $headerinfo,
+ 'body' => imap_qprint(imap_body($this->_connection, $i)),
+ 'structure' => imap_fetchstructure($this->_connection, $i)
+ );
+ */
+ }
+
+ # log messages processed to all messages
+
+ #var_dump($messages);
+ }
+
+ /**
+ * the the current stats about the mail connection and INBOX
+ * kinda debug only
+ *
+ * @see http://ca.php.net/manual/en/function.imap-status.php
+ */
+ public function mailboxStatus() {
+ if($this->_connection !== false) {
+ $status = imap_status($this->_connection, $this->_connectionstring.$this->_mailbox, SA_ALL);
+ var_dump("messages ".$status->messages);
+ var_dump("recent ".$status->recent);
+ var_dump("unseen ".$status->unseen);
+ var_dump("uidnext ".$status->uidnext);
+ var_dump("uidvalidity ".$status->uidvalidity);
+
+ $list = imap_getmailboxes($this->_connection, $this->_connectionstring, "*");
+ if (is_array($list)) {
+ foreach ($list as $key => $val) {
+ echo "($key) ";
+ echo imap_utf7_decode($val->name) . ",";
+ echo "'" . $val->delimiter . "',";
+ echo $val->attributes . "<br />\n";
+ }
+ } else {
+ error_log("imap_getmailboxes failed: ".var_export(imap_last_error()));
+ }
+ }
+ }
+
+
+
+
+ // move the message to a new folder
+ function move($msg_index, $folder='INBOX.Processed') {
+ // move on server
+ imap_mail_move($this->_connection, $msg_index, $folder);
+ imap_expunge($this->_connection);
+
+ // re-read the inbox
+ $this->inbox();
+ }
+
+ // get a specific message (1 = first email, 2 = second email, etc.)
+ function get($msg_index=NULL) {
+ if (count($this->_inbox) <= 0) {
+ return array();
+ }
+ elseif ( ! is_null($msg_index) && isset($this->_inbox[$msg_index])) {
+ return $this->_inbox[$msg_index];
+ }
+
+ return $this->_inbox[0];
+ }
+
+
+
+ /**
+ * close the imap connection
+ */
+ function close() {
+ imap_close($this->_connection);
+ }
+}
+
+?>
\ No newline at end of file