CSV-Import-Bericht: beim Löschen nur verwaiste Profile löschen
[kivitendo-erp.git] / SL / Mailer.pm
index 5b793d4..eb9f7a2 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},
@@ -368,7 +375,7 @@ SL::Mailer - Base class for sending mails from kivitendo
 
 =head1 OVERVIEW
 
-Mail can be send from kivitendo via the sendmail command or the smtp protocol.
+Mail can be sent from kivitendo via the sendmail command or the smtp protocol.
 
 
 =head1 INTERNAL DATA TYPES
@@ -378,7 +385,7 @@ Mail can be send from kivitendo via the sendmail command or the smtp protocol.
 
 =item C<%mail_delivery_modules>
 
-  Currently two modules are supported either smtp or sendmail.
+  Currently two modules are supported: smtp or sendmail.
 
 =item C<%type_to_table>
 
@@ -410,7 +417,7 @@ Mail can be send from kivitendo via the sendmail command or the smtp protocol.
 
 =item C<send>
 
-  If a mail was send successfully the internal functions _store_in_journal
+  If a mail was sent successfully the internal function _store_in_journal
   is called if email journaling is enabled. If _store_in_journal was executed
   successfully and the calling form is already persistent (database id) a
   record_link will be created.
@@ -423,7 +430,7 @@ Mail can be send from kivitendo via the sendmail command or the smtp protocol.
 
 
   If $self->{journalentry} and either $self->{record_id} or $::form->{id} (checked in
-  this order) exists a record link from record to email journal is created.
+  this order) exist a record link from record to email journal is created.
   Will fail silently if record_link creation wasn't successful (same behaviour as
   _store_in_journal).