# -*- perl -*-
#
# HTML::EP - A Perl based HTML extension.
#
#
# Copyright (C) 1998 Jochen Wiedmann
# Am Eisteich 9
# 72555 Metzingen
# Germany
#
# Phone: +49 7123 14887
# Email: joe@ispsoft.de
#
# All rights reserved.
#
# You may distribute this module under the terms of either
# the GNU General Public License or the Artistic License, as
# specified in the Perl README file.
#
############################################################################
require 5.004;
use strict;
use HTML::EP ();
use HTML::EP::Locale ();
use Mail::POP3Client ();
package HTML::EP::Examples::POP3Client;
$HTML::EP::Examples::POP3Client::VERSION = '0.01';
@HTML::EP::Examples::POP3Client::ISA = qw(HTML::EP::Locale HTML::EP);
sub _init {
my $self = shift; my $attr = shift;
my $debug = $self->{'debug'};
my $cgi = $self->{'cgi'};
my $server = $self->{'pop3server'} =
($attr->{'pop3server'} or $cgi->param('pop3server'))
or die "Missing POP3 server";
my $user = $self->{'pop3user'} =
($attr->{'pop3user'} or $cgi->param('pop3user'))
or die "Missing POP3 user";
my $password = $self->{'pop3password'} =
($attr->{'pop3password'} or $cgi->param('pop3password'))
or die "Missing POP3 password";
my $port;
if ($server =~ /(.*)\:(.*)/) {
$server = $1;
$port = $2;
}
my @args = ($user, $password, $server);
push(@args, $port) if defined($port) or $debug;
push(@args, 1) if $debug;
$self->printf("Connecting to server %s, port %s as user %s\n",
$server, ($port || 110), $user) if $debug;
Mail::POP3Client->new(@args) or die "Failed to connect: $!";
}
sub _ep_examples_pop3client_list {
my $self = shift; my $attr = shift;
my $pop = $self->_init($attr);
my $cgi = $self->{'cgi'};
my $start = $self->{'start'} = $cgi->param('start') || 0;
my $max = $self->{'max'} = $attr->{'max'} || $cgi->param('max') || 20;
my $debug = $self->{'debug'};
my @sizes = map { $_ =~ s/^\d+\s+//; $_ } $pop->List();
my @list;
$self->{'count'} = $pop->Count();
$self->{'next'} = $start+$max if $start+$max < $self->{'count'};
$self->{'prev'} = $start-$max if $start>0;
for (my $i = $start; $i < $pop->Count() && $i < $start+$max; $i++) {
my($subject, $from, $id, $date);
foreach my $head ($pop->Head($i+1)) {
if ($head =~ /^\s*subject\:\s*(.*?)\s*$/i) {
$subject = $1;
} elsif ($head =~ /^\s*reply-to\:\s*(.*?)\s*$/i) {
$from = $1;
} elsif ($head =~ /^\s*from\:\s*(.*?)\s*$/i) {
$from = $1 unless $from;
} elsif ($head =~ /^\s*message-id\:\s*(.*?)\s*$/i) {
$id = $1;
} elsif ($head =~ /^\s*date\:\s*(.*?)\s*$/i) {
$date = $1;
}
}
my $mail = {'from' => ($from || ''),
'subject' => ($subject || ''),
'size' => $sizes[$i],
'nr' => $i+1,
'i' => $i,
'date' => $date,
'id' => $id};
$self->print("Found mail: ", %$mail, "\n") if $debug;
push(@list, $mail);
}
$self->{'list'} = \@list;
$self->{'list_num'} = @list;
$self->print("$self->{'list_num'} items have been found.\n") if $debug;
'';
}
sub _ep_examples_pop3client_delete {
my $self = shift; my $attr = shift;
my $pop = $self->_init($attr);
my $cgi = $self->{'cgi'};
my $debug = $self->{'debug'};
my $count = $self->{'count'} = $pop->Count();
my $id = $cgi->param('id') or die "Missing Message ID";
my $i = $cgi->param('i');
# Verify the message ID
foreach my $head ($pop->Head($i+1)) {
if ($head =~ /^\s*message-id\:\s*(.*?)\s*$/i) {
die "Mailfolder out of sync. Please reload folder."
unless ($1 eq $id);
$pop->Delete($i+1);
$pop->Close();
if ($i >= $self->{'count'} and $i > 0) {
--$i;
}
my $max = $self->{'max'} =
$attr->{'max'} || $cgi->param('max') || 20;
$self->{'start'} = ($i % $max);
return '';
}
}
die "Cannot delete message without Message-ID";
}
sub _ep_examples_pop3client_show {
my $self = shift; my $attr = shift;
my $pop = $self->_init($attr);
my $cgi = $self->{'cgi'};
my $debug = $self->{'debug'};
$self->{'count'} = $pop->Count();
my $id = $cgi->param('id') or die "Missing Message ID";
my $i = $cgi->param('i');
if ($cgi->param('back')) {
die "No previous mails" if --$i < 0;
$id = 'any';
} elsif ($cgi->param('next')) {
die "No further mails" if ++$i >= $self->{'count'};
$id = 'any';
}
$self->{'num'} = $i+1;
$self->{'i'} = $i;
$self->{'id'} = $id;
die "Missing Message number" if !defined($i) || $i !~ /^\s*\d+\s*$/;
my($subject, $from, $date);
my @headers;
foreach my $head ($pop->Head($i+1)) {
push(@headers, $head);
if ($head =~ /^\s*subject\:\s*(.*?)\s*$/i) {
$subject = $1;
} elsif ($head =~ /^\s*reply-to\:\s*(.*?)\s*$/i) {
$from = $1;
} elsif ($head =~ /^\s*from\:\s*(.*?)\s*$/i) {
$from = $1 unless $from;
} elsif ($head =~ /^\s*date\:\s*(.*?)\s*$/i) {
$date = $1;
} elsif ($head =~ /^\s*message-id\:\s*(.*?)\s*$/i) {
die "Mailfolder out of sync. Please reload folder."
unless ($id eq 'any' or $1 eq $id);
$self->{'id'} = $1;
}
}
$self->{'body'} = join("\n", $pop->Body($i+1));
$self->{'headers'} = join("\n", @headers);
$self->{'from'} = $from;
$self->{'date'} = $date;
$self->{'subject'} = $subject;
'';
}
sub _ep_examples_pop3client_reply {
my $self = shift; my $attr = shift;
my $pop = $self->_init($attr);
my $cgi = $self->{'cgi'};
my $debug = $self->{'debug'};
my $count = $self->{'count'} = $pop->Count();
my $id = $cgi->param('id') or die "Missing Message ID";
my $i = $cgi->param('i');
# Verify the message ID
my($subject, $date, $from, $to, $cc);
foreach my $head ($pop->Head($i+1)) {
if ($head =~ /^message-id\:\s*(.*?)\s*$/i) {
die "Mailfolder out of sync. Please reload folder."
unless ($1 eq $id);
} elsif ($head =~ /^reply-to\:\s*(.*?)\s*$/i) {
$from = $1;
} elsif ($head =~ /^from\:\s*(.*?)\s*$/i) {
$from = $1 unless $from;
} elsif ($head =~ /^date\:\s*(.*?)\s*$/i) {
$date = $1;
} elsif ($head =~ /^to\:\s*(.*?)\s*$/i) {
$to = $1;
} elsif ($head =~ /^cc\:\s*(.*?)\s*$/i) {
$cc = $1;
} elsif ($head =~ /^subject\:\s*(.*?)\s*$/i) {
$subject = $1;
}
}
$self->{'date'} = $date;
$self->{'from'} = $from;
$self->{'to'} = $to;
$self->{'cc'} = $cc ? $to : "$to, $cc";
$subject =~ s/^(re|aw)\:\s+// if $subject;
$self->{'subject'} = "Re: $subject";
my $indent = $attr->{'indent'} || "> ";
$self->{'body'} = join("\n", map{ "$indent$_" } $pop->Body($i+1));
'';
}
sub _format_HNBSP {
my $self = shift; my $str = shift;
return ' ' if !defined($str) || $str eq '';
$self->escapeHTML($str);
}
sub _format_BR {
my $self = shift; my $str = shift;
return '' unless defined($str);
join("
\n",
map { $self->escapeHTML($_) } split(/\r?\n/s, $str));
}
1;