]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Mailer.pm
kivitendo 3.9.2-0.2
[mfinanz.git] / SL / Mailer.pm
index f242120a964c89ec1593303556a7b49431ff46c4..a539c1a6c6230ee7ba0889caacafa57764f8aac0 100644 (file)
@@ -23,6 +23,8 @@
 
 package Mailer;
 
+use IO::Socket::INET;
+use IO::Socket::SSL;
 use Email::Address;
 use Email::MIME::Creator;
 use Encode;
@@ -38,6 +40,7 @@ use SL::DB::Employee;
 use SL::Locale::String qw(t8);
 use SL::Template;
 use SL::Version;
+use SL::IMAPClient;
 
 use strict;
 
@@ -61,6 +64,20 @@ my %type_to_table = (
   sales_delivery_order    => 'delivery_orders',
   dunning                 => 'dunning',
 );
+my %type_to_email = (
+  sales_quotation         => sub { $::instance_conf->get_email_sender_sales_quotation         },
+  request_quotation       => sub { $::instance_conf->get_email_sender_request_quotation       },
+  sales_order             => sub { $::instance_conf->get_email_sender_sales_order             },
+  purchase_order          => sub { $::instance_conf->get_email_sender_purchase_order          },
+  invoice                 => sub { $::instance_conf->get_email_sender_invoice                 },
+  credit_note             => sub { $::instance_conf->get_email_sender_invoice                 },
+  purchase_invoice        => sub { $::instance_conf->get_email_sender_purchase_invoice        },
+  letter                  => sub { $::instance_conf->get_email_sender_letter                  },
+  purchase_delivery_order => sub { $::instance_conf->get_email_sender_purchase_delivery_order },
+  sales_delivery_order    => sub { $::instance_conf->get_email_sender_sales_delivery_order    },
+  dunning                 => sub { $::instance_conf->get_email_sender_dunning                 },
+);
+
 
 sub new {
   my ($type, %params) = @_;
@@ -253,12 +270,12 @@ sub send {
   $self->{driver} = eval { $self->_create_driver };
   if (!$self->{driver}) {
     my $error = $@;
-    $self->_store_in_journal('failed', 'driver could not be created; check your configuration & log files');
+    $self->_store_in_journal('send_failed', 'driver could not be created; check your configuration & log files');
     $::lxdebug->message(LXDebug::WARN(), "Mailer error during 'send': $error");
 
     return $error;
   }
-
+  $self->_default_from;  # set from for records if configured in client config
   # Set defaults & headers
   $self->{charset}        =  'UTF-8';
   $self->{content_type} ||=  "text/plain";
@@ -270,6 +287,7 @@ sub send {
   );
   $self->{mail_attachments} = [];
 
+  my $email_as_string;
   my $error;
   my $ok = eval {
     # Clean up To/Cc/Bcc address fields
@@ -284,11 +302,21 @@ sub send {
     $self->{driver}->print($email->as_string);
     $self->{driver}->send;
 
+    $email_as_string = $email->as_string;
     1;
   };
 
   $error = $@ if !$ok;
 
+  # TODO: Error is not for sending emial
+  # in SL::Form->send_email error is treated as error for sending email
+  if ($ok) {
+    eval {$self->_store_in_imap_sent_folder($email_as_string); 1} or do {
+      $ok = 0;
+      $error = $@;
+    };
+  }
+
   # create journal and link to record
   $self->{journalentry} = $self->_store_in_journal;
   $self->_create_record_link if $self->{journalentry};
@@ -302,6 +330,36 @@ sub _all_recipients {
   return map { @{ $self->{addresses}->{$_} || [] } } qw(to cc bcc);
 }
 
+sub _get_header_string {
+  my ($self) = @_;
+  my $header_string =
+    join "\r\n",
+      (bundle_by { join(': ', @_) } 2, @{ $self->{headers} || [] });
+  return $header_string;
+}
+
+sub _store_in_imap_sent_folder {
+  my ($self, $email_as_string) = @_;
+
+  my $from_email = $self->{from};
+  my $user_email = $::myconfig{email};
+  my $imap_config =
+       $::lx_office_conf{"sent_emails_in_imap/email/$from_email"}
+    || $::lx_office_conf{"sent_emails_in_imap/email/$user_email"}
+    || $::lx_office_conf{sent_emails_in_imap}
+    || {};
+  return unless ($imap_config->{enabled});
+
+  my $folder = delete $imap_config->{folder};
+  my $imap_client = SL::IMAPClient->new(%$imap_config);
+  $imap_client->store_email_in_email_folder(
+    email_as_string => $email_as_string,
+    folder => $folder ||'Sent/Kivitendo',
+  );
+
+  return 1;
+}
+
 sub _store_in_journal {
   my ($self, $status, $extended_status) = @_;
 
@@ -310,11 +368,11 @@ sub _store_in_journal {
   return if $journal_enable == 0;
 
   $status          //= $self->{driver}->status if $self->{driver};
-  $status          //= 'failed';
+  $status          //= 'send_failed';
   $extended_status //= $self->{driver}->extended_status if $self->{driver};
   $extended_status //= 'unknown error';
 
-  my $headers = join "\r\n", (bundle_by { join(': ', @_) } 2, @{ $self->{headers} || [] });
+  my $headers = $self->_get_header_string;
 
   my $jentry = SL::DB::EmailJournal->new(
     sender          => SL::DB::Manager::Employee->current,
@@ -336,7 +394,7 @@ sub _create_record_link {
   my ($self) = @_;
 
   # check for custom/overloaded types and ids (form != controller)
-  my $record_type = $self->{record_type} || $::form->{type};
+  my $record_type = $self->{record_type} || $::form->{type} || '';
   my $record_id   = $self->{record_id}   || $::form->{id};
 
   # you may send mails for unsaved objects (no record_id => unlinkable case)
@@ -351,6 +409,15 @@ sub _create_record_link {
   }
 }
 
+
+sub _default_from {
+  my ($self) = @_;
+
+  my $record_type  = $self->{record_type} || $::form->{type} || $self->{driver}{form}{formname} || '';
+  my $record_email = exists $type_to_email{$record_type} ? $type_to_email{$record_type}->() : undef;
+  $self->{from}    = $record_email if $record_email;
+}
+
 1;