Fix: Recognize ndns that put the headers into "message/global-headers" part (Improve ndn detection) (#2598)

I sent a message, and the ndn (Non Delivery Notification) was not parsed correctly, so here comes
the fix and the test.
This commit is contained in:
Hocuri
2021-09-12 21:02:51 +02:00
committed by GitHub
parent 6f3dd7f0c2
commit 46956caf75
3 changed files with 114 additions and 5 deletions

View File

@@ -2792,6 +2792,18 @@ mod tests {
.await;
}
#[async_std::test]
async fn test_parse_ndn_testrun_2() {
test_parse_ndn(
"alice@example.org",
"bob@example.org",
"Mr.5xqflwt0YFv.IXDFfHauvWx@testrun.org",
include_bytes!("../test-data/message/testrun_ndn_2.eml"),
Some("Undelivered Mail Returned to Sender This is the mail system at host hq5.merlinux.eu.\n\nI'm sorry to have to inform you that your message could not\nbe delivered to one or more recipients. It's attached below.\n\nFor further assistance, please send mail to postmaster.\n\nIf you do so, please include this problem report. You can\ndelete your own text from the attached returned message.\n\n The mail system\n\n<bob@example.org>: Host or domain name not found. Name service error for\n name=echedelyr.tk type=AAAA: Host not found"),
)
.await;
}
// ndn = Non Delivery Notification
async fn test_parse_ndn(
self_addr: &str,

View File

@@ -1141,11 +1141,11 @@ impl MimeMessage {
report: &mailparse::ParsedMail<'_>,
) -> Result<Option<FailureReport>> {
// parse as mailheaders
if let Some(original_msg) = report
.subparts
.iter()
.find(|p| p.ctype.mimetype.contains("rfc822") || p.ctype.mimetype == "message/global")
{
if let Some(original_msg) = report.subparts.iter().find(|p| {
p.ctype.mimetype.contains("rfc822")
|| p.ctype.mimetype == "message/global"
|| p.ctype.mimetype == "message/global-headers"
}) {
let report_body = original_msg.get_body_raw()?;
let (report_fields, _) = mailparse::parse_headers(&report_body)?;