add article forwarding by email (closes #271)
This commit is contained in:
parent
f0855b88af
commit
31a53903e6
|
@ -74,7 +74,8 @@
|
||||||
// Fetch favicons using CURL, useful if your PHP has disabled remote fopen()
|
// Fetch favicons using CURL, useful if your PHP has disabled remote fopen()
|
||||||
|
|
||||||
define('DIGEST_ENABLE', true);
|
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);
|
define('DIGEST_EMAIL_LIMIT', 10);
|
||||||
// The maximum amount of emails sent in one digest batch
|
// The maximum amount of emails sent in one digest batch
|
||||||
|
|
|
@ -4787,7 +4787,7 @@
|
||||||
|
|
||||||
print "<div class=\"postReply\">";
|
print "<div class=\"postReply\">";
|
||||||
|
|
||||||
print "<div class=\"postHeader\" onmouseover=\"enable_resize(true)\"
|
print "<div class=\"postHeader\" onmouseover=\"enable_resize(false)\"
|
||||||
onmouseout=\"enable_resize(false)\">";
|
onmouseout=\"enable_resize(false)\">";
|
||||||
|
|
||||||
$entry_author = $line["author"];
|
$entry_author = $line["author"];
|
||||||
|
@ -4819,7 +4819,7 @@
|
||||||
if (!$zoom_mode) {
|
if (!$zoom_mode) {
|
||||||
print "<span id=\"ATSTR-$id\">$tags_str</span>
|
print "<span id=\"ATSTR-$id\">$tags_str</span>
|
||||||
<a title=\"".__('Edit tags for this article')."\"
|
<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')."\"
|
print "<img src=\"".theme_image($link, 'images/art-zoom.png')."\"
|
||||||
class='tagsPic' style=\"cursor : pointer\" style=\"cursor : pointer\"
|
class='tagsPic' style=\"cursor : pointer\" style=\"cursor : pointer\"
|
||||||
|
@ -4833,6 +4833,13 @@
|
||||||
onclick=\"publishWithNote($id, '$note_escaped')\"
|
onclick=\"publishWithNote($id, '$note_escaped')\"
|
||||||
alt='PubNote' title='".__('Publish article with a note')."'>";
|
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 {
|
} else {
|
||||||
$tags_str = strip_tags($tags_str);
|
$tags_str = strip_tags($tags_str);
|
||||||
print "<span id=\"ATSTR-$id\">$tags_str</span>";
|
print "<span id=\"ATSTR-$id\">$tags_str</span>";
|
||||||
|
@ -6838,4 +6845,14 @@
|
||||||
print "<disable-cache value=\"1\"/>";
|
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);
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
|
@ -1019,6 +1019,81 @@
|
||||||
return;
|
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>";
|
print "<rpc-reply><error>Unknown method: $subop</error></rpc-reply>";
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -279,7 +279,7 @@
|
||||||
|
|
||||||
print "<input size=\"40\"
|
print "<input size=\"40\"
|
||||||
onkeypress=\"return filterCR(event, subscribeToFeed)\"
|
onkeypress=\"return filterCR(event, subscribeToFeed)\"
|
||||||
name=\"feed\" id=\"feed_url\"></td></tr>";
|
name=\"feed\" id=\"feed_url\">";
|
||||||
|
|
||||||
print "<br/>";
|
print "<br/>";
|
||||||
|
|
||||||
|
@ -666,47 +666,113 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if ($id == "offlineDownload") {
|
if ($id == "emailArticle") {
|
||||||
print "<div id=\"infoBoxTitle\">".__('Download articles')."</div>";
|
|
||||||
|
print "<div id=\"infoBoxTitle\">".__('Forward article by email')."</div>";
|
||||||
print "<div class=\"infoBoxContents\">";
|
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(
|
print "<input type=\"hidden\" name=\"secretkey\" value=\"$secretkey\">";
|
||||||
50 => 50,
|
print "<input type=\"hidden\" name=\"op\" value=\"rpc\">";
|
||||||
100 => 100,
|
print "<input type=\"hidden\" name=\"subop\" value=\"sendEmail\">";
|
||||||
250 => 250,
|
|
||||||
500 => 500);
|
|
||||||
|
|
||||||
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'>";
|
$result = db_query($link, "SELECT link, content, title
|
||||||
print "<label for='unread_only'>".__('Only include unread articles')."</label>";
|
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 "</form>";
|
||||||
|
|
||||||
print "<div class=\"dlgButtons\">
|
print "<div class='dlgButtons'>";
|
||||||
<input class=\"button\"
|
|
||||||
type=\"submit\" onclick=\"return initiate_offline_download(0, this)\" value=\"".__('Download')."\">
|
print "<button onclick=\"return emailArticleDo()\">".__('Send e-mail')."</button> ";
|
||||||
<input class=\"button\"
|
print "<button onclick=\"return closeInfoBox()\">".__('Cancel')."</button>";
|
||||||
type=\"submit\" onclick=\"return closeInfoBox()\"
|
|
||||||
value=\"".__('Cancel')."\"></div>";
|
|
||||||
|
|
||||||
print "</div>";
|
print "</div>";
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} */
|
}
|
||||||
|
|
||||||
|
|
||||||
print "<div id='infoBoxTitle'>Internal Error</div>
|
print "<div id='infoBoxTitle'>Internal Error</div>
|
||||||
<div id='infoBoxContents'>
|
<div id='infoBoxContents'>
|
||||||
|
|
|
@ -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 -->
|
|
@ -34,7 +34,7 @@ div.postReply div.postHeader {
|
||||||
background-color : #f9faff;
|
background-color : #f9faff;
|
||||||
margin : 0px 1px 0px 0px;
|
margin : 0px 1px 0px 0px;
|
||||||
padding : 5px;
|
padding : 5px;
|
||||||
cursor : move;
|
/* cursor : move; */
|
||||||
color : #909090;
|
color : #909090;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2001,3 +2001,5 @@ button[disabled] {
|
||||||
color : #dedede;
|
color : #dedede;
|
||||||
border : 1px solid #dedede;
|
border : 1px solid #dedede;
|
||||||
} */
|
} */
|
||||||
|
|
||||||
|
|
||||||
|
|
60
viewfeed.js
60
viewfeed.js
|
@ -2262,3 +2262,63 @@ function publishWithNote(id, def_note) {
|
||||||
exception_error("publishWithNote", e);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue