package Mailer;
+use IO::Socket::INET;
+use IO::Socket::SSL;
use Email::Address;
use Email::MIME::Creator;
use Encode;
use SL::Locale::String qw(t8);
use SL::Template;
use SL::Version;
+use SL::IMAPClient;
use strict;
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) = @_;
$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";
);
$self->{mail_attachments} = [];
+ my $email_as_string;
my $error;
my $ok = eval {
# Clean up To/Cc/Bcc address fields
$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};
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) = @_;
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,
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)
}
}
+
+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;