eliminate some false laziness in FS::Misc::send_email vs. msg_template/email.pm send_...
[freeside.git] / FS / FS / Misc.pm
index d84aace..139f05d 100644 (file)
@@ -1,7 +1,7 @@
 package FS::Misc;
 
 use strict;
 package FS::Misc;
 
 use strict;
-use vars qw ( @ISA @EXPORT_OK $DEBUG );
+use vars qw ( @ISA @EXPORT_OK $DEBUG $DISABLE_ALL_NOTICES );
 use Exporter;
 use Carp;
 use Data::Dumper;
 use Exporter;
 use Carp;
 use Data::Dumper;
@@ -15,7 +15,7 @@ use Encode;
 #instead
 
 @ISA = qw( Exporter );
 #instead
 
 @ISA = qw( Exporter );
-@EXPORT_OK = qw( send_email generate_email send_fax
+@EXPORT_OK = qw( send_email generate_email send_fax _sendmail
                  states_hash counties cities state_label
                  card_types
                  pkg_freqs
                  states_hash counties cities state_label
                  card_types
                  pkg_freqs
@@ -43,6 +43,32 @@ Miscellaneous subroutines.  This module contains miscellaneous subroutines
 called from multiple other modules.  These are not OO or necessarily related,
 but are collected here to eliminate code duplication.
 
 called from multiple other modules.  These are not OO or necessarily related,
 but are collected here to eliminate code duplication.
 
+=head1 DISABLE ALL NOTICES
+
+Set $FS::Misc::DISABLE_ALL_NOTICES to suppress:
+
+=over 4
+
+=item FS::cust_bill::send_csv
+
+=item FS::cust_bill::spool_csv
+
+=item FS::msg_template::email::send_prepared
+
+=item FS::Misc::send_email
+
+=item FS::Misc::do_print
+
+=item FS::Misc::send_fax
+
+=item FS::Template_Mixin::postal_mail_fsinc
+
+=back
+
+=cut
+
+$DISABLE_ALL_NOTICES = 0;
+
 =head1 SUBROUTINES
 
 =over 4
 =head1 SUBROUTINES
 
 =over 4
@@ -109,7 +135,6 @@ use Date::Format;
 use MIME::Entity;
 use Email::Sender::Simple qw(sendmail);
 use Email::Sender::Transport::SMTP;
 use MIME::Entity;
 use Email::Sender::Simple qw(sendmail);
 use Email::Sender::Transport::SMTP;
-use Email::Sender::Transport::SMTP::TLS 0.11;
 use FS::UID;
 
 FS::UID->install_callback( sub {
 use FS::UID;
 
 FS::UID->install_callback( sub {
@@ -118,6 +143,12 @@ FS::UID->install_callback( sub {
 
 sub send_email {
   my(%options) = @_;
 
 sub send_email {
   my(%options) = @_;
+
+  if ( $DISABLE_ALL_NOTICES ) {
+    warn 'send_email() disabled by $FS::Misc::DISABLE_ALL_NOTICES' if $DEBUG;
+    return;
+  }
+
   if ( $DEBUG ) {
     my %doptions = %options;
     $doptions{'body'} = '(full body not shown in debug)';
   if ( $DEBUG ) {
     my %doptions = %options;
     $doptions{'body'} = '(full body not shown in debug)';
@@ -241,25 +272,6 @@ sub send_email {
 
   #send the email
 
 
   #send the email
 
-  my %smtp_opt = ( 'host' => $conf->config('smtpmachine'),
-                   'helo' => $domain,
-                 );
-
-  my($port, $enc) = split('-', ($conf->config('smtp-encryption') || '25') );
-  $smtp_opt{'port'} = $port;
-
-  my $transport;
-  if ( defined($enc) && $enc eq 'starttls' ) {
-    $smtp_opt{$_} = $conf->config("smtp-$_") for qw(username password);
-    $transport = Email::Sender::Transport::SMTP::TLS->new( %smtp_opt );
-  } else {
-    if ( $conf->exists('smtp-username') && $conf->exists('smtp-password') ) {
-      $smtp_opt{"sasl_$_"} = $conf->config("smtp-$_") for qw(username password);
-    }
-    $smtp_opt{'ssl'} = 1 if defined($enc) && $enc eq 'tls';
-    $transport = Email::Sender::Transport::SMTP->new( %smtp_opt );
-  }
-  
   push @to, $options{bcc} if defined($options{bcc});
   # fully unpack all addresses found in @to (including Bcc) to make the
   # envelope list
   push @to, $options{bcc} if defined($options{bcc});
   # fully unpack all addresses found in @to (including Bcc) to make the
   # envelope list
@@ -268,19 +280,11 @@ sub send_email {
     push @env_to, map { $_->address } Email::Address->parse($dest);
   }
 
     push @env_to, map { $_->address } Email::Address->parse($dest);
   }
 
-  local $@; # just in case
-  eval { sendmail($message, { transport => $transport,
-                              from      => $from,
-                              to        => \@env_to }) };
-
-  my $error = '';
-  if(ref($@) and $@->isa('Email::Sender::Failure')) {
-    $error = $@->code.' ' if $@->code;
-    $error .= $@->message;
-  }
-  else {
-    $error = $@;
-  }
+  my $error = _sendmail( $message, { 'from'    => $from,
+                                     'to'      => \@env_to,
+                                     'domain'  => $domain,
+                                   }
+                       );
 
   # Logging
   if ( $conf->exists('log_sent_mail') ) {
 
   # Logging
   if ( $conf->exists('log_sent_mail') ) {
@@ -299,10 +303,53 @@ sub send_email {
     my $log_error = $cust_msg->insert;
     warn "Error logging message: $log_error\n" if $log_error; # at least warn
   }
     my $log_error = $cust_msg->insert;
     warn "Error logging message: $log_error\n" if $log_error; # at least warn
   }
+
   $error;
    
 }
 
   $error;
    
 }
 
+sub _sendmail {
+  my($message, $options) = @_;
+  my $domain = delete $options->{'domain'};
+
+  my %smtp_opt = ( 'host' => $conf->config('smtpmachine'),
+                   'helo' => $domain,
+                 );
+
+  my($port, $enc) = split('-', ($conf->config('smtp-encryption') || '25') );
+  $smtp_opt{'port'} = $port;
+
+  if ( $conf->exists('smtp-username') && $conf->exists('smtp-password') ) {
+    $smtp_opt{"sasl_$_"} = $conf->config("smtp-$_") for qw(username password);
+  } elsif ( defined($enc) && $enc eq 'starttls') {
+    return "SMTP settings misconfiguration: STARTTLS enabled in ".
+           "smtp-encryption but smtp-username or smtp-password missing";
+  }
+
+  if ( defined($enc) ) {
+    $smtp_opt{'ssl'} = 'starttls' if $enc eq 'starttls';
+    $smtp_opt{'ssl'} = 1          if $enc eq 'tls';
+  }
+
+  $options->{'transport'} = Email::Sender::Transport::SMTP->new( %smtp_opt );
+
+  my $error = '';
+
+  local $SIG{__DIE__}; # don't want Mason __DIE__ handler active
+  local $@; # just in case
+  eval { sendmail($message, $options) };
+
+  if (ref($@) and $@->isa('Email::Sender::Failure')) {
+    $error = $@->code.' ' if $@->code;
+    $error .= $@->message;
+  } else {
+    $error = $@;
+  }
+
+  $error;
+
+}
+
 =item generate_email OPTION => VALUE ...
 
 Options:
 =item generate_email OPTION => VALUE ...
 
 Options:
@@ -450,6 +497,11 @@ sub send_fax {
   die 'HylaFAX support has not been configured.'
     unless $conf->exists('hylafax');
 
   die 'HylaFAX support has not been configured.'
     unless $conf->exists('hylafax');
 
+  if ( $DISABLE_ALL_NOTICES ) {
+    warn 'send_fax() disabled by $FS::Misc::DISABLE_ALL_NOTICES' if $DEBUG;
+    return;
+  }
+
   eval {
     require Fax::Hylafax::Client;
   };
   eval {
     require Fax::Hylafax::Client;
   };
@@ -869,6 +921,11 @@ global value and agentnum).
 sub do_print {
   my( $data, %opt ) = @_;
 
 sub do_print {
   my( $data, %opt ) = @_;
 
+  if ( $DISABLE_ALL_NOTICES ) {
+    warn 'do_print() disabled by $FS::Misc::DISABLE_ALL_NOTICES' if $DEBUG;
+    return;
+  }
+
   my $lpr = ( exists($opt{'lpr'}) && $opt{'lpr'} )
               ? $opt{'lpr'}
               : $conf->config('lpr', $opt{'agentnum'} );
   my $lpr = ( exists($opt{'lpr'}) && $opt{'lpr'} )
               ? $opt{'lpr'}
               : $conf->config('lpr', $opt{'agentnum'} );