package RWDE::PostMaster;
use strict;
use warnings;
use base qw( RWDE::Singleton );
use Template;
use Net::SMTP;
use RWDE::Configuration;
my $unique_instance;
sub get_instance {
my ($self, $params) = @_;
if (ref $unique_instance ne $self) {
$unique_instance = $self->new;
}
return $unique_instance;
}
sub initialize {
my ($self, $params) = @_;
$self->{server} = RWDE::Configuration->get_SMTP();
# create template object for future use
$self->{template} = Template->new(
{
TAG_STYLE => 'asp',
PROCESS => 'message.tt',
INCLUDE_PATH => RWDE::Configuration->get_root . '/templates/emailmessages',
VARIABLES => {
commify => \&RWDE::Utility::commify,
global => RWDE::Configuration->get_instance,
},
}
) or throw RWDE::DevelException({ info => 'Template::new failure.' });
return ();
}
=pod
=head2 send_message ($smtp_sender, $smtp_recipient, $template)
Prepare or send a 1-to-1 message to the $smtp_recipient address, from $smtp_sender address, using $template as a template input
and the $params to populate the template. To alter the header from/to etc, edit the template.
=cut
sub send_message {
my ($self, $params) = @_;
my @required = qw( smtp_sender smtp_recipient template );
RWDE::DB::Record->check_params({ required => \@required, supplied => $params });
# Process the message thru the Template
my $output;
my $postmaster = RWDE::PostMaster->get_instance();
my $template = $postmaster->{template};
unless ($template->process($$params{template}, $params, \$output)) {
throw RWDE::DevelException({ info => $template->error() });
}
my $mh = new Net::SMTP($postmaster->{server})
or throw RWDE::DevelException({ info => 'PostMaster::CONNECT failure ' . $postmaster->{server} });
$mh->mail($$params{smtp_sender})
or throw RWDE::DevelException({ info => 'PostMaster::SMTP FROM failure: ' . $postmaster->{server} . '::' . $mh->message() });
$mh->recipient($$params{smtp_recipient})
or throw RWDE::DevelException({ info => 'PostMaster::SMTP TO failure: ' . $postmaster->{server} . '::' . $mh->message() . ' for: ' . $$params{smtp_recipient} });
$mh->data()
or throw RWDE::DevelException({ info => 'PostMaster::DATA failure: ' . $postmaster->{server} . '::' . $mh->message() });
$mh->datasend("Errors-To:$$params{smtp_sender}\n")
or throw RWDE::DevelException({ info => 'PostMaster::DATASEND failure: ' . $postmaster->{server} . '::' . $mh->message() });
$mh->datasend($output)
or throw RWDE::DevelException({ info => 'PostMaster::DATASEND failure: ' . $postmaster->{server} . '::' . $mh->message() });
$mh->dataend()
or throw RWDE::DevelException({ info => 'PostMaster::DATA END failure, message NOT sent: ' . $postmaster->{server} . '::' . $mh->message() });
$mh->quit();
return ();
}
sub send_verp_message {
my ($self, $params) = @_;
my @failed;
my @required = qw( smtp_sender recipients template);
RWDE::DB::Record->check_params({ required => \@required, supplied => $params });
my $postmaster = RWDE::PostMaster->get_instance();
my @recipients = @{ $$params{recipients} };
if (!(@recipients > 0)) {
return;
}
# Process the message through the Template
my $output;
my $template = $postmaster->{template};
unless ($template->process($$params{template}, $params, \$output)) {
throw RWDE::DevelException({ info => $template->error() });
}
my $mh = new Net::SMTP($postmaster->{server})
or throw RWDE::DevelException({ info => 'PostMaster::CONNECT failure' });
#Limit to 1000 recipients per connection
# if we get more, just bucketize them
$mh->mail($$params{smtp_sender}, XVERP => 1)
or throw RWDE::DevelException({ info => 'PostMaster::SMTP XVERP failure: ' . $mh->message() });
my @good_recipients = $mh->recipient(@recipients, { SkipBad => 1 }) or ();
$mh->data()
or throw RWDE::DevelException({ info => 'PostMaster::DATA failure: ' . $mh->message() });
$mh->datasend($output)
or throw RWDE::DevelException({ info => 'PostMaster::DATASEND failure: ' . $mh->message() });
$mh->dataend()
or throw RWDE::DevelException({ info => 'DATA END failure, message NOT sent: ' . $postmaster->{server} . '::' . $mh->message() });
$mh->quit();
return \@good_recipients;
}
sub send_support_message {
my ($self, $params) = @_;
my $topic = $$params{topic}
or throw RWDE::DataBadException({ info => 'No topic selected. Please select a topic so we can route your message properly' });
my $question = $$params{question}
or throw RWDE::DataBadException({ info => 'Sorry, we didn\'t receive your message. Please try sending it again.' });
$self->send_message(
{
smtp_sender => RWDE::Configuration->Sender,
smtp_recipient => RWDE::Configuration->$topic,
template => 'support.tt',
#-- template params
params => $params,
}
);
return ();
}
sub send_report_message {
my ($self, $params) = @_;
$$params{smtp_sender} = RWDE::Configuration->Sender;
$$params{smtp_recipient} = RWDE::Configuration->ErrorReport;
$$params{template} = 'report.tt';
$self->send_message($params);
return ();
}
1;