@@ -37,7 +37,7 @@ public class Mbox {
37
37
private final static Logger log = Logger .getLogger ("org.openjdk.skara.mailinglist" );
38
38
39
39
private final static Pattern mboxMessagePattern = Pattern .compile (
40
- "^\\ R^ (From (?:.(?!^\\ R^From ))*)" , Pattern .MULTILINE | Pattern .DOTALL );
40
+ "^(From (?:.(?!^\\ R^From ))*)" , Pattern .MULTILINE | Pattern .DOTALL );
41
41
private final static DateTimeFormatter ctimeFormat = DateTimeFormatter .ofPattern (
42
42
"EEE LLL dd HH:mm:ss yyyy" , Locale .US );
43
43
private final static Pattern fromStringEncodePattern = Pattern .compile ("^(>*From )" , Pattern .MULTILINE );
@@ -46,15 +46,30 @@ public class Mbox {
46
46
private final static Pattern decodedQuotedPrintablePattern = Pattern .compile ("=\\ ?utf-8\\ ?b\\ ?(.*?)\\ ?=" );
47
47
48
48
private static List <Email > splitMbox (String mbox ) {
49
+ // Initial split
49
50
var messages = mboxMessagePattern .matcher (mbox ).results ()
50
51
.map (match -> match .group (1 ))
52
+ .filter (message -> message .length () > 0 )
53
+ .map (Mbox ::decodeFromStrings )
54
+ .map (Mbox ::decodeQuotedPrintable )
51
55
.collect (Collectors .toList ());
52
- return messages .stream ()
53
- .filter (message -> message .length () > 0 )
54
- .map (Mbox ::decodeFromStrings )
55
- .map (Mbox ::decodeQuotedPrintable )
56
- .map (Email ::parse )
57
- .collect (Collectors .toList ());
56
+
57
+ // Pipermail can occasionally fail to encode 'From ' in message bodies, try to handle this
58
+ var messageBuilder = new StringBuilder ();
59
+ var parsedMails = new ArrayList <Email >();
60
+ Collections .reverse (messages );
61
+ for (var message : messages ) {
62
+ messageBuilder .insert (0 , message );
63
+ try {
64
+ var email = Email .parse (messageBuilder .toString ());
65
+ parsedMails .add (email );
66
+ messageBuilder .setLength (0 );
67
+ } catch (RuntimeException ignored ) {
68
+ }
69
+ }
70
+
71
+ Collections .reverse (parsedMails );
72
+ return parsedMails ;
58
73
}
59
74
60
75
private static String encodeFromStrings (String body ) {
0 commit comments