public void TestSerializedContent () { const string expected = "Reporting-MTA: dns; mm1\nArrival-Date: Mon, 29 Jul 1996 02:12:50 -0700\n\nFinal-Recipient: RFC822; [email protected]\nAction: failed\nDiagnostic-Code: X-LOCAL; 500 (err.nosuchuser)\n\n"; var mds = new MessageDeliveryStatus (); var recipient = new HeaderList (); var status = new HeaderList (); status.Add ("Reporting-MTA", "dns; mm1"); status.Add ("Arrival-Date", DateUtils.FormatDate (new DateTimeOffset (1996, 7, 29, 2, 12, 50, new TimeSpan (-7, 0, 0)))); recipient.Add ("Final-Recipient", "RFC822; [email protected]"); recipient.Add ("Action", "failed"); recipient.Add ("Diagnostic-Code", "X-LOCAL; 500 (err.nosuchuser)"); mds.StatusGroups.Add (status); mds.StatusGroups.Add (recipient); Assert.IsTrue (mds.StatusGroups.Contains (status), "Expected the groups to contain the per-message status group."); Assert.IsTrue (mds.StatusGroups.Contains (recipient), "Expected the groups to contain the recipient status group."); Assert.IsFalse (mds.StatusGroups.IsReadOnly, "The status groups should not be read-only."); using (var memory = new MemoryStream ()) { mds.ContentObject.DecodeTo (memory); var text = Encoding.ASCII.GetString (memory.GetBuffer (), 0, (int) memory.Length).Replace ("\r\n", "\n"); Assert.AreEqual (expected, text); } var dummy = new HeaderList (); dummy.Add ("Dummy-Header", "dummy value"); mds.StatusGroups.Add (dummy); Assert.IsTrue (mds.StatusGroups.Contains (dummy), "Expected the groups to contain the dummy group."); Assert.IsTrue (mds.StatusGroups.Remove (dummy), "Expected removal of the dummy group to be successful."); var expectedContent = mds.ContentObject; dummy.Add ("Bogus-Header", "bogus value"); Assert.AreEqual (expectedContent, mds.ContentObject, "The content should not have changed since the dummy group has been removed."); mds.StatusGroups.Clear (); using (var memory = new MemoryStream ()) { mds.ContentObject.DecodeTo (memory); var text = Encoding.ASCII.GetString (memory.GetBuffer (), 0, (int) memory.Length).Replace ("\r\n", "\n"); Assert.AreEqual (string.Empty, text); } }
/// <summary> /// Visit the message/delivery-status MIME entity. /// </summary> /// <remarks> /// Visits the message/delivery-status MIME entity. /// </remarks> /// <param name="entity">The message/delivery-status MIME entity.</param> protected internal virtual void VisitMessageDeliveryStatus(MessageDeliveryStatus entity) { VisitMimePart(entity); }
/// <summary> /// Visit the message/delivery-status MIME entity. /// </summary> /// <remarks> /// Visits the message/delivery-status MIME entity. /// </remarks> /// <param name="entity">The message/delivery-status MIME entity.</param> protected internal virtual void VisitMessageDeliveryStatus (MessageDeliveryStatus entity) { VisitMimePart (entity); }
private static BounceDetectResult DetectQmailBounce(MimeMessage message, TextPart textPart) { if (textPart.ContentType.MimeType != "text/plain") return null; var text = textPart.Text; if (!text.StartsWith("Hi. This is the ")) return null; var match = QmailBounceRegex.Match(text); if (!match.Success) return null; var parts = BreakParagraphRegex.Split(text, 2).ToArray(); if (parts.Length != 2) return null; var paragraphs = ParagraphRegex.Split(parts[0]); var recipientParagraphs = paragraphs.Skip(1).ToArray(); var undeliveredMessage = ReadMessage(parts[1]); var messageDeliveryStatus = new MessageDeliveryStatus(); // add per-message status fields. messageDeliveryStatus.StatusGroups.Add( new HeaderList { { "Reporting-MTA", "dns;" + match.Groups[1].Value } }); // add per-recipient status fields. var failureParagraphs = recipientParagraphs .Select(ParseFailureParagraph) .Where(p => p != null) .ToArray(); foreach (var failureParagraph in failureParagraphs) { messageDeliveryStatus.StatusGroups.Add( new HeaderList { { "Action", "failed" }, { "Status", failureParagraph.Status }, { "Final-Recipient", "rfc822;" + failureParagraph.RecipientAddress }, { "Diagnostic-Code", "X-QMail;" + LinesRegex.Replace(failureParagraph.Message, " ").Trim() }, }); } if (failureParagraphs.Length == 0) { messageDeliveryStatus.StatusGroups.Add( new HeaderList { { "Action", "failed" }, { "Status", "5.3.0" }, { "Diagnostic-Code", "X-QMail; No failure paragraphs found" }, }); } return new BounceDetectResult( message, new TextPart("plain", parts[0]), messageDeliveryStatus, new MessagePart("rfc822", undeliveredMessage)); }