diff --git a/api/src/main/java/jakarta/mail/internet/MimeMessage.java b/api/src/main/java/jakarta/mail/internet/MimeMessage.java
index e832b097..26974412 100644
--- a/api/src/main/java/jakarta/mail/internet/MimeMessage.java
+++ b/api/src/main/java/jakarta/mail/internet/MimeMessage.java
@@ -40,10 +40,14 @@
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
+import java.util.Locale;
import java.util.Properties;
import java.util.ServiceConfigurationError;
@@ -173,7 +177,10 @@ public class MimeMessage extends Message implements MimePart {
protected Object cachedContent;
// Used to parse dates
- private static final MailDateFormat mailDateFormat = new MailDateFormat();
+ static final DateTimeFormatter mailDateFormat = DateTimeFormatter
+ .ofPattern("EEE, d MMM yyyy HH:mm:ss Z (z)")
+ .withLocale(Locale.US)
+ .withZone(ZoneOffset.systemDefault());
// Should addresses in headers be parsed in "strict" mode?
private boolean strict = true;
@@ -546,10 +553,10 @@ protected Object readResolve() throws ObjectStreamException {
* between the type and the corresponding RFC 822 header is
* as follows:
*
- * Message.RecipientType.TO "To"
- * Message.RecipientType.CC "Cc"
- * Message.RecipientType.BCC "Bcc"
- * MimeMessage.RecipientType.NEWSGROUPS "Newsgroups"
+ * Message.RecipientType.TO "To"
+ * Message.RecipientType.CC "Cc"
+ * Message.RecipientType.BCC "Bcc"
+ * MimeMessage.RecipientType.NEWSGROUPS "Newsgroups"
*
*
* Returns null if the header specified by the type is not found
@@ -902,10 +909,8 @@ public Date getSentDate() throws MessagingException {
String s = getHeader("Date", null);
if (s != null) {
try {
- synchronized (mailDateFormat) {
- return mailDateFormat.parse(s);
- }
- } catch (ParseException pex) {
+ return Date.from(Instant.from(mailDateFormat.parse(s)));
+ } catch (RuntimeException e) {
return null;
}
}
@@ -930,9 +935,7 @@ public void setSentDate(Date d) throws MessagingException {
if (d == null)
removeHeader("Date");
else {
- synchronized (mailDateFormat) {
- setHeader("Date", mailDateFormat.format(d));
- }
+ setHeader("Date", mailDateFormat.format(d.toInstant()));
}
}
@@ -1455,10 +1458,10 @@ public InputStream getRawInputStream() throws MessagingException {
* class MimePartDataSource implements DataSource {
* public getInputStream() {
* return MimeUtility.decode(
- * getContentStream(), getEncoding());
+ * getContentStream(), getEncoding());
* }
*
- * .... <other DataSource methods>
+ * .... <other DataSource methods>
* }
*
*
diff --git a/api/src/test/java/jakarta/mail/internet/MimeMessageTest.java b/api/src/test/java/jakarta/mail/internet/MimeMessageTest.java
new file mode 100644
index 00000000..c81302ad
--- /dev/null
+++ b/api/src/test/java/jakarta/mail/internet/MimeMessageTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package jakarta.mail.internet;
+
+import static org.junit.Assert.assertEquals;
+
+import java.text.ParseException;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+import org.junit.Test;
+
+public class MimeMessageTest {
+
+ @Test
+ public void dateTimeFormatter() throws ParseException {
+ MailDateFormat mailDateFormat1 = new MailDateFormat();
+ DateTimeFormatter mailDateFormat2 = MimeMessage.mailDateFormat;
+ Date date = new Date(1341100798000L);
+ String s1 = mailDateFormat1.format(date);
+ String s2 = mailDateFormat2.format(date.toInstant());
+ assertEquals(s1, s2);
+ Date d1 = mailDateFormat1.parse(s1);
+ Date d2 = Date.from(Instant.from(mailDateFormat2.parse(s1)));
+ assertEquals(d1, d2);
+ }
+}