218 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/perl -wT
 | |
| #
 | |
| # TWiki Collaboration Platform, http://TWiki.org/
 | |
| #
 | |
| # Copyright (C) 1999-2003 Peter Thoeny, peter@thoeny.com
 | |
| #
 | |
| # For licensing info read license.txt file in the TWiki root.
 | |
| # This program is free software; you can redistribute it and/or
 | |
| # modify it under the terms of the GNU General Public License
 | |
| # as published by the Free Software Foundation; either version 2
 | |
| # of the License, or (at your option) any later version.
 | |
| #
 | |
| # This program is distributed in the hope that it will be useful,
 | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| # GNU General Public License for more details, published at 
 | |
| # http://www.gnu.org/copyleft/gpl.html
 | |
| 
 | |
| # Colas (http://colas.nahaboo.net)
 | |
| # modifications from mailnotify script from Dec 2001 release:
 | |
| # - email is now optional, is fetched from the user homepage
 | |
| # - webs not beginning by a capital letter are ignored ( _default, ...)
 | |
| # - no mail is sent to TWikiGuest
 | |
| # - if user is a group, recurses through its members
 | |
| 
 | |
| # Set library paths in @INC, at compile time
 | |
| BEGIN { unshift @INC, '.'; require 'setlib.cfg'; }
 | |
| 
 | |
| use TWiki;
 | |
| use TWiki::Net;
 | |
| 
 | |
| my $debug = ! ( @ARGV && $ARGV[0] eq "-q" );
 | |
| 
 | |
| &main();
 | |
| 
 | |
| sub main
 | |
| {
 | |
|     &TWiki::basicInitialize();
 | |
| 
 | |
|     $debug && print "TWiki mail notification\n";
 | |
|     $debug && print "- to suppress all normal output: mailnotify -q\n";
 | |
| 
 | |
|     my $dataDir = &TWiki::getDataDir();
 | |
|     opendir( DIR, "$dataDir" ) or die "could not open $dataDir";
 | |
|     @weblist = grep !/^\.\.?$/, readdir DIR;
 | |
|     closedir DIR;
 | |
|     foreach $web ( @weblist ) {
 | |
| 	# Only process webs with normal names, i.e. not starting with '_'
 | |
|         if( -d "$dataDir/$web" && &TWiki::isWebName($web) ) {
 | |
|              processWeb( $web );
 | |
| 
 | |
|              # remove obsolete .lock files
 | |
|              &TWiki::Store::removeObsoleteTopicLocks( $web );
 | |
|         }
 | |
|     }
 | |
|     $debug && print "End TWiki mail notification\n";
 | |
| }
 | |
| 
 | |
| sub processWeb
 | |
| {
 | |
|     my( $web) = @_;
 | |
| 
 | |
|     my ( $topic, $webName, $dummy, $userName, $dataDir) = 
 | |
| 	&TWiki::initialize( "/$web", "nobody" );
 | |
|     $dummy = "";  # to suppress warning
 | |
| 
 | |
|     $debug && print "Checking TWiki.$webName\n";
 | |
| 
 | |
|     if( ! &TWiki::Store::webExists( $webName ) ) {
 | |
| 	print STDERR "* ERROR: TWiki mailnotify does not find web $webName\n";
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     my @notifylist = TWiki::getEmailNotifyList($webName);
 | |
|     unless ( scalar @notifylist ) {
 | |
| 	$debug && print "<none>\n";
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     my $emailbody = "";
 | |
|     my $topiclist = "";
 | |
| 
 | |
|     my $skin = TWiki::Prefs::getPreferencesValue( "SKIN" );
 | |
|     my $text = TWiki::Store::readTemplate( "changes", $skin );
 | |
|     my $changes= &TWiki::Store::readFile( "$dataDir/$webName/.changes" );
 | |
| 
 | |
|     my %exclude;
 | |
| 
 | |
|     $text = &TWiki::handleCommonTags($text, $topic);
 | |
|     $text =~ s/\%META{.*?}\%//go;  # remove %META{"parent"}%
 | |
| 
 | |
|     if( $TWiki::doRemoveImgInMailnotify ) {
 | |
|         # change images to [alt] text if there, else remove image
 | |
|         $text =~ s/<img src=.*?alt=\"([^\"]+)[^>]*>/[$1]/goi;
 | |
|         $text =~ s/<img src=.*?[^>]>//goi;
 | |
|     }
 | |
| 
 | |
|     my $before = "";
 | |
|     my $after = "";
 | |
|     ( $before, $text, $after) = split( /%REPEAT%/, $text );
 | |
|     $emailbody = &TWiki::getRenderedVersion( $before );
 | |
|     $after = &TWiki::getRenderedVersion( $after );
 | |
| 
 | |
|     my $prevLastmodify = &TWiki::Store::readFile( "$dataDir/$webName/.mailnotify" ) || "0";
 | |
|     my $currLastmodify = "";
 | |
|     my $scriptSuffix = $TWiki::scriptSuffix;
 | |
|     my $scriptUrlPath = $TWiki::scriptUrlPath;
 | |
|     my $scriptUrl = "$TWiki::urlHost$scriptUrlPath";
 | |
|     my $frev = "";
 | |
| 
 | |
|     foreach( reverse split( /\n/, $changes ) ) {
 | |
| 	# Parse lines from .changes:
 | |
| 	# <topic>	<user>		<change time>	<revision>
 | |
| 	# WebHome	FredBloggs	1014591347	21
 | |
| 
 | |
| 	my ($topicName, $userName, $changeTime, $revision) = split( /\t/);
 | |
| 	$newText = $text;		# Repeating text from email template
 | |
| 
 | |
| 	if( ( ! %exclude ) || ( ! $exclude{ $topicName } ) ) {
 | |
|             next unless TWiki::Store::topicExists( $webName, $topicName );
 | |
| 
 | |
| 	    if( ! $currLastmodify ) {
 | |
| 	        # newest entry
 | |
| 	        $time = &TWiki::formatGmTime( $prevLastmodify );
 | |
| 	        if( $prevLastmodify eq $changeTime ) {
 | |
| 	            # newest entry is same as at time of previous notification
 | |
| 	            $debug && print "- Note: No topics changed since $time\n";
 | |
| 	            return;
 | |
| 	        }
 | |
| 	        $currLastmodify = $changeTime;
 | |
| 	        $debug && print "- Changed topics since $time: ";
 | |
| 	    }
 | |
| 
 | |
| 	    if( $prevLastmodify >= $changeTime ) {
 | |
| 	        #print "Date: found item of last notification\n";
 | |
| 	        # found item of last notification
 | |
| 	        last;
 | |
| 	    }
 | |
|             $frev = "";
 | |
|             if( $revision ) {
 | |
|                 if( $revision > 1 ) {
 | |
|                     $frev = "r1.$revision";
 | |
|                 } else {
 | |
|                     $frev = "<b>NEW</b>";
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 	    # Create entry in HTML attachment
 | |
| 	    $newText = $text;
 | |
| 	    $newText =~ s/%TOPICNAME%/$topicName/go;
 | |
| 	    $wikiuser = &TWiki::userToWikiName( $userName );
 | |
| 
 | |
| 	    $newText =~ s/%AUTHOR%/$wikiuser/go;
 | |
|             $newText =~ s/%LOCKED%//go;
 | |
| 	    $time = &TWiki::formatGmTime( $changeTime );
 | |
|             $newText =~ s/%TIME%/$time/go;
 | |
|             $newText =~ s/%REVISION%/$frev/go;
 | |
| 	    $newText = &TWiki::getRenderedVersion( $newText );
 | |
| 
 | |
|             $head = &TWiki::Store::readFileHead( "$dataDir\/$webName\/$topicName.txt", 16 );
 | |
|             $head = &TWiki::makeTopicSummary( $head, $topicName, $webName );
 | |
|             $newText =~ s/%TEXTHEAD%/$head/go;
 | |
| 
 | |
| 	    $emailbody .= $newText;
 | |
| 	    $exclude{ $topicName } = "1";
 | |
| 
 | |
| 	    $debug && print "$topicName ";
 | |
| 
 | |
| 	    # URL-encode topic names for use of I18N topic names in plain text
 | |
| 	    $webNameEnc = TWiki::handleUrlEncode( $webName );
 | |
| 	    my $topicNameEnc = TWiki::handleUrlEncode( $topicName );
 | |
| 
 | |
| 	    # Create entry in plain-text email body
 | |
| 	    $newText = "- $topicName  ($wikiuser)\n  $scriptUrl/view$scriptSuffix/$webNameEnc/$topicNameEnc\n";
 | |
|             $newText =~ s/Main\.//go;
 | |
| 	    $topiclist = "$topiclist$newText";
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if( $topiclist eq "" ) {
 | |
| 	$debug && print "- Note: Topic list is empty\n";
 | |
| 	return;
 | |
|     }
 | |
|     $debug && print "\n";
 | |
| 
 | |
|     $emailbody .= $after;
 | |
| 
 | |
|     my $from = &TWiki::Prefs::getPreferencesValue("WIKIWEBMASTER");
 | |
| 
 | |
|     my $notifylist = join ', ', @notifylist;
 | |
| 
 | |
|     $text = &TWiki::Store::readTemplate( "mailnotify", $skin );
 | |
|     $text =~ s/%EMAILFROM%/$from/go;
 | |
|     $text =~ s/%EMAILTO%/$notifylist/go;
 | |
|     $text =~ s/%EMAILBODY%/$emailbody/go;
 | |
|     $text =~ s/%TOPICLIST%/$topiclist/go;
 | |
|     $text =~ s/%LASTDATE%/&TWiki::formatGmTime($prevLastmodify)/geo;
 | |
|     $text = &TWiki::handleCommonTags( $text, $topic );
 | |
| 
 | |
|     # change absolute addresses to relative ones & do some cleanup
 | |
|     $text =~ s/(href=\")$scriptUrlPath/$1..\/../goi;
 | |
|     $text =~ s/(action=\")$scriptUrlPath/$1..\/../goi;
 | |
|     $text =~ s|( ?) *</*nop/*>\n?|$1|gois;
 | |
| 
 | |
|     $debug && print "- Sending mail notification to: $notifylist\n";
 | |
| 
 | |
|     my $error = &TWiki::Net::sendEmail( $text );
 | |
|     if( $error ) {
 | |
| 	print STDERR "* $error\n";
 | |
|         $debug && print "- End TWiki.$webName\n";
 | |
| 
 | |
|     } else {
 | |
|         &TWiki::Store::saveFile( "$dataDir/$webName/.mailnotify", $currLastmodify );
 | |
| 
 | |
| 	$debug && print "- End TWiki.$webName, mail notification sent\n";
 | |
|     }
 | |
| }
 | |
| 
 |