#!/usr/bin/env perl
#---------------------------------------------
# rss2mail.pl
# see pod documentation at the end
#
#---------------------------------------------

# $Id: $

use strict;
use warnings;
use Digest::MD5  ();
use Getopt::Long ();
use HTTP::Date   ();
use LWP::Simple  ();
use MIME::Lite   ();
use XML::RSSLite ();

sub get_page
{
    my $url = $_[0];
    return LWP::Simple::get($url);
}

sub prepare_mail_body
{
    my($feed, $news) = @_;
    my $chn = $feed->{channel};
    my $text = <<HTML;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<link rel="StyleSheet" href="http://www.perl.it/css/general.css" type="text/css">
<link rel="StyleSheet" href="http://www.perl.it/css/widgets.css" type="text/css">
<meta HTTP-EQUIV="Content-Type" content="text/html;charset=iso-8859-1">
<meta name="description" content="Perl.it - Il punto di riferimento di Perl in Italia">
<meta name="keywords" content="Perl programmazione">
<meta name="rating" content="general">
<meta name="robot" content="index,follow">
</head>
<body>

<div id="header">
<a href="http://www.perl.it" target="_self"><img src="http://www.perl.it/img/gui/perlitLogo.gif" width="149" height="39" alt="Perl.it Web Site"></a><a name="top"></a>
</div>

<div id="centercontent">
<h3>Novit&agrave; dal canale <a href="$$chn{link}">$$chn{title}</a>, $$chn{description}</h3>

<ol>
HTML

    # For each item, add a <LI> tag
    for my $item (@$news)
    {
        $text .= '<li> [' . $item->{'dc:subject'} . '] <a href="' . $item->{link} . '">' . $item->{title} . '</a> di <b>' . $item->{'dc:creator'} . '</b> del ' . localtime(HTTP::Date::str2time($item->{'dc:date'})) . "<br/>\n" .
                 '<blockquote>' . $item->{description} . "<br/>\n" .
                 '<p>URL: <a href="' . $item->{link} . '">' . $item->{title} . '</a> - <code><a href="' . $item->{link} . '">' . $item->{link} . '</a></code></p>' .
                 '</blockquote></li>' . "\n";
    }

    # Close html document
    $text .= '</div></ol></body></html>';

    return($text);
}

sub read_rss
{
    my $feed = $_[0];
    my %result;
    XML::RSSLite::parseRSS(\%result, \$feed);
    return(%result);
}

sub send_email
{
    my($from, $rcpt, $subj, $text) = @_;
    MIME::Lite->send('smtp', 'mail.ebravo.it', Timeout=>30);
    my $msg = MIME::Lite->new(
        From     => $from,
        To       => $rcpt,
        Subject  => $subj,
        Type     =>'text/html',
        Data     => $text,
    );
    $msg->send();
}

Getopt::Long::GetOptions(
    'url:s'    => \my $url,
    'from:s'   => \my $from,
    'rcpt:s'   => \my $rcpt,
    'subject:s'=> \my $subj,
) or exit(1);

$url  ||= 'http://www.perl.it/blog/digest.rdf';
$from ||= 'Cosimo Streppone <cosimo@streppone.it>';
$rcpt ||= 'Cosimo Streppone <cosimo@streppone.it>';
$subj ||= '[TEST] Perl.it blog news';

my %feed;
my @news;
my $content;
my $text;

# Get url or exit with status 2
exit(2) unless $content = get_page($url);

# Parse RSS feed
%feed = read_rss($content);

# Check if we have posts to show
if( $feed{item} && ref($feed{item}) eq 'ARRAY')
{
    @news = @{$feed{item}};
}

# No news, no party... :-)
if( ! @news )
{
    print 'No news...', "\n";
    exit(3);
}

# Prepare email to be sent
$text = prepare_mail_body(\%feed, \@news);

send_email( $from, $rcpt, $subj, $text );

#
# End of script

=pod

=head1 NAME

rss2mail.pl

=head1 DESCRIPTION

A simple script that downloads an RSS/RDF file, parses it and
sends an email message with the RSS feed summary.

The template of email is taken from http://www.perl.it site.

=head1 SYNOPSIS

./rss2mail.pl --url http://www.mysite.com/recent.rdf
              --from 'Myself <myself@mydomain.com>'
              --subject 'My news'
              --rcpt 'My Friends <friends@theirdomain.com>'

=head1 AUTHOR

Yes, the author of this awesome script is Cosimo :-)

=cut