]> git.wh0rd.org - tt-rss.git/commitdiff
add article forwarding by email (closes #271)
authorAndrew Dolgov <fox@fakecake.org>
Fri, 5 Nov 2010 21:47:02 +0000 (00:47 +0300)
committerAndrew Dolgov <fox@fakecake.org>
Fri, 5 Nov 2010 21:47:02 +0000 (00:47 +0300)
config.php-dist
functions.php
images/art-email.png [new file with mode: 0755]
modules/backend-rpc.php
modules/popup-dialog.php
templates/email_article_template.txt [new file with mode: 0644]
tt-rss.css
viewfeed.js

index b52414d9f3e333308c634e71e6ef9fe0933d3e68..1cabc5a07942478a65b2c59771d722115893050b 100644 (file)
@@ -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
index a11d9e59c3b1e102046174869e96fc21292cb480..18e7b23f1d3c1912c83fe8c750a5837cf5a5d534 100644 (file)
 
                        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"];
                        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\"
                                                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>";
                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 (executable)
index 0000000..babe43a
Binary files /dev/null and b/images/art-email.png differ
index 1645db96e213ffd7779b16bf4b565c80bb4acf74..55babdaa78b9fc9e42ecec9c17bd82766f7aff4e 100644 (file)
                        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>";
        }
 ?>
index 4d68fb9712fa8c758d4a793188255cb91c01efb4..fb19212917235f87cd1332e134c1634bf9a473c4 100644 (file)
 
                        print "<input size=\"40\"
                                        onkeypress=\"return filterCR(event, subscribeToFeed)\"
-                                       name=\"feed\" id=\"feed_url\"></td></tr>";
+                                       name=\"feed\" id=\"feed_url\">";
 
                        print "<br/>";
 
                        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 (file)
index 0000000..035ee5c
--- /dev/null
@@ -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 -->
index a6fef1e1f0a48dbad45c75cfc385fbaa051afe60..ba7bbe575b826f38beb90477e217cc7af733378a 100644 (file)
@@ -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;
 } */
+
+
index 1b8a1dab0b980ff166997cc01ca7f19b913be037..ac76be70bf2e190a303649c57a39f20caadef906 100644 (file)
@@ -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);
+       }
+}