X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FMailer.pm;h=b04af08ddf5943ee4d7df2753080048571881c9d;hb=706d20f46c3e638de6ffca27e0fbdd48394b24ab;hp=02b11739823bac17a44ebe8f291ff802811df2c3;hpb=c510d88bbfea6818ffafaddb7286e88aec96d3b8;p=kivitendo-erp.git diff --git a/SL/Mailer.pm b/SL/Mailer.pm index 02b117398..b04af08dd 100644 --- a/SL/Mailer.pm +++ b/SL/Mailer.pm @@ -31,6 +31,7 @@ package Mailer; use Email::Address; +use Encode; use SL::Common; use SL::MIME; @@ -43,14 +44,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(); @@ -98,28 +118,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->{from}; + my $domain = $self->recode($self->{from}); $domain =~ s/(.*?\@|>)//g; my $msgid = "$boundary\@$domain"; my $form = $main::form; my $myconfig = \%main::myconfig; - my $email = $myconfig->{email}; - $email =~ s/[^\w\.\-\+=@]//ig; - - my %temp_form = ( %{ $form }, 'myconfig_email' => $email ); - my $template = PlainTextTemplate->new(undef, \%temp_form, $myconfig); - my $sendmail = $template->parse_block($main::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; @@ -127,19 +141,26 @@ 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/^\"//; @@ -147,28 +168,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->{subject}, 60)); + $headers .= sprintf("Subject: %s\n", $self->mime_quote_text($self->recode($self->{subject}), 60)); - print OUT qq|${headers}Message-ID: <$msgid> + $driver->start_mail(from => $self->{from}, to => [ map { @{ $addresses{$_} } } qw(to cc bcc) ]); + + $driver->print(qq|${headers}Message-ID: <$msgid> X-Mailer: Lx-Office $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->{message} +| . $self->recode($self->{message}) . qq| -|; +|); } foreach my $attachment (@{ $self->{attachments} }) { @@ -191,7 +212,6 @@ $self->{message} open(IN, $attachment); if ($?) { - close(OUT); $main::lxdebug->leave_sub(); return "$attachment : $!"; } @@ -203,31 +223,31 @@ $self->{message} $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|; +Content-Disposition: attachment; filename="$filename"\n\n|); my $msg = ""; while () { ; $msg .= $_; } - print OUT &encode_base64($msg); + $driver->print(encode_base64($msg)); close(IN); } - 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->{message} -|; +| . $self->recode($self->{message}) . qq| +|); } - close(OUT); + $driver->send; $main::lxdebug->leave_sub(); @@ -262,5 +282,11 @@ sub encode_base64 ($;$) { return $res; } -1; +sub recode { + my $self = shift; + my $text = shift; + + return $::locale->is_utf8 ? Encode::encode('utf-8-strict', $text) : $text; +} +1;