+  my $ent;
+  if ( $attributes{content_type} eq 'message/rfc822' ) {
+    $ent = Email::MIME->new($attachment_content);
+  } else {
+    $ent = Email::MIME->create(
+      attributes => \%attributes,
+      body       => $attachment_content,
+    );
+  }
+
+  # 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},
+    content   => ( $email_journal > 1 ? $attachment_content : ' '),
+    file_id   => $file_id,
+  );
+
+  return $ent;
+}
+
+sub _create_message {
+  my ($self) = @_;
+
+  my @parts;
+
+  if ($self->{message}) {
+    push @parts, Email::MIME->create(
+      attributes => {
+        content_type => $self->{content_type},
+        charset      => $self->{charset},
+        encoding     => 'quoted-printable',
+      },
+      body_str => $self->{message},
+    );
+
+    push @{ $self->{headers} }, (
+      'Content-Type' => qq|$self->{content_type}; charset="$self->{charset}"|,
+    );
+  }
+
+  push @parts, grep { $_ } map { $self->_create_attachment_part($_) } @{ $self->{attachments} || [] };
+
+  return Email::MIME->create(
+      header_str => $self->{headers},
+      parts      => \@parts,
+  );