22
33import jakarta .activation .*;
44import jakarta .mail .Address ;
5+ import jakarta .mail .Header ;
56import jakarta .mail .Message .RecipientType ;
67import jakarta .mail .MessagingException ;
78import jakarta .mail .Multipart ;
2930import static java .lang .String .format ;
3031import static java .nio .charset .StandardCharsets .UTF_8 ;
3132import static java .util .Optional .ofNullable ;
32- import static java .util .stream .Collectors .toList ;
3333import static org .simplejavamail .internal .util .MiscUtil .extractCID ;
3434import static org .simplejavamail .internal .util .MiscUtil .valueNullOrEmpty ;
3535import static org .slf4j .LoggerFactory .getLogger ;
@@ -75,7 +75,7 @@ public static ParsedMimeMessageComponents parseMimeMessage(@NotNull final MimeMe
7575 }
7676
7777 private static void parseMimePartTree (@ NotNull final MimePart currentPart , @ NotNull final ParsedMimeMessageComponents parsedComponents , final boolean fetchAttachmentData ) {
78- for (final DecodedHeader header : retrieveAllHeaders (currentPart )) {
78+ for (final Header header : retrieveAllHeaders (currentPart )) {
7979 parseHeader (header , parsedComponents );
8080 }
8181
@@ -122,8 +122,8 @@ private static void parseDataSource(@NotNull MimePart currentPart, @NotNull Pars
122122
123123 private static void checkContentTransferEncoding (final MimePart currentPart , @ NotNull final ParsedMimeMessageComponents parsedComponents ) {
124124 if (parsedComponents .contentTransferEncoding == null ) {
125- for (final DecodedHeader header : retrieveAllHeaders (currentPart )) {
126- if (isEmailHeader (header , "Content-Transfer-Encoding" )) {
125+ for (final Header header : retrieveAllHeaders (currentPart )) {
126+ if (isEmailHeader (DecodedHeader . of ( header ) , "Content-Transfer-Encoding" )) {
127127 parsedComponents .contentTransferEncoding = header .getValue ();
128128 }
129129 }
@@ -139,21 +139,20 @@ private static MimeDataSource parseAttachment(@Nullable final String contentId,
139139 .build ();
140140 }
141141
142- private static void parseHeader (final DecodedHeader header , @ NotNull final ParsedMimeMessageComponents parsedComponents ) {
143- val headerValue = decodeText (header .getValue ());
144- val headerName = decodeText (header .getName ());
142+ private static void parseHeader (final Header header , @ NotNull final ParsedMimeMessageComponents parsedComponents ) {
143+ val decodedHeader = DecodedHeader .of (header );
145144
146- if (isEmailHeader (header , "Disposition-Notification-To" )) {
147- parsedComponents .dispositionNotificationTo = createAddress ( headerValue , "Disposition-Notification-To" );
148- } else if (isEmailHeader (header , "Return-Receipt-To" )) {
149- parsedComponents .returnReceiptTo = createAddress ( headerValue , "Return-Receipt-To" );
150- } else if (isEmailHeader (header , "Return-Path" )) {
151- parsedComponents .bounceToAddress = createAddress ( headerValue , "Return-Path" );
145+ if (isEmailHeader (decodedHeader , "Disposition-Notification-To" )) {
146+ parsedComponents .dispositionNotificationTo = createAddressFromEncodedHeader ( header , "Disposition-Notification-To" );
147+ } else if (isEmailHeader (decodedHeader , "Return-Receipt-To" )) {
148+ parsedComponents .returnReceiptTo = createAddressFromEncodedHeader ( header , "Return-Receipt-To" );
149+ } else if (isEmailHeader (decodedHeader , "Return-Path" )) {
150+ parsedComponents .bounceToAddress = createAddressFromEncodedHeader ( header , "Return-Path" );
152151 } else {
153- if (!parsedComponents .headers .containsKey (headerName )) {
154- parsedComponents .headers .put (headerName , new ArrayList <>());
152+ if (!parsedComponents .headers .containsKey (decodedHeader . getName () )) {
153+ parsedComponents .headers .put (decodedHeader . getName () , new ArrayList <>());
155154 }
156- parsedComponents .headers .get (headerName ) .add (MimeUtility .unfold (headerValue ));
155+ parsedComponents .headers .get (decodedHeader . getName ()) .add (MimeUtility .unfold (decodedHeader . getValue () ));
157156 }
158157 }
159158
@@ -280,25 +279,24 @@ private static String parseResourceName(@Nullable String possibleWrappedContentI
280279
281280 @ SuppressWarnings ("WeakerAccess" )
282281 @ NotNull
283- public static List <DecodedHeader > retrieveAllHeaders (@ NotNull final MimePart part ) {
282+ public static List <Header > retrieveAllHeaders (@ NotNull final MimePart part ) {
284283 try {
285- return Collections .list (part .getAllHeaders ()).stream ()
286- .map (DecodedHeader ::of )
287- .collect (toList ());
284+ return Collections .list (part .getAllHeaders ());
288285 } catch (final MessagingException e ) {
289286 throw new MimeMessageParseException (MimeMessageParseException .ERROR_GETTING_ALL_HEADERS , e );
290287 }
291288 }
292289
293290 @ Nullable
294- static InternetAddress createAddress (final String address , final String typeOfAddress ) {
291+ static InternetAddress createAddressFromEncodedHeader (final Header headerWithAddress , final String typeOfAddress ) {
292+ val encodedAddress = headerWithAddress .getValue ();
295293 try {
296- return address .trim ().isEmpty () ? null : new InternetAddress ( address ) ;
294+ return encodedAddress .trim ().isEmpty () ? null : InternetAddress . parseHeader ( encodedAddress , true )[ 0 ] ;
297295 } catch (final AddressException e ) {
298296 if (e .getMessage ().equals ("Empty address" )) {
299297 return null ;
300298 }
301- throw new MimeMessageParseException (format (MimeMessageParseException .ERROR_PARSING_ADDRESS , typeOfAddress , address ), e );
299+ throw new MimeMessageParseException (format (MimeMessageParseException .ERROR_PARSING_ADDRESS , typeOfAddress , encodedAddress ), e );
302300 }
303301 }
304302
0 commit comments