X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FMailer.pm;h=234b6a784b77e30cbd048ebf301e4b0ba2ce4f7f;hb=c9a7e79e10591ae95b1523f2c7f249eae8439580;hp=32e7ca28ef6ccc5c49d77c6c943373a676ae13ce;hpb=ef6f0c299906d6ef0e846aa18a45c01f776a9c66;p=kivitendo-erp.git diff --git a/SL/Mailer.pm b/SL/Mailer.pm index 32e7ca28e..234b6a784 100644 --- a/SL/Mailer.pm +++ b/SL/Mailer.pm @@ -30,6 +30,11 @@ package Mailer; +use SL::Common; +use SL::Template; + +my $num_sent = 0; + sub new { $main::lxdebug->enter_sub(); @@ -41,31 +46,81 @@ sub new { bless $self, $type; } -sub send { +sub mime_quote_text { $main::lxdebug->enter_sub(); - my ($self, $out) = @_; + my ($self, $text, $chars_left) = @_; - my $boundary = time; - $boundary = "LxOffice-$self->{version}-$boundary"; - my $domain = $self->{from}; - $domain =~ s/(.*?\@|>)//g; - my $msgid = "$boundary\@$domain"; + my $q_start = "=?$self->{charset}?Q?"; + my $l_start = length($q_start); - $self->{charset} = "ISO-8859-1" unless $self->{charset}; + my $new_text = "$q_start"; + $chars_left -= $l_start; - if ($out) { - if (!open(OUT, $out)) { - $main::lxdebug->leave_sub(); - return "$out : $!"; - } - } else { - if (!open(OUT, ">-")) { - $main::lxdebug->leave_sub(); - return "STDOUT : $!"; + for (my $i = 0; $i < length($text); $i++) { + my $char = ord(substr($text, $i, 1)); + + if (($char < 32) || ($char > 127) || + ($char == ord('?')) || ($char == ord('_'))) { + if ($chars_left < 5) { + $new_text .= "?=\n $q_start"; + $chars_left = 75 - $l_start; + } + + $new_text .= sprintf("=%02X", $char); + $chars_left -= 3; + + } else { + $char = ord('_') if ($char == ord(' ')); + if ($chars_left < 5) { + $new_text .= "?=\n $q_start"; + $chars_left = 75 - $l_start; + } + + $new_text .= chr($char); + $chars_left--; } } + $new_text .= "?="; + + $main::lxdebug->leave_sub(); + + return $new_text; +} + +sub send { + $main::lxdebug->enter_sub(); + + my ($self) = @_; + + local (*IN, *OUT); + + $num_sent++; + my $boundary = time() . "-$$-${num_sent}"; + $boundary = "LxOffice-$self->{version}-$boundary"; + my $domain = $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; + + $form->{myconfig_email} = $email; + + my $template = PlainTextTemplate->new(undef, $form, $myconfig); + my $sendmail = $template->parse_block($main::sendmail); + + $self->{charset} = Common::DEFAULT_CHARSET unless $self->{charset}; + + if (!open(OUT, $sendmail)) { + $main::lxdebug->leave_sub(); + return "$sendmail : $!"; + } + $self->{contenttype} = "text/plain" unless $self->{contenttype}; my ($cc, $bcc); @@ -79,9 +134,11 @@ sub send { $self->{$item} =~ s/\$>\$/>/g; } + my $subject = $self->mime_quote_text($self->{subject}, 60); + print OUT qq|From: $self->{from} To: $self->{to} -${cc}${bcc}Subject: $self->{subject} +${cc}${bcc}Subject: $subject Message-ID: <$msgid> X-Mailer: Lx-Office $self->{version} MIME-Version: 1.0 @@ -102,6 +159,17 @@ $self->{message} foreach my $attachment (@{ $self->{attachments} }) { + my $filename; + + if (ref($attachment) eq "HASH") { + $filename = $attachment->{"name"}; + $attachment = $attachment->{"filename"}; + } else { + $filename = $attachment; + # strip path + $filename =~ s/(.*\/|\Q$self->{fileid}\E)//g; + } + my $application = ($attachment =~ /(^\w+$)|\.(html|text|txt|sql)$/) ? "text" @@ -114,11 +182,6 @@ $self->{message} return "$attachment : $!"; } - my $filename = $attachment; - - # strip path - $filename =~ s/(.*\/|$self->{fileid})//g; - print OUT qq|--${boundary} Content-Type: $application/$self->{format}; name="$filename"; charset="$self->{charset}" Content-Transfer-Encoding: BASE64