From 723c5b97d37125a4020670807fc1569918d37276 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 28 Mar 2012 16:40:10 -0400 Subject: [PATCH] changemail: New plugin, sends emails about changed pages. --- IkiWiki/Plugin/changemail.pm | 91 ++++++++++++++++++++++++++++++++++++ debian/changelog | 1 + doc/plugins/changeemail.mdwn | 12 +++++ doc/templates.mdwn | 3 ++ templates/changeemail.tmpl | 9 ++++ 5 files changed, 116 insertions(+) create mode 100644 IkiWiki/Plugin/changemail.pm create mode 100644 doc/plugins/changeemail.mdwn create mode 100644 templates/changeemail.tmpl diff --git a/IkiWiki/Plugin/changemail.pm b/IkiWiki/Plugin/changemail.pm new file mode 100644 index 000000000..d0b7b8dbe --- /dev/null +++ b/IkiWiki/Plugin/changemail.pm @@ -0,0 +1,91 @@ +#!/usr/bin/perl +package IkiWiki::Plugin::changemail; + +use warnings; +use strict; +use IkiWiki 3.00; + +sub import { + hook(type => "getsetup", id => "changemail", call => \&getsetup); + hook(type => "change", id => "changemail", call => \¬ify); +} + +sub getsetup () { + return + plugin => { + safe => 1, + rebuild => 0, + section => "misc", + }, +} + +sub notify (@) { + my @files=@_; + return unless @files; + + eval q{use Mail::Sendmail}; + error $@ if $@; + eval q{use IkiWiki::UserInfo}; + + # Daemonize, in case the mail sending takes a while. + defined(my $pid = fork) or error("Can't fork: $!"); + return if $pid; # parent + chdir '/'; + open STDIN, '/dev/null'; + open STDOUT, '>/dev/null'; + POSIX::setsid() or error("Can't start a new session: $!"); + open STDERR, '>&STDOUT' or error("Can't dup stdout: $!"); + + # Don't need to keep a lock on the wiki as a daemon. + IkiWiki::unlockwiki(); + + my $userinfo=IkiWiki::userinfo_retrieve(); + exit 0 unless defined $userinfo; + + foreach my $user (keys %$userinfo) { + my $pagespec=$userinfo->{$user}->{"subscriptions"}; + next unless defined $pagespec && length $pagespec; + my $email=$userinfo->{$user}->{email}; + next unless defined $email && length $email; + + foreach my $file (@files) { + my $page=pagename($file); + next unless pagespec_match($page, $pagespec); + my $ispage=defined pagetype($file); + my $url; + if (! IkiWiki::isinternal($page)) { + $url=urlto($page, undef, 1); + } + elsif (defined $pagestate{$page}{meta}{permalink}) { + # need to use permalink for an internal page + $url=$pagestate{$page}{meta}{permalink}; + } + else { + $url=$config{wikiurl}; # crummy fallback url + } + my $template=template("changemail.tmpl"); + $template->param( + wikiname => $config{wikiname}, + url => $url, + prefsurl => IkiWiki::cgiurl(do => "prefs"), + ispage => $ispage, + content => $ispage ? readfile(srcfile($file)) : "", + ); + #translators: The two variables are the name of the wiki, + #translators: and a page that was changed. + #translators: This is used as the subject of a commit email. + my $subject=sprintf(gettext("%s: change notification for %s"), + $config{wikiname}, $page); + sendmail( + To => $email, + From => "$config{wikiname} <$config{adminemail}>", + Subject => $subject, + Message => $template->output, + ); + } + } + + exit 0; # daemon child +} + +1 diff --git a/debian/changelog b/debian/changelog index f51f77cd7..90e619cd1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,6 +5,7 @@ ikiwiki (3.20120204) UNRELEASED; urgency=low them. * meta: Export author information in html tag. Closes: #664779 Thanks, Martin Michlmayr + * changemail: New plugin, sends emails about changed pages. -- Joey Hess Wed, 21 Mar 2012 14:33:14 -0400 diff --git a/doc/plugins/changeemail.mdwn b/doc/plugins/changeemail.mdwn new file mode 100644 index 000000000..f37d0f5ad --- /dev/null +++ b/doc/plugins/changeemail.mdwn @@ -0,0 +1,12 @@ +This plugin allows emailing users when pages are created or changed. +It needs the [[!cpan Mail::SendMail]] perl module, and sends mail +using the local MTA. + +Each user can configure which pages they are interested in, using an +[[ikiwiki/PageSpec]] on their Preferences page. Any change to a page +matching the pagespec will send an email that includes the new content of +the page, and a link to the page on the web. + +To make it easy to subscribe to comment threads when posting a comment, +there is a check box that can be used to subscribe, without needing to +manually edit the [[ikiwiki/PageSpec]]. diff --git a/doc/templates.mdwn b/doc/templates.mdwn index 43bf9ee51..ca3f1412a 100644 --- a/doc/templates.mdwn +++ b/doc/templates.mdwn @@ -82,10 +82,13 @@ Here is a full list of the template files used: make calendar archive pages. * `trails.tmpl` - Used by the trail plugin to generate links on each page that is a member of a trail. +* `changemail.tmpl` - Used by the changemail plugin to generate mails about + changed pages. * `editpage.tmpl`, `editconflict.tmpl`, `editcreationconflict.tmpl`, `editfailedsave.tmpl`, `editpagegone.tmpl`, `pocreatepage.tmpl`, `editcomment.tmpl` `commentmoderation.tmpl`, `renamesummary.tmpl`, `passwordmail.tmpl`, `openid-selector.tmpl`, `revert.tmpl` - Parts of ikiwiki's user interface; do not normally need to be customised. + [[!meta robots="noindex, follow"]] diff --git a/templates/changeemail.tmpl b/templates/changeemail.tmpl new file mode 100644 index 000000000..c73bf92d3 --- /dev/null +++ b/templates/changeemail.tmpl @@ -0,0 +1,9 @@ +A change has been made to + +To stop these notifications, visit + + +---- + + + -- 2.26.2