use Time::Local;
use Text::Template;
use Getopt::Std;
+use Net::SMTP;
+use Mail::Header;
+use Mail::Internet;
use FS::Conf;
use FS::UID qw(adminsuidsetup);
use FS::Record qw(qsearch);
use FS::cust_main;
-use vars qw($smtpmachine);
+use vars qw($smtpmachine @body);
#hush, perl!
$FS::alerter::_template::first = "";
$FS::alerter::_template::expdate = "";
# Set the mail program and other variables
-my $mail_program = "/usr/sbin/sendmail -t -n";
-my $mail_sender = "billing\@mydomain.tld";
-my $default_mail_recipient = "postmaster";
+my $mail_sender = "billing\@mydomain.tld"; # or invoice_from if available
+my $failure_recipient = "postmaster"; # or invoice_from if available
my $warning_time = 30 * 24 * 60 * 60;
my $urgent_time = 15 * 24 * 60 * 60;
my $panic_time = 5 * 24 * 60 * 60;
# Get the needed configuration files
my $conf = new FS::Conf;
$smtpmachine = $conf->config('smtpmachine');
+$mail_sender = $conf->config('invoice_from')
+ if $conf->exists('invoice_from');
+$failure_recipient = $conf->config('invoice_from')
+ if $conf->exists('invoice_from');
+
my(@customers)=qsearch('cust_main',{});
if (scalar(@customers) == 0)
exit 1;
}
-# Open email pipe
-
-open (MAIL, "|$mail_program");
-print MAIL <<END
-To: $default_mail_recipient
-From: Account Processor
-Subject: Unnotified Billing Arrangement Expirations
-
+# Prepare for sending email
-END
-
-;
+$ENV{MAILADDRESS} = $mail_sender;
+my $header = new Mail::Header ( [
+ "From: Account Processor",
+ "To: $failure_recipient",
+ "Sender: $mail_sender",
+ "Reply-To: $mail_sender",
+ "Subject: Unnotified Billing Arrangement Expirations",
+] );
my @alerter_template = $conf->config('alerter_template')
or die "cannot load config file alerter_template";
# Now I can start looping
foreach my $customer (@customers)
{
+ my $paydate = $customer->getfield('paydate');
+ next if $paydate =~ /^\s*$/; #skip empty expiration dates
+
my $custnum = $customer->getfield('custnum');
my $first = $customer->getfield('first');
my $last = $customer->getfield('last');
my $company = $customer->getfield('company');
my $payby = $customer->getfield('payby');
my $payinfo = $customer->getfield('payinfo');
- my $paydate = $customer->getfield('paydate');
my $daytime = $customer->getfield('daytime');
my $night = $customer->getfield('night');
-
+
my ($payyear,$paymonth,$payday) = split (/-/,$paydate);
my $expire_time = timelocal(0,0,0,$payday,--$paymonth,$payyear);
#credit cards expire at the end of the month/year of their exp date
- if ($payby eq 'CARD') {
+ if ($payby eq 'CARD' || $payby eq 'DCRD') {
($paymonth < 11) ? $paymonth++ : ($paymonth=0, $payyear++);
$expire_time = timelocal(0,0,0,$payday,$paymonth,$payyear);
$expire_time--;
if (scalar(@packages) != 0) {
my @invoicing_list = $customer->invoicing_list;
if ( grep { $_ ne 'POST' } @invoicing_list ) {
- $ENV{SMTPHOSTS} = $smtpmachine;
- $ENV{MAILADDRESS} = $mail_sender;
my $header = new Mail::Header ( [
"From: $mail_sender",
"To: ". join(', ', grep { $_ ne 'POST' } @invoicing_list ),
$FS::alerter::_template::first = $first;
$FS::alerter::_template::last = $last;
$FS::alerter::_template::company = $company;
- if ($payby eq 'CARD') {
+ if ($payby eq 'CARD' || $payby eq 'DCRD') {
$FS::alerter::_template::payby = "credit card (" .
substr($payinfo, 0, 2) . "xxxxxxxxxx" .
substr($payinfo, -4) . ")";
'Header' => $header,
'Body' => [ $alerter->fill_in( PACKAGE => 'FS::alerter::_template' ) ],
);
- $message->smtpsend or die "Can't send invoice email!: $!"; #die? warn?
+ $!=0;
+ $message->smtpsend( Host => $smtpmachine )
+ or $message->smtpsend( Host => $smtpmachine, Debug => 1 )
+ or die "Can't send expiration email: $!";
} elsif ( ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list ) {
- printf(MAIL qq{%5d %-32.32s %4s %10s %12s %12s\n},
+ push @body, sprintf(qq{%5d %-32.32s %4s %10s %12s %12s},
$custnum,
$first . " " . $last . " " . $company,
$payby,
}
}
-# Now I need to close EMAIL
-close MAIL || die "Could not close printer: $default_mail_recipient\n";
-
+# Now I need to send EMAIL
+if (scalar(@body)) {
+ my $message = new Mail::Internet (
+ 'Header' => $header,
+ 'Body' => [ (@body) ],
+ );
+ $!=0;
+ $message->smtpsend( Host => $smtpmachine )
+ or $message->smtpsend( Host => $smtpmachine, Debug => 1 )
+ or die "can't send alerter failure email to $failure_recipient".
+ " via server $smtpmachine with SMTP: $!";
+}
# subroutines
sub untaint_argv {
user: From the mapsecrets file - see config.html from the base documentation
-=head1 VERSION
-
-$Id: freeside-expiration-alerter,v 1.1 2002-03-06 22:44:13 jeff Exp $
-
=head1 BUGS
Yes..... Use at your own risk. No guarantees or warrantees of any