+ 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,
+ );