diff --git a/config.php-dist b/config.php-dist index b52414d9f..1cabc5a07 100644 --- a/config.php-dist +++ b/config.php-dist @@ -74,7 +74,8 @@ // Fetch favicons using CURL, useful if your PHP has disabled remote fopen() define('DIGEST_ENABLE', true); - // Global option to enable daily digests + // Global option to enable daily digests. Also toggles the ability of users + // to forward articles by email. define('DIGEST_EMAIL_LIMIT', 10); // The maximum amount of emails sent in one digest batch diff --git a/functions.php b/functions.php index a11d9e59c..18e7b23f1 100644 --- a/functions.php +++ b/functions.php @@ -4787,7 +4787,7 @@ print "
"; - print "
"; $entry_author = $line["author"]; @@ -4819,7 +4819,7 @@ if (!$zoom_mode) { print "$tags_str (+)"; + href=\"#\" onclick=\"editArticleTags($id, $feed_id)\">(+)"; print "PubNote"; + if (DIGEST_ENABLE) { + print "Zoom"; + } + } else { $tags_str = strip_tags($tags_str); print "$tags_str"; @@ -6838,4 +6845,14 @@ print ""; } + + function save_email_address($link, $email) { + // FIXME: implement persistent storage of emails + + if (!$_SESSION['stored_emails']) + $_SESSION['stored_emails'] = array(); + + if (!in_array($email, $_SESSION['stored_emails'])) + array_push($_SESSION['stored_emails'], $email); + } ?> diff --git a/images/art-email.png b/images/art-email.png new file mode 100755 index 000000000..babe43a22 Binary files /dev/null and b/images/art-email.png differ diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php index 1645db96e..55babdaa7 100644 --- a/modules/backend-rpc.php +++ b/modules/backend-rpc.php @@ -1019,6 +1019,81 @@ return; } + if ($subop == "sendEmail") { + $secretkey = $_REQUEST['secretkey']; + + print ""; + + if (DIGEST_ENABLE && $_SESSION['email_secretkey'] && + $secretkey == $_SESSION['email_secretkey']) { + + $_SESSION['email_secretkey'] = ''; + + $destination = $_REQUEST['destination']; + $subject = $_REQUEST['subject']; + $content = $_REQUEST['content']; + + $replyto = strip_tags($_SESSION['email_replyto']); + $fromname = strip_tags($_SESSION['email_fromname']); + + $mail = new PHPMailer(); + + $mail->PluginDir = "lib/phpmailer/"; + $mail->SetLanguage("en", "lib/phpmailer/language/"); + + $mail->CharSet = "UTF-8"; + + $mail->From = $replyto; + $mail->FromName = $fromname; + $mail->AddAddress($destination); + + if (DIGEST_SMTP_HOST) { + $mail->Host = DIGEST_SMTP_HOST; + $mail->Mailer = "smtp"; + $mail->SMTPAuth = DIGEST_SMTP_LOGIN != ''; + $mail->Username = DIGEST_SMTP_LOGIN; + $mail->Password = DIGEST_SMTP_PASSWORD; + } + + $mail->IsHTML(false); + $mail->Subject = $subject; + $mail->Body = $content; + + $rc = $mail->Send(); + + if (!$rc) { + print "ErrorInfo . "]]>"; + } else { + save_email_address($link, db_escape_string($destination)); + print "OK"; + } + + } else { + print "Not authorized."; + } + + print ""; + + return; + } + + if ($subop == "completeEmails") { + + $search = db_escape_string($_REQUEST["search"]); + + print "
    "; + + foreach ($_SESSION['stored_emails'] as $email) { + if (strpos($email, $search) !== false) { + print "
  • $email
  • "; + } + } + + print "
"; + + return; + } + print "Unknown method: $subop"; } ?> diff --git a/modules/popup-dialog.php b/modules/popup-dialog.php index 4d68fb971..fb1921291 100644 --- a/modules/popup-dialog.php +++ b/modules/popup-dialog.php @@ -279,7 +279,7 @@ print ""; + name=\"feed\" id=\"feed_url\">"; print "
"; @@ -666,47 +666,113 @@ return; } -/* if ($id == "offlineDownload") { - print "
".__('Download articles')."
"; + if ($id == "emailArticle") { + + print "
".__('Forward article by email')."
"; print "
"; - print "
"; + print ""; - print "
".__("Download")."
"; + $secretkey = sha1(make_password(10)); - print "
"; + $_SESSION['email_secretkey'] = $secretkey; - $amount = array( - 50 => 50, - 100 => 100, - 250 => 250, - 500 => 500); + print ""; + print ""; + print ""; - print_select_hash("amount", 50, $amount); + require_once "lib/MiniTemplator.class.php"; - print " " . __("latest articles for offline reading."); + $tpl = new MiniTemplator; + $tpl_t = new MiniTemplator; - print "
"; + $tpl->readTemplateFromFile("templates/email_article_template.txt"); - print ""; - print ""; + $result = db_query($link, "SELECT link, content, title + FROM ttrss_user_entries, ttrss_entries WHERE id = ref_id AND + id = '$param' AND owner_uid = " . $_SESSION["uid"]); - print "
"; + $line = db_fetch_assoc($result); + + $subject = htmlspecialchars(__("[Forwarded]") . " " . $line["title"]); + + $tpl->setVariable('ARTICLE_TITLE', strip_tags($line["title"])); + +/* $tpl->setVariable('ARTICLE_EXCERPT', + truncate_string(strip_tags($line["content"]), 200)); */ + + $tpl->setVariable('ARTICLE_URL', strip_tags($line["link"])); + + $result = db_query($link, "SELECT email FROM ttrss_users WHERE + id = " . $_SESSION["uid"]); + + $user_email = htmlspecialchars(db_fetch_result($result, 0, "email")); + $user_name = htmlspecialchars($_SESSION["name"]); + + //print ""; + //print ""; + + $_SESSION['email_replyto'] = $user_email; + $_SESSION['email_fromname'] = $user_name; + + $tpl->setVariable('USER_NAME', $_SESSION["name"]); + $tpl->setVariable('USER_EMAIL', $user_email); + $tpl->setVariable('TTRSS_HOST', $_SERVER["HTTP_HOST"]); + + $tpl->addBlock('email'); + + $content = ""; + $tpl->generateOutputToString($content); + + print "
"; + + print __('From:'); + + print ""; + + print "\">"; + + print "
"; + + print __('To:'); + + print ""; + + print ""; + + print "
"; + + print "
"; + + print __('Subject:'); + + print ""; + + print ""; + + print "
"; + + print ""; print "
"; - print "
- -
"; + print "
"; + + print " "; + print ""; print "
"; return; - } */ - + } print "
Internal Error
diff --git a/templates/email_article_template.txt b/templates/email_article_template.txt new file mode 100644 index 000000000..035ee5c97 --- /dev/null +++ b/templates/email_article_template.txt @@ -0,0 +1,15 @@ + +Hi, + +I've been reading this article and thought it might interest you: + +${ARTICLE_TITLE} + +${ARTICLE_URL} + +Sincerely yours, + ${USER_NAME} <${USER_EMAIL}>. + +-- +This message has been sent by Tiny Tiny RSS installation at ${TTRSS_HOST}. + diff --git a/tt-rss.css b/tt-rss.css index a6fef1e1f..ba7bbe575 100644 --- a/tt-rss.css +++ b/tt-rss.css @@ -34,7 +34,7 @@ div.postReply div.postHeader { background-color : #f9faff; margin : 0px 1px 0px 0px; padding : 5px; - cursor : move; + /* cursor : move; */ color : #909090; } @@ -2001,3 +2001,5 @@ button[disabled] { color : #dedede; border : 1px solid #dedede; } */ + + diff --git a/viewfeed.js b/viewfeed.js index 1b8a1dab0..ac76be70b 100644 --- a/viewfeed.js +++ b/viewfeed.js @@ -2262,3 +2262,63 @@ function publishWithNote(id, def_note) { exception_error("publishWithNote", e); } } + +function emailArticle(id) { + try { + displayDlg('emailArticle', id, + function () { + document.forms['article_email_form'].destination.focus(); + + new Ajax.Autocompleter('destination', 'destination_choices', + "backend.php?op=rpc&subop=completeEmails", + { tokens: '', paramName: "search" }); + + }); + + } catch (e) { + exception_error("emailArticle", e); + } +} + +function emailArticleDo(id) { + try { + var f = document.forms['article_email_form']; + + if (f.destination.value == "") { + alert("Please fill in the destination email."); + return; + } + + if (f.subject.value == "") { + alert("Please fill in the subject."); + return; + } + + var query = Form.serialize("article_email_form"); + +// console.log(query); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + try { + + var error = transport.responseXML.getElementsByTagName('error')[0]; + + if (error) { + alert(__('Error sending email:') + ' ' + error.firstChild.nodeValue); + } else { + notify_info('Your message has been sent.'); + closeInfoBox(); + } + + } catch (e) { + exception_error("sendEmailDo", e); + } + + } }); + + } catch (e) { + exception_error("emailArticleDo", e); + } +}