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