summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2010-11-06 00:47:02 +0300
committerAndrew Dolgov <[email protected]>2010-11-06 00:47:02 +0300
commit31a53903e635ae84ae1551d52772e75f2380b416 (patch)
tree0611e047ccca7c04d21aae64cffad3ed4ec3f1f9
parentf0855b88af1ee551d6591eb64a9bdecb2f4a7833 (diff)
add article forwarding by email (closes #271)
-rw-r--r--config.php-dist3
-rw-r--r--functions.php21
-rwxr-xr-ximages/art-email.pngbin0 -> 1267 bytes
-rw-r--r--modules/backend-rpc.php75
-rw-r--r--modules/popup-dialog.php116
-rw-r--r--templates/email_article_template.txt15
-rw-r--r--tt-rss.css4
-rw-r--r--viewfeed.js60
8 files changed, 265 insertions, 29 deletions
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 "<div class=\"postReply\">";
- print "<div class=\"postHeader\" onmouseover=\"enable_resize(true)\"
+ print "<div class=\"postHeader\" onmouseover=\"enable_resize(false)\"
onmouseout=\"enable_resize(false)\">";
$entry_author = $line["author"];
@@ -4819,7 +4819,7 @@
if (!$zoom_mode) {
print "<span id=\"ATSTR-$id\">$tags_str</span>
<a title=\"".__('Edit tags for this article')."\"
- href=\"javascript:editArticleTags($id, $feed_id)\">(+)</a>";
+ href=\"#\" onclick=\"editArticleTags($id, $feed_id)\">(+)</a>";
print "<img src=\"".theme_image($link, 'images/art-zoom.png')."\"
class='tagsPic' style=\"cursor : pointer\" style=\"cursor : pointer\"
@@ -4833,6 +4833,13 @@
onclick=\"publishWithNote($id, '$note_escaped')\"
alt='PubNote' title='".__('Publish article with a note')."'>";
+ if (DIGEST_ENABLE) {
+ print "<img src=\"".theme_image($link, 'images/art-email.png')."\"
+ class='tagsPic' style=\"cursor : pointer\" style=\"cursor : pointer\"
+ onclick=\"emailArticle($id)\"
+ alt='Zoom' title='".__('Forward by email')."'>";
+ }
+
} else {
$tags_str = strip_tags($tags_str);
print "<span id=\"ATSTR-$id\">$tags_str</span>";
@@ -6838,4 +6845,14 @@
print "<disable-cache value=\"1\"/>";
}
+
+ 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
--- /dev/null
+++ b/images/art-email.png
Binary files 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 "<rpc-reply>";
+
+ 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 "<error><![CDATA[" . $mail->ErrorInfo . "]]></error>";
+ } else {
+ save_email_address($link, db_escape_string($destination));
+ print "<message>OK</message>";
+ }
+
+ } else {
+ print "<error>Not authorized.</error>";
+ }
+
+ print "</rpc-reply>";
+
+ return;
+ }
+
+ if ($subop == "completeEmails") {
+
+ $search = db_escape_string($_REQUEST["search"]);
+
+ print "<ul>";
+
+ foreach ($_SESSION['stored_emails'] as $email) {
+ if (strpos($email, $search) !== false) {
+ print "<li>$email</li>";
+ }
+ }
+
+ print "</ul>";
+
+ return;
+ }
+
print "<rpc-reply><error>Unknown method: $subop</error></rpc-reply>";
}
?>
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 "<input size=\"40\"
onkeypress=\"return filterCR(event, subscribeToFeed)\"
- name=\"feed\" id=\"feed_url\"></td></tr>";
+ name=\"feed\" id=\"feed_url\">";
print "<br/>";
@@ -666,47 +666,113 @@
return;
}
-/* if ($id == "offlineDownload") {
- print "<div id=\"infoBoxTitle\">".__('Download articles')."</div>";
+ if ($id == "emailArticle") {
+
+ print "<div id=\"infoBoxTitle\">".__('Forward article by email')."</div>";
print "<div class=\"infoBoxContents\">";
- print "<form name='download_ops_form' id='download_ops_form'>";
+ print "<form id=\"article_email_form\" onsubmit='return false'>";
- print "<div class=\"dlgSec\">".__("Download")."</div>";
+ $secretkey = sha1(make_password(10));
- print "<div class=\"dlgSecCont\">";
+ $_SESSION['email_secretkey'] = $secretkey;
- $amount = array(
- 50 => 50,
- 100 => 100,
- 250 => 250,
- 500 => 500);
+ print "<input type=\"hidden\" name=\"secretkey\" value=\"$secretkey\">";
+ print "<input type=\"hidden\" name=\"op\" value=\"rpc\">";
+ print "<input type=\"hidden\" name=\"subop\" value=\"sendEmail\">";
- 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 "<br/>";
+ $tpl->readTemplateFromFile("templates/email_article_template.txt");
- print "<input checked='yes' type='checkbox' name='unread_only' id='unread_only'>";
- print "<label for='unread_only'>".__('Only include unread articles')."</label>";
+ $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 "</div>";
+ $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 "<input type=\"hidden\" name=\"replyto\" value=\"$user_email\">";
+ //print "<input type=\"hidden\" name=\"fromname\" value=\"$user_name\">";
+
+ $_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 "<table width='100%'><tr><td>";
+
+ print __('From:');
+
+ print "</td><td>";
+
+ print "<input size=\"40\" disabled
+ onkeypress=\"return filterCR(event, false)\"
+ value=\"$user_name <$user_email>\">";
+
+ print "</td></tr><tr><td>";
+
+ print __('To:');
+
+ print "</td><td>";
+
+ print "<input size=\"40\"
+ onkeypress=\"return filterCR(event, false)\"
+ name=\"destination\" id=\"destination\">";
+
+ print "<div class=\"autocomplete\" id=\"destination_choices\"
+ style=\"display:none\"></div>";
+
+ print "</td></tr><tr><td>";
+
+ print __('Subject:');
+
+ print "</td><td>";
+
+ print "<input size=\"60\" class=\"iedit\"
+ onkeypress=\"return filterCR(event, false)\"
+ name=\"subject\" value=\"$subject\" id=\"subject\">";
+
+ print "</td></tr></table>";
+
+ print "<textarea rows='10' class='iedit' style='font-size : small'
+ name='content'>$content</textarea>";
print "</form>";
- print "<div class=\"dlgButtons\">
- <input class=\"button\"
- type=\"submit\" onclick=\"return initiate_offline_download(0, this)\" value=\"".__('Download')."\">
- <input class=\"button\"
- type=\"submit\" onclick=\"return closeInfoBox()\"
- value=\"".__('Cancel')."\"></div>";
+ print "<div class='dlgButtons'>";
+
+ print "<button onclick=\"return emailArticleDo()\">".__('Send e-mail')."</button> ";
+ print "<button onclick=\"return closeInfoBox()\">".__('Cancel')."</button>";
print "</div>";
return;
- } */
-
+ }
print "<div id='infoBoxTitle'>Internal Error</div>
<div id='infoBoxContents'>
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 @@
+<!-- $BeginBlock email -->
+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}.
+<!-- $EndBlock email -->
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);
+ }
+}