RT#30613: Can't Send E-mail
authorJonathan Prykop <jonathan@freeside.biz>
Tue, 27 Jan 2015 22:25:18 +0000 (16:25 -0600)
committerJonathan Prykop <jonathan@freeside.biz>
Sat, 31 Jan 2015 05:09:29 +0000 (23:09 -0600)
15 files changed:
FS/FS/Conf.pm
FS/FS/Cron/agent_email.pm
FS/FS/Cron/upload.pm
FS/FS/Upgrade.pm
FS/FS/cust_bill.pm
FS/FS/cust_credit.pm
FS/FS/cust_main.pm
FS/FS/cust_main/Billing_Realtime.pm
FS/FS/cust_pay.pm
FS/FS/cust_pkg.pm
FS/FS/msg_template.pm
FS/FS/pay_batch.pm
FS/FS/quotation.pm
FS/FS/upload_target.pm
httemplate/misc/email-customers.html

index ac366d9..688ee10 100644 (file)
@@ -1233,9 +1233,24 @@ sub reason_type_options {
   {
     'key'         => 'invoice_from',
     'section'     => 'required',
-    'description' => 'Return address on email invoices',
+    'description' => 'Return address on email invoices (address only, see invoice_from_name)',
     'type'        => 'text',
     'per_agent'   => 1,
+    'validate'    => sub { $_[0] =~
+                             /^[^@]+\@[[:alnum:]-]+(\.[[:alnum:]-]+)+$/
+                             ? '' : 'Invalid email address';
+                         }
+  },
+
+  {
+    'key'         => 'invoice_from_name',
+    'section'     => 'invoicing',
+    'description' => 'Return name on email invoices (set address in invoice_from)',
+    'type'        => 'text',
+    'per_agent'   => 1,
+    'validate'    => sub { (($_[0] =~ /[^[:alnum:][:space:]]/) && ($_[0] !~ /^\".*\"$/))
+                           ? 'Invalid name.  Use quotation marks around names that contain punctuation.'
+                           : '' }
   },
 
   {
index 992aa35..623b920 100644 (file)
@@ -29,7 +29,10 @@ sub agent_email {
     RT::ConnectToDatabase();
   }
 
-  my $from = $conf->config('invoice_from');
+  my $from = $conf->config('invoice_from_name') ?
+             $conf->config('invoice_from_name') . ' <' . 
+             $conf->config('invoice_from') . '>' :
+             $conf->config('invoice_from');
 
   my $outbuf = '';;
   my( $fs_interp, $rt_interp ) = mason_interps('standalone', 'outbuf'=>\$outbuf);
index 03ed366..fa1762f 100644 (file)
@@ -508,7 +508,10 @@ sub prepare_report {
 
   (
     to      => $to,
-    from    => $conf->config('invoice_from', $agentnum),
+    from    => $conf->config('invoice_from_name', $agentnum) ?
+               $conf->config('invoice_from_name', $agentnum) . ' <' . 
+               $conf->config('invoice_from', $agentnum) . '>' :
+               $conf->config('invoice_from', $agentnum),
     subject => $subject,
     body    => $body,
   );
index dbac17e..0dab2f7 100644 (file)
@@ -46,6 +46,22 @@ sub upgrade_config {
 
   my $conf = new FS::Conf;
 
+  if ($conf->config('invoice_from') =~ /\<(.*)\>/) {
+    my $realemail = $1;
+    $realemail =~ s/^\s*//; # remove leading spaces
+    $realemail =~ s/\s*$//; # remove trailing spaces
+    my $realname = $conf->config('invoice_from');
+    $realname =~ s/\<.*\>//; # remove email address
+    $realname =~ s/^\s*//; # remove leading spaces
+    $realname =~ s/\s*$//; # remove trailing spaces
+    # properly quote names that contain punctuation
+    if (($realname =~ /[^[:alnum:][:space:]]/) && ($realname !~ /^\".*\"$/)) {
+      $realname = '"' . $realname . '"';
+    }
+    $conf->set('invoice_from_name', $realname);
+    $conf->set('invoice_from', $realemail);
+  }
+
   $conf->touch('payment_receipt')
     if $conf->exists('payment_receipt_email')
     || $conf->config('payment_receipt_msgnum');
index 7204821..1c5ecf8 100644 (file)
@@ -1092,6 +1092,9 @@ sub email {
 
   # this is where we set the From: address
   $from ||= $self->_agent_invoice_from ||    #XXX should go away
+            $conf->config('invoice_from_name', $self->cust_main->agentnum ) ?
+            $conf->config('invoice_from_name', $self->cust_main->agentnum ) . ' <' .
+            $conf->config('invoice_from', $self->cust_main->agentnum ) . '>' :
             $conf->config('invoice_from', $self->cust_main->agentnum );
 
   my @invoicing_list = $self->cust_main->invoicing_list_emailonly;
index d46c431..59bd586 100644 (file)
@@ -248,7 +248,10 @@ sub delete {
     my $cust_main = $self->cust_main;
 
     my $error = send_email(
-      'from'    => $conf->config('invoice_from', $self->cust_main->agentnum),
+      'from'    => $conf->config('invoice_from_name', $self->cust_main->agentnum) ?
+                   $conf->config('invoice_from_name', $self->cust_main->agentnum) . ' <' .
+                   $conf->config('invoice_from', $self->cust_main->agentnum) . '>' :
+                   $conf->config('invoice_from', $self->cust_main->agentnum),
                                  #invoice_from??? well as good as any
       'to'      => $conf->config('deletecredits'),
       'subject' => 'FREESIDE NOTIFICATION: Credit deleted',
index b43d7e3..d8083bd 100644 (file)
@@ -4818,7 +4818,10 @@ sub notify {
 
   return unless $conf->exists($template);
 
-  my $from = $conf->config('invoice_from', $self->agentnum)
+  my $from = $conf->config('invoice_from_name', $self->agentnum) ?
+             $conf->config('invoice_from_name', $self->agentnum) . ' <' .
+             $conf->config('invoice_from', $self->agentnum) . '>' :
+             $conf->config('invoice_from', $self->agentnum)
     if $conf->exists('invoice_from', $self->agentnum);
   $from = $options{from} if exists($options{from});
 
index a0b32ed..f70bab2 100644 (file)
@@ -1107,7 +1107,10 @@ sub _realtime_bop_result {
         };
 
         my $error = send_email(
-          'from'    => $conf->config('invoice_from', $self->agentnum ),
+          'from'    => $conf->config('invoice_from_name', $self->agentnum ) ?
+                       $conf->config('invoice_from_name', $self->agentnum ) . ' <' .
+                       $conf->config('invoice_from', $self->agentnum ) . '>' :
+                       $conf->config('invoice_from', $self->agentnum ),
           'to'      => [ grep { $_ ne 'POST' } $self->invoicing_list ],
           'subject' => 'Your payment could not be processed',
           'body'    => [ $template->fill_in(HASH => $templ_hash) ],
index 01736f7..45f9487 100644 (file)
@@ -707,7 +707,10 @@ sub send_receipt {
         'msgtype' => 'receipt',
       };
       $error = $queue->insert(
-        'from'    => $conf->config('invoice_from', $cust_main->agentnum),
+        'from'    => $conf->config('invoice_from_name', $cust_main->agentnum ) ?
+                     $conf->config('invoice_from_name', $cust_main->agentnum ) . ' <' .
+                     $conf->config('invoice_from', $cust_main->agentnum ) . '>' :
+                     $conf->config('invoice_from', $cust_main->agentnum ),
                                    #invoice_from??? well as good as any
         'to'      => \@invoicing_list,
         'subject' => 'Payment receipt',
index de9aa08..55fa7a9 100644 (file)
@@ -960,7 +960,10 @@ sub cancel {
     }
     else {
       $error = send_email(
-        'from'    => $conf->config('invoice_from', $self->cust_main->agentnum),
+        'from'    => $conf->config('invoice_from_name', $self->cust_main->agentnum) ?
+                     $conf->config('invoice_from_name', $self->cust_main->agentnum) . ' <' .
+                     $conf->config('invoice_from', $self->cust_main->agentnum) . '>' :
+                     $conf->config('invoice_from', $self->cust_main->agentnum),
         'to'      => \@invoicing_list,
         'subject' => ( $conf->config('cancelsubject') || 'Cancellation Notice' ),
         'body'    => [ map "$_\n", $conf->config('cancelmessage') ],
index ef30946..a2682eb 100644 (file)
@@ -397,8 +397,10 @@ sub prepare {
       $from_addr = scalar( $conf->config($opt{'from_config'}, 
                                          $cust_main->agentnum) );
     }
-    $from_addr ||= scalar( $conf->config('invoice_from',
-                                         $cust_main->agentnum) );
+    $from_addr ||= $conf->config('invoice_from_name', $cust_main->agentnum) ?
+                   $conf->config('invoice_from_name', $cust_main->agentnum) . ' <' .
+                   $conf->config('invoice_from', $cust_main->agentnum) . '>' :
+                   $conf->config('invoice_from', $cust_main->agentnum);
   }
 #  my @cust_msg = ();
 #  if ( $conf->exists('log_sent_mail') and !$opt{'preview'} ) {
index 3a06914..fe03bd0 100644 (file)
@@ -764,7 +764,10 @@ sub import_from_gateway {
       my $body = "Import from gateway ".$gateway->label."\n".$error_text;
       send_email(
         to      => $mail_on_error,
-        from    => $conf->config('invoice_from'),
+        from    => $conf->config('invoice_from_name') ?
+                   $conf->config('invoice_from_name') . ' <' .
+                   $conf->config('invoice_from') . '>' :
+                   $conf->config('invoice_from'),
         subject => $subject,
         body    => $body,
       );
index b3595ef..e24f1dd 100644 (file)
@@ -198,8 +198,10 @@ sub email {
 
   # this is where we set the From: address
   $from ||= $conf->config('quotation_from', $self->cust_or_prospect->agentnum )
-         || $conf->config('invoice_from',   $self->cust_or_prospect->agentnum );
-
+        || ($conf->config('invoice_from_name', $self->cust_or_prospect->agentnum ) ?
+            $conf->config('invoice_from_name', $self->cust_or_prospect->agentnum ) . ' <' .
+            $conf->config('invoice_from', $self->cust_or_prospect->agentnum ) . '>' :
+            $conf->config('invoice_from', $self->cust_or_prospect->agentnum ));
   $self->SUPER::email( {
     'from' => $from,
     %$opt,
index 33088cb..73d2a04 100644 (file)
@@ -163,7 +163,10 @@ sub put {
     # (maybe use only the raw content, so that we don't have to supply a 
     # customer for substitutions? ewww.)
     my %message = (
-      'from'          => $conf->config('invoice_from'),
+      'from'          => $conf->config('invoice_from_name') ?
+                         $conf->config('invoice_from_name') . ' <' .
+                         $conf->config('invoice_from') . '>' :
+                         $conf->config('invoice_from'),
       'to'            => $to,
       'subject'       => $self->subject,
       'nobody'        => 1,
index 1592630..c74c15b 100644 (file)
@@ -103,7 +103,8 @@ Template:
     <& /elements/tr-td-label.html, 'label' => 'From:' &>
       <TD><& /elements/input-text.html,
               'field' => 'from_name',
-              'value' => $conf->config('company_name', $agent_virt_agentnum), #?
+              'value' => $conf->config('invoice_from_name', $agent_virt_agentnum) ||
+                         $conf->config('company_name', $agent_virt_agentnum), #?
               'size'  => 20,
           &>&nbsp;&lt;\
           <& /elements/input-text.html,