diff --git a/backend.php b/backend.php index 23f46282..130be4a1 100644 --- a/backend.php +++ b/backend.php @@ -3948,8 +3948,14 @@ if ($op == "digestTest") { header("Content-Type: text/plain"); + print_r(prepare_headlines_digest($link, $_SESSION["uid"])); + $print_exec_time = false; - echo prepare_headlines_digest($link, $_SESSION["uid"]); + } + + if ($op == "digestSend") { + header("Content-Type: text/plain"); + send_headlines_digests($link); $print_exec_time = false; } diff --git a/config.php-dist b/config.php-dist index cd145072..9f2f2385 100644 --- a/config.php-dist +++ b/config.php-dist @@ -75,8 +75,8 @@ define('MAIL_RESET_PASS', true); // Send mail to user on password reset - define('MAIL_FROM', 'TT-RSS Daemon '); - // Pretty obvious, I suppose. + define('MAIL_FROM', 'TT-RSS Daemon '); + // Pretty obvious, I suppose. Used for email digests & password notifications. define('ENABLE_FEED_BROWSER', true); // Enable or disable local feed browser @@ -134,9 +134,12 @@ define('USE_CURL_FOR_ICONS', false); // Fetch favicons using CURL, useful if your PHP has disabled remote fopen() - define('DIGEST_HOSTNAME', 'madoka.spb.ru'); + define('DIGEST_HOSTNAME', 'some.ttrss.host.dom'); // Hostname for email digest signature + define('DIGEST_EMAIL_LIMIT', 10); + // The maximum amount of emails sent in one digest batch + define('CONFIG_VERSION', 5); // Expected config version. Please update this option in config.php // if necessary (after migrating all new options from this file). diff --git a/functions.php b/functions.php index 1fa9aa29..2dbe127b 100644 --- a/functions.php +++ b/functions.php @@ -2378,12 +2378,53 @@ return $res; } + function send_headlines_digests($link, $limit = 100) { + + $user_limit = DIGEST_EMAIL_LIMIT; + $days = DIGEST_DAYS_BACK; + + print "Sending digests, batch of max $user_limit users, days = $days, headline limit = $limit\n\n"; + + if (DB_TYPE == "pgsql") { + $interval_query = "last_digest_sent < NOW() - INTERVAL '$days days'"; + } else if (DB_TYPE == "mysql") { + $interval_query = "last_digest_sent < DATE_SUB(NOW(), INTERVAL $days DAY)"; + } + + $result = db_query($link, "SELECT id,email FROM ttrss_users + WHERE email != '' AND (last_digest_sent IS NULL OR $interval_query)"); + + while ($line = db_fetch_assoc($result)) { + if (get_pref($link, 'DIGEST_ENABLE', $line['id'], false)) { + print "Sending digest for UID:" . $line['id'] . " - " . $line["email"] . " ... "; + + $tuple = prepare_headlines_digest($link, $line["id"], $days, $limit); + $digest = $tuple[0]; + $headlines_count = $tuple[1]; + + if ($headlines_count > 0) { + $rc = mail($line["login"] . " <" . $line["email"] . ">", + "[tt-rss] New headlines for last 24 hours", $digest, + "From: " . MAIL_FROM); + print "RC=$rc\n"; + db_query($link, "UPDATE ttrss_users SET last_digest_sent = NOW() + WHERE id = " . $line["id"]); + } else { + print "No headlines\n"; + } + } + } + +// $digest = prepare_headlines_digest($link, $user_id, $days, $limit); + + } + function prepare_headlines_digest($link, $user_id, $days = 1, $limit = 100) { $tmp = "New headlines for last 24 hours, as of " . date("Y/m/d H:m") . "\n"; $tmp .= "=======================================================\n\n"; if (DB_TYPE == "pgsql") { - $interval_query = "ttrss_entries.date_entered < NOW() - INTERVAL '$days days'"; + $interval_query = "ttrss_entries.date_entered > NOW() - INTERVAL '$days days'"; } else if (DB_TYPE == "mysql") { $interval_query = "ttrss_entries.date_entered > DATE_SUB(NOW(), INTERVAL $days DAY)"; } @@ -2397,6 +2438,7 @@ ttrss_user_entries,ttrss_entries,ttrss_feeds WHERE ref_id = ttrss_entries.id AND feed_id = ttrss_feeds.id + AND hidden = false AND $interval_query AND ttrss_user_entries.owner_uid = $user_id AND unread = true ORDER BY ttrss_feeds.title, date_entered DESC @@ -2404,6 +2446,8 @@ $cur_feed_title = ""; + $headlines_count = db_num_rows($result); + while ($line = db_fetch_assoc($result)) { $updated = smart_date_time(strtotime($line["last_updated"])); $feed_title = $line["feed_title"]; @@ -2425,7 +2469,7 @@ "To unsubscribe, visit your configuration options or contact instance owner.\n"; - return $tmp; + return array($tmp, $headlines_count); } function check_for_update($link) { diff --git a/update_daemon.php b/update_daemon.php index 007afb5b..b15d4396 100644 --- a/update_daemon.php +++ b/update_daemon.php @@ -148,6 +148,8 @@ } } + send_headlines_digests($link); + print "Sleeping for " . DAEMON_SLEEP_INTERVAL . " seconds...\n"; sleep(DAEMON_SLEEP_INTERVAL); diff --git a/update_feeds.php b/update_feeds.php index 5d8ea2da..279f4e1d 100644 --- a/update_feeds.php +++ b/update_feeds.php @@ -34,6 +34,8 @@ update_all_feeds($link, false, $user_id, true); } + send_headlines_digests($link); + db_close($link); ?>