]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Mailer.pm
Wiederkehrende Rechnungen: Druckvorlage nach Auftragssprache auswählen
[mfinanz.git] / SL / Mailer.pm
index 67f46fe21a483fd584b10072361b81d876553c61..3dd6831f3e2337501d36cd38791848d1ec929074 100644 (file)
@@ -25,6 +25,7 @@ package Mailer;
 
 use Email::Address;
 use Email::MIME::Creator;
+use Encode;
 use File::MimeInfo::Magic;
 use File::Slurp;
 use List::UtilsBy qw(bundle_by);
@@ -181,7 +182,6 @@ sub _create_attachment_part {
   my $ent;
   if ( $attributes{content_type} eq 'message/rfc822' ) {
     $ent = Email::MIME->new($attachment_content);
-    $ent->header_str_set('Content-disposition' => 'attachment; filename='.$attributes{filename});
   } else {
     $ent = Email::MIME->create(
       attributes => \%attributes,
@@ -189,6 +189,13 @@ sub _create_attachment_part {
     );
   }
 
+  # Due to a bug in Email::MIME it's not enough to hand over the encoded file name in the "attributes" hash in the
+  # "create" call. Email::MIME iterates over the keys in the hash, and depending on which key it has already seen during
+  # the iteration it might revert the encoding. As Perl's hash key order is randomized for each Perl run, this means
+  # that the file name stays unencoded sometimes.
+  # Setting the header manually after the "create" call circumvents this problem.
+  $ent->header_set('Content-disposition' => 'attachment; filename="' . encode('MIME-Q', $attributes{filename}) . '"');
+
   push @{ $self->{mail_attachments}} , SL::DB::EmailJournalAttachment->new(
     name      => $attributes{filename},
     mime_type => $attributes{content_type},
@@ -209,7 +216,7 @@ sub _create_message {
   if ($self->{message}) {
     push @parts, Email::MIME->create(
       attributes => {
-        content_type => $self->{contenttype},
+        content_type => $self->{content_type},
         charset      => $self->{charset},
         encoding     => 'quoted-printable',
       },
@@ -217,7 +224,7 @@ sub _create_message {
     );
 
     push @{ $self->{headers} }, (
-      'Content-Type' => qq|$self->{contenttype}; charset="$self->{charset}"|,
+      'Content-Type' => qq|$self->{content_type}; charset="$self->{charset}"|,
     );
   }
 
@@ -243,12 +250,12 @@ sub send {
   }
 
   # Set defaults & headers
-  $self->{charset}       =  'UTF-8';
-  $self->{contenttype} ||=  "text/plain";
-  $self->{headers}       =  [
-    Subject              => $self->{subject},
-    'Message-ID'         => '<' . $self->_create_message_id . '>',
-    'X-Mailer'           => "kivitendo " . SL::Version->get_version,
+  $self->{charset}        =  'UTF-8';
+  $self->{content_type} ||=  "text/plain";
+  $self->{headers}        =  [
+    Subject               => $self->{subject},
+    'Message-ID'          => '<' . $self->_create_message_id . '>',
+    'X-Mailer'            => "kivitendo " . SL::Version->get_version,
   ];
   $self->{mail_attachments} = [];
   $self->{content_by_name}  = $::instance_conf->get_email_journal == 1 && $::instance_conf->get_doc_files;