X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/d5440cc6f9cc5b2942458ce7480526e2b90b17a4..eb8e38d2a0a461b1b954a49ba2aeac81e0e85ec1:/SL/Mailer.pm diff --git a/SL/Mailer.pm b/SL/Mailer.pm index c4cea35f2..0880eecc7 100644 --- a/SL/Mailer.pm +++ b/SL/Mailer.pm @@ -32,6 +32,7 @@ package Mailer; use Email::Address; use Encode; +use File::Slurp; use SL::Common; use SL::MIME; @@ -44,14 +45,33 @@ my $num_sent = 0; sub new { $main::lxdebug->enter_sub(); - my ($type) = @_; - my $self = {}; + my ($type, %params) = @_; + my $self = { %params }; $main::lxdebug->leave_sub(); bless $self, $type; } +sub _create_driver { + my ($self) = @_; + + my %params = ( + mailer => $self, + form => $::form, + myconfig => \%::myconfig, + ); + + my $cfg = $::lx_office_conf{mail_delivery}; + if (($cfg->{method} || 'smtp') ne 'smtp') { + require SL::Mailer::Sendmail; + return SL::Mailer::Sendmail->new(%params); + } else { + require SL::Mailer::SMTP; + return SL::Mailer::SMTP->new(%params); + } +} + sub mime_quote_text { $main::lxdebug->enter_sub(); @@ -99,28 +119,22 @@ sub send { my ($self) = @_; - local (*IN, *OUT); + local (*IN); $num_sent++; my $boundary = time() . "-$$-${num_sent}"; - $boundary = "LxOffice-$self->{version}-$boundary"; - my $domain = $self->recode($self->{from}); + $boundary = "kivitendo-$self->{version}-$boundary"; + my $domain = $self->{from}; $domain =~ s/(.*?\@|>)//g; my $msgid = "$boundary\@$domain"; my $form = $main::form; my $myconfig = \%main::myconfig; - my $email = $self->recode($myconfig->{email}); - $email =~ s/[^\w\.\-\+=@]//ig; - - my %temp_form = ( %{ $form }, 'myconfig_email' => $email ); - my $template = SL::Template::create(type => 'PlainText', form => \%temp_form); - my $sendmail = $template->parse_block($::lx_office_conf{applications}->{sendmail}); - - if (!open(OUT, "|$sendmail")) { + my $driver = eval { $self->_create_driver }; + if (!$driver) { $main::lxdebug->leave_sub(); - return "$sendmail : $!"; + return "send email : $@"; } $self->{charset} ||= Common::DEFAULT_CHARSET; @@ -128,22 +142,23 @@ sub send { foreach my $item (qw(to cc bcc)) { next unless ($self->{$item}); - $self->{$item} = $self->recode($self->{$item}); $self->{$item} =~ s/\</{$item} =~ s/\$<\$/{$item} =~ s/\>/>/g; $self->{$item} =~ s/\$>\$/>/g; } - $self->{from} = $self->recode($self->{from}); - + my %addresses; my $headers = ''; foreach my $item (qw(from to cc bcc)) { + $addresses{$item} = []; next unless ($self->{$item}); + my (@addr_objects) = Email::Address->parse($self->{$item}); next unless (scalar @addr_objects); foreach my $addr_obj (@addr_objects) { + push @{ $addresses{$item} }, $addr_obj->address; my $phrase = $addr_obj->phrase(); if ($phrase) { $phrase =~ s/^\"//; @@ -151,28 +166,28 @@ sub send { $addr_obj->phrase($self->mime_quote_text($phrase)); } - $headers .= sprintf("%s: %s\n", ucfirst($item), $addr_obj->format()); + $headers .= sprintf("%s: %s\n", ucfirst($item), $addr_obj->format()) unless $driver->keep_from_header($item); } } - $headers .= sprintf("Subject: %s\n", $self->mime_quote_text($self->recode($self->{subject}), 60)); + $headers .= sprintf("Subject: %s\n", $self->mime_quote_text($self->{subject}, 60)); - print OUT qq|${headers}Message-ID: <$msgid> -X-Mailer: Lx-Office $self->{version} + $driver->start_mail(from => $self->{from}, to => [ map { @{ $addresses{$_} } } qw(to cc bcc) ]); + + $driver->print(qq|${headers}Message-ID: <$msgid> +X-Mailer: kivitendo $self->{version} MIME-Version: 1.0 -|; +|); if ($self->{attachments}) { - print OUT qq|Content-Type: multipart/mixed; boundary="$boundary" - -|; + $driver->print(qq|Content-Type: multipart/mixed; boundary="$boundary"\n\n|); if ($self->{message}) { - print OUT qq|--${boundary} + $driver->print(qq|--${boundary} Content-Type: $self->{contenttype}; charset="$self->{charset}" -| . $self->recode($self->{message}) . qq| +$self->{message} -|; +|); } foreach my $attachment (@{ $self->{attachments} }) { @@ -188,18 +203,17 @@ Content-Type: $self->{contenttype}; charset="$self->{charset}" $filename =~ s/(.*\/|\Q$self->{fileid}\E)//g; } + my $attachment_content = eval { read_file($attachment) }; + if (!defined $attachment_content) { + $main::lxdebug->leave_sub(); + return "$attachment : $!"; + } + my $application = ($attachment =~ /(^\w+$)|\.(html|text|txt|sql)$/) ? "text" : "application"; my $content_type = SL::MIME->mime_type_from_ext($filename); $content_type = "${application}/$self->{format}" if (!$content_type && $self->{format}); $content_type ||= 'application/octet-stream'; - open(IN, $attachment); - if ($?) { - close(OUT); - $main::lxdebug->leave_sub(); - return "$attachment : $!"; - } - # only set charset for attachements of type text. every other type should not have this field # refer to bug 883 for detailed information my $attachment_charset; @@ -207,31 +221,23 @@ Content-Type: $self->{contenttype}; charset="$self->{charset}" $attachment_charset = qq|; charset="$self->{charset}" |; } - print OUT qq|--${boundary} + $driver->print(qq|--${boundary} Content-Type: ${content_type}; name="$filename"$attachment_charset Content-Transfer-Encoding: BASE64 -Content-Disposition: attachment; filename="$filename"\n\n|; - - my $msg = ""; - while () { - ; - $msg .= $_; - } - print OUT &encode_base64($msg); - - close(IN); +Content-Disposition: attachment; filename="$filename"\n\n|); + $driver->print(encode_base64($attachment_content)); } - print OUT qq|--${boundary}--\n|; + $driver->print(qq|--${boundary}--\n|); } else { - print OUT qq|Content-Type: $self->{contenttype}; charset="$self->{charset}" + $driver->print(qq|Content-Type: $self->{contenttype}; charset="$self->{charset}" -| . $self->recode($self->{message}) . qq| -|; +$self->{message} +|); } - close(OUT); + $driver->send; $main::lxdebug->leave_sub(); @@ -266,12 +272,4 @@ sub encode_base64 ($;$) { return $res; } -sub recode { - my $self = shift; - my $text = shift; - - return $::locale->is_utf8 ? Encode::encode('utf-8-strict', $text) : $text; -} - 1; -