From 99f6599e6ac77cbd6d953fa47f02f716db8c3cb3 Mon Sep 17 00:00:00 2001 From: Arnab Nandy Date: Sun, 21 Jun 2026 01:07:15 +0530 Subject: [PATCH] Add java.time support to MimeMessageHelper This commit introduces support for setting the sent date of mail messages using 'java.time.Instant'. The 'setSentDate(Instant)' method is added as a default method on 'MailMessage' and implemented/overridden in 'MimeMessageHelper' and 'MimeMailMessage'. This allows developers using modern Java time APIs to avoid legacy and deprecated 'java.util.Date' conversions and warnings. Closes gh-36936 Signed-off-by: Arnab Nandy --- .../org/springframework/mail/MailMessage.java | 11 +++++++++ .../mail/javamail/MimeMailMessage.java | 11 +++++++++ .../mail/javamail/MimeMessageHelper.java | 12 ++++++++++ .../mail/javamail/JavaMailSenderTests.java | 23 +++++++++++++++++++ 4 files changed, 57 insertions(+) diff --git a/spring-context-support/src/main/java/org/springframework/mail/MailMessage.java b/spring-context-support/src/main/java/org/springframework/mail/MailMessage.java index 18faa2c2b8e0..14e91fc23d55 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/MailMessage.java +++ b/spring-context-support/src/main/java/org/springframework/mail/MailMessage.java @@ -16,6 +16,7 @@ package org.springframework.mail; +import java.time.Instant; import java.util.Date; /** @@ -53,6 +54,16 @@ public interface MailMessage { void setSentDate(Date sentDate) throws MailParseException; + /** + * Set the sent-date of the message. + * @param sentDate the date to set (never {@code null}) + * @throws MailParseException in case of errors + * @since 7.1 + */ + default void setSentDate(Instant sentDate) throws MailParseException { + setSentDate(Date.from(sentDate)); + } + void setSubject(String subject) throws MailParseException; void setText(String text) throws MailParseException; diff --git a/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMailMessage.java b/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMailMessage.java index 44cdc682ffdc..5889fc244842 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMailMessage.java +++ b/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMailMessage.java @@ -16,6 +16,7 @@ package org.springframework.mail.javamail; +import java.time.Instant; import java.util.Date; import jakarta.mail.MessagingException; @@ -163,6 +164,16 @@ public void setSentDate(Date sentDate) throws MailParseException { } } + @Override + public void setSentDate(Instant sentDate) throws MailParseException { + try { + this.helper.setSentDate(sentDate); + } + catch (MessagingException ex) { + throw new MailParseException(ex); + } + } + @Override public void setSubject(String subject) throws MailParseException { try { diff --git a/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMessageHelper.java b/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMessageHelper.java index 30f3e2e673b4..810a92f26772 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMessageHelper.java +++ b/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMessageHelper.java @@ -21,6 +21,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; +import java.time.Instant; import java.util.Date; import jakarta.activation.DataHandler; @@ -763,6 +764,17 @@ public void setSentDate(Date sentDate) throws MessagingException { this.mimeMessage.setSentDate(sentDate); } + /** + * Set the sent-date of the message. + * @param sentDate the date to set (never {@code null}) + * @throws MessagingException in case of errors + * @since 7.1 + */ + public void setSentDate(Instant sentDate) throws MessagingException { + Assert.notNull(sentDate, "Sent date must not be null"); + this.mimeMessage.setSentDate(Date.from(sentDate)); + } + /** * Set the subject of the message, using the correct encoding. * @param subject the subject text diff --git a/spring-context-support/src/test/java/org/springframework/mail/javamail/JavaMailSenderTests.java b/spring-context-support/src/test/java/org/springframework/mail/javamail/JavaMailSenderTests.java index 2289cd81fb14..ee04ed91bff3 100644 --- a/spring-context-support/src/test/java/org/springframework/mail/javamail/JavaMailSenderTests.java +++ b/spring-context-support/src/test/java/org/springframework/mail/javamail/JavaMailSenderTests.java @@ -21,6 +21,7 @@ import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; +import java.time.Instant; import java.util.List; import java.util.Properties; import java.util.stream.Stream; @@ -452,6 +453,28 @@ void connectionWithFailure() { assertThatExceptionOfType(MessagingException.class).isThrownBy(sender::testConnection); } + @Test + void javaTimeSentDateSupport() throws Exception { + Instant sentDate = Instant.parse("2026-06-20T10:15:30.00Z"); + Date expectedDate = Date.from(sentDate); + + // Test MimeMessageHelper + MimeMessage mimeMessage = sender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage); + helper.setSentDate(sentDate); + assertThat(mimeMessage.getSentDate()).isEqualTo(expectedDate); + + // Test MimeMailMessage + MimeMailMessage mimeMailMessage = new MimeMailMessage(helper); + mimeMailMessage.setSentDate(sentDate); + assertThat(mimeMessage.getSentDate()).isEqualTo(expectedDate); + + // Test SimpleMailMessage (via MailMessage interface default method) + SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); + simpleMailMessage.setSentDate(sentDate); + assertThat(simpleMailMessage.getSentDate()).isEqualTo(expectedDate); + } + private static Stream addresses(Address[] addresses) { return Arrays.stream(addresses).map(InternetAddress.class::cast).map(InternetAddress::getAddress);