X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/ff159a4d47b9a2d10744dcfc23da2c63605c8a32..eeb5375ee7727c956cc357cc8f90b19d1bfe80b9:/SL/Mailer.pm diff --git a/SL/Mailer.pm b/SL/Mailer.pm index f242120a9..a539c1a6c 100644 --- a/SL/Mailer.pm +++ b/SL/Mailer.pm @@ -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;