Skip to content

Commit 412f5f6

Browse files
committed
Fix NPEs in MimeMessageHelper when adding files without names
Prior to this commit, `MimeMessageHelper` would accept `Resource` instances as inline attachments in multipart MIME messages. If the provided `Resource` implementation returns `null` for `getFileName()`, the `addInLine` method would fail with a `NullPointerException` as Jakarta activation fails to detect the content type for a null filename. This commit falls back on "application/octet-stream" when the filename is not known for the given resource instead of failing with an exception. Fixes gh-33527
1 parent 6a20987 commit 412f5f6

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMessageHelper.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -43,6 +43,7 @@
4343
import org.springframework.core.io.Resource;
4444
import org.springframework.lang.Nullable;
4545
import org.springframework.util.Assert;
46+
import org.springframework.util.MimeTypeUtils;
4647

4748
/**
4849
* Helper class for populating a {@link jakarta.mail.internet.MimeMessage}.
@@ -960,7 +961,8 @@ public void addInline(String contentId, File file) throws MessagingException {
960961
*/
961962
public void addInline(String contentId, Resource resource) throws MessagingException {
962963
Assert.notNull(resource, "Resource must not be null");
963-
String contentType = getFileTypeMap().getContentType(resource.getFilename());
964+
String contentType = (resource.getFilename() != null ?
965+
getFileTypeMap().getContentType(resource.getFilename()) : MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE);
964966
addInline(contentId, resource, contentType);
965967
}
966968

spring-context-support/src/test/java/org/springframework/mail/javamail/JavaMailSenderTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import jakarta.mail.internet.MimeMessage;
4040
import org.junit.jupiter.api.Test;
4141

42+
import org.springframework.core.io.ByteArrayResource;
4243
import org.springframework.mail.MailParseException;
4344
import org.springframework.mail.MailSendException;
4445
import org.springframework.mail.SimpleMailMessage;
@@ -270,6 +271,25 @@ void javaMailSenderWithMimeMessageHelperAndDefaultEncoding() throws Exception {
270271
assertThat(sender.transport.getSentMessages()).containsExactly(message.getMimeMessage());
271272
}
272273

274+
@Test
275+
void javaMailSenderWithMimeMessageHelperAndCustomResource() throws Exception {
276+
sender.setHost("host");
277+
sender.setUsername("username");
278+
sender.setPassword("password");
279+
280+
MimeMessageHelper message = new MimeMessageHelper(sender.createMimeMessage(), true);
281+
message.setTo("[email protected]");
282+
message.addInline("id", new ByteArrayResource(new byte[] {1, 2, 3}));
283+
284+
sender.send(message.getMimeMessage());
285+
286+
assertThat(sender.transport.getConnectedHost()).isEqualTo("host");
287+
assertThat(sender.transport.getConnectedUsername()).isEqualTo("username");
288+
assertThat(sender.transport.getConnectedPassword()).isEqualTo("password");
289+
assertThat(sender.transport.isCloseCalled()).isTrue();
290+
assertThat(sender.transport.getSentMessages()).containsExactly(message.getMimeMessage());
291+
}
292+
273293
@Test
274294
void javaMailSenderWithParseExceptionOnSimpleMessage() {
275295
SimpleMailMessage simpleMessage = new SimpleMailMessage();

0 commit comments

Comments
 (0)