X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=SL%2FMailer.pm;h=02b11739823bac17a44ebe8f291ff802811df2c3;hb=88e6dce2c094fa468e4397030d2f14289a265e62;hp=52691e277f75f208c1d51ce68e087759194694f9;hpb=8f3ecba98c0f85f2b48735c1ac110c3c9d957100;p=kivitendo-erp.git diff --git a/SL/Mailer.pm b/SL/Mailer.pm index 52691e277..02b117398 100644 --- a/SL/Mailer.pm +++ b/SL/Mailer.pm @@ -33,8 +33,11 @@ package Mailer; use Email::Address; use SL::Common; +use SL::MIME; use SL::Template; +use strict; + my $num_sent = 0; sub new { @@ -57,30 +60,29 @@ sub mime_quote_text { my $l_start = length($q_start); my $new_text = "$q_start"; - $chars_left -= $l_start; + $chars_left -= $l_start if (defined $chars_left); 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) { + if (($char < 32) || ($char > 127) || ($char == ord('?')) || ($char == ord('_'))) { + if ((defined $chars_left) && ($chars_left < 5)) { $new_text .= "?=\n $q_start"; $chars_left = 75 - $l_start; } $new_text .= sprintf("=%02X", $char); - $chars_left -= 3; + $chars_left -= 3 if (defined $chars_left); } else { $char = ord('_') if ($char == ord(' ')); - if ($chars_left < 5) { + if ((defined $chars_left) && ($chars_left < 5)) { $new_text .= "?=\n $q_start"; $chars_left = 75 - $l_start; } $new_text .= chr($char); - $chars_left--; + $chars_left-- if (defined $chars_left); } } @@ -132,14 +134,18 @@ sub send { } my $headers = ''; - foreach my $item (qw(from to cc)) { + foreach my $item (qw(from to cc bcc)) { next unless ($self->{$item}); my (@addr_objects) = Email::Address->parse($self->{$item}); next unless (scalar @addr_objects); foreach my $addr_obj (@addr_objects) { - $addr_obj->phrase($self->mime_quote_text($addr_obj->phrase(), 60)) if ($addr_obj->phrase()); - $addr_obj->comment($self->mime_quote_text($addr_obj->comment(), 60)) if ($addr_obj->comment()); + my $phrase = $addr_obj->phrase(); + if ($phrase) { + $phrase =~ s/^\"//; + $phrase =~ s/\"$//; + $addr_obj->phrase($self->mime_quote_text($phrase)); + } $headers .= sprintf("%s: %s\n", ucfirst($item), $addr_obj->format()); } @@ -178,10 +184,10 @@ $self->{message} $filename =~ s/(.*\/|\Q$self->{fileid}\E)//g; } - my $application = - ($attachment =~ /(^\w+$)|\.(html|text|txt|sql)$/) - ? "text" - : "application"; + 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 ($?) { @@ -190,8 +196,15 @@ $self->{message} 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; + if (lc $application eq 'text' && $self->{charset}) { + $attachment_charset = qq|; charset="$self->{charset}" |; + } + print OUT qq|--${boundary} -Content-Type: $application/$self->{format}; name="$filename"; charset="$self->{charset}" +Content-Type: ${content_type}; name="$filename"$attachment_charset Content-Transfer-Encoding: BASE64 Content-Disposition: attachment; filename="$filename"\n\n|;