diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java
index 62dd864b2b..5da817404f 100644
--- a/app/src/main/java/eu/faircode/email/MessageHelper.java
+++ b/app/src/main/java/eu/faircode/email/MessageHelper.java
@@ -2582,53 +2582,10 @@ public class MessageHelper {
}
}
} else if (h.isDSN()) {
- String action = null;
- String diag = null;
- String status = null;
-
- StringBuilder report = new StringBuilder();
- report.append("
");
- for (String line : result.split("\\r?\\n"))
- if (line.length() == 0)
- report.append("
");
- else if (Character.isWhitespace(line.charAt(0)))
- report.append(line).append("
");
- else {
- int colon = line.indexOf(':');
- if (colon < 0)
- report.append(line);
- else {
- String name = line.substring(0, colon).trim();
- String value = line.substring(colon + 1).trim();
- value = decodeMime(value);
- report
- .append("")
- .append(TextUtils.htmlEncode(name))
- .append("")
- .append(": ")
- .append(TextUtils.htmlEncode(value))
- .append("
");
-
- // https://datatracker.ietf.org/doc/html/rfc3464#section-2.3
- switch (name) {
- case "Action":
- action = value;
- break;
- case "Status":
- status = value;
- break;
- case "Diagnostic-Code":
- diag = value;
- break;
- }
- }
- }
- report.append("
");
- result = report.toString();
-
- if (diag != null &&
- ("failed".equals(action) || "delayed".equals(action)))
- warnings.add(diag + (status == null ? "" : " (" + status + ")"));
+ DeliveryReport report = new DeliveryReport(result);
+ result = report.html;
+ if (report.isNonDelivery() && report.diag != null)
+ warnings.add(report.diag);
} else
Log.w("Unexpected content type=" + h.contentType);
@@ -3756,4 +3713,60 @@ public class MessageHelper {
return className;
}
}
+
+ static class DeliveryReport {
+ String action;
+ String status;
+ String diag;
+ String html;
+
+ DeliveryReport(String content) {
+ StringBuilder report = new StringBuilder();
+ report.append("
");
+ content = content.replaceAll("(\\r?\\n)+", "\n");
+ ByteArrayInputStream bis = new ByteArrayInputStream(content.getBytes());
+ try {
+ Enumeration headers = new InternetHeaders(bis).getAllHeaders();
+ while (headers.hasMoreElements()) {
+ Header header = headers.nextElement();
+ String name = header.getName();
+ String value = header.getValue();
+ value = decodeMime(value);
+ report
+ .append("")
+ .append(TextUtils.htmlEncode(name))
+ .append("")
+ .append(": ")
+ .append(TextUtils.htmlEncode(value))
+ .append("
");
+
+ // https://datatracker.ietf.org/doc/html/rfc3464#section-2.3
+ switch (name) {
+ case "Action":
+ this.action = value;
+ break;
+ case "Status":
+ this.status = value;
+ break;
+ case "Diagnostic-Code":
+ this.diag = value;
+ break;
+ }
+ }
+ } catch (Throwable ex) {
+ Log.e(ex);
+ report.append(TextUtils.htmlEncode(ex.toString()));
+ }
+ report.append("
");
+ this.html = report.toString();
+ }
+
+ boolean isDelivery() {
+ return ("delivered".equals(action) || "relayed".equals(action) || "expanded".equals(action));
+ }
+
+ boolean isNonDelivery() {
+ return ("failed".equals(action) || "delayed".equals(action));
+ }
+ }
}