![]() |
Chilkat HOME Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi DLL Go Java Node.js Objective-C PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Visual FoxPro) Processing a multipart/report Delivery Status Notification (Bounce Notification)See more Email Object ExamplesThis example discusses the format of Delivery Status Notification emails and how to process them.Note: This example requires Chilkat v11.0.0 or greater.
LOCAL lnSuccess LOCAL loEmail LOCAL loH2t LOCAL loJsonDsnInfo LOCAL lcHeadersText LOCAL loMime LOCAL loOrigEmail lnSuccess = 0 * Here are the MIME structures, showing the content-type and nesting of the MIME parts of three sample * multipart/report DSN (Delivery Status Notification) emails. * This 1st sample includes a "text/rfc822-headers" MIME subpart. * multipart/report * text/plain * message/delivery-status * text/rfc822-headers * message/rfc822 * This 2nd sample lacks the text/rfc-headers part, but the "report type" information * is offered in both plain-text and HTML formats. * multipart/report * multipart/alternative * text/plain * text/html * message/delivery-status * message/rfc822 * ---------------------------------------------------------------------------------------------------- * A multipart/report MIME delivery status notification follows a specific format defined by the Internet Engineering Task Force (IETF) in RFC 3464, * which outlines the "An Extensible Message Format for Delivery Status Notifications" standard. The format consists of multiple parts within a * multipart/report structure. Here's an overview of the main parts involved: * * The 1st sub-part under multipart/report is the body of the DSN to be displayed by the email client (such as Outlook). * It can be a simple text/plain body, or it can be multipart/alternative and offer a few alternative format, typically plain-text and HTML. * HTML is best for viewing a program such as Outlook. * This part of the multipart/report is not structured for programmatic processing. It's meant to be viewed by a human. * -------------------- * The "message/delivery-status" part within a multipart/report MIME structure follows a specific format to provide details about the delivery status * of an email message. Here's an overview of the format and the key components within the "message/delivery-status" part: * * (1) Content-Type and Reporting-UA: * The "message/delivery-status" part begins with the Content-Type header specifying "message/delivery-status". * It may also include a Reporting-UA (Reporting User Agent) field that identifies the software or system generating the delivery status notification. * * For example: * * Content-Type: message/delivery-status * Reporting-UA: Example Mail System 1.0 * * (2) Fields: * The "message/delivery-status" part contains a series of fields, each providing specific information about the delivery status. * These fields are structured as key-value pairs. * * Common fields include: * * Final-Recipient: Specifies the recipient for whom the delivery status is being reported. * Action: Describes the action performed by the reporting system (e.g., failed, delivered, delayed, etc.). * Status: Indicates the status code or reason for the delivery attempt result. * Remote-MTA: Specifies the host or system that attempted the delivery. * Diagnostic-Code: Provides additional diagnostic information, such as error codes or explanations. * * For example: * * Final-Recipient: rfc822; john.doe@example.com * Action: failed * Status: 5.1.1 * Remote-MTA: smtp.example.com * Diagnostic-Code: smtp; 550 Requested action not taken: mailbox unavailable * * (3) Additional Fields: * Additional fields may be included in the "message/delivery-status" part to provide further information about the delivery attempt. * These fields can vary depending on the implementation or specific needs of the system generating the delivery status notification. * For example: * * X-Spam-Flag: YES * X-Spam-Score: 7.2 * * Note: The specific fields and their values within the "message/delivery-status" part can vary depending on the implementation * or the email server/application generating the delivery status notification. The structure described above represents the standard format * as defined in RFC 3464, but variations may exist in practice. * -------------------- * The "text/rfc822-headers" MIME part, if included, contains the headers of the original email message * for which the delivery status notification is being generated. It provides a subset of the headers from the original message, * typically excluding the message body and attachments. * * The purpose of including the "text/rfc822-headers" part is to provide contextual information about the original message. * It allows the recipient to review the original headers, such as the subject, sender, recipients, date, and other relevant information, * in order to understand the context and details of the email message for which the delivery status notification is being generated. * * Note that the specific headers included in the "text/rfc822-headers" part can vary based on the implementation or requirements * of the system generating the delivery status notification. * -------------------- * If the message/rfc822 part is present, it contains the full MIME of the email that was not delivered. * In Chilkat terminology, this is an attached message. * OK, let's write code to process a multipart/report email. loEmail = CreateObject('Chilkat.Email') lnSuccess = loEmail.LoadEml("qa_data/eml/deliveryStatus.eml") * success = email.LoadEml("qa_data/eml/sample_multipart_report.eml"); IF (lnSuccess = 0) THEN ? loEmail.LastErrorText RELEASE loEmail CANCEL ENDIF * Verify this is a multipart/report email.. IF (loEmail.IsMultipartReport() = 0) THEN ? "Not a multipart/report email." RELEASE loEmail CANCEL ENDIF * Get the body that is to be displayed to a human in an email program (such as Outlook). IF (loEmail.HasPlainTextBody() = 1) THEN ? "Plain text body:" * println email.GetPlainTextBody(); ELSE IF (loEmail.HasHtmlBody() = 1) THEN * Convert HTML to plain-text.. loH2t = CreateObject('Chilkat.HtmlToText') ? "HTML body converted to plain-text:" ? loH2t.ToText(loEmail.GetHtmlBody()) ELSE ? "Has no plain-text or HTML body..." ENDIF ENDIF ? "---------------------------------" * Now get information from the message/delivery-status part (or the message/disposition-notification part) ? "--- Delivery Status Information:" ? "Status: " + loEmail.GetDeliveryStatusInfo("Status") ? "Action: " + loEmail.GetDeliveryStatusInfo("Action") ? "Reporting-MTA: " + loEmail.GetDeliveryStatusInfo("Reporting-MTA") loJsonDsnInfo = CreateObject('Chilkat.JsonObject') loEmail.GetDsnInfo(loJsonDsnInfo) loJsonDsnInfo.EmitCompact = 0 ? loJsonDsnInfo.Emit() ? "---------------------------------" * If the multipart/report contains a text/rfc822-headers, it can be retrieved like this: lcHeadersText = loEmail.GetNthTextPartOfType(0,"text/rfc822-headers",0,0) IF (loEmail.LastMethodSuccess = 1) THEN ? "The text/rfc822-headers part exists.." ? "" ? lcHeadersText * If you wish to process the headers, you can load them into a MIME object and use the Chilkat MIME functionality to examine the headers. loMime = CreateObject('Chilkat.Mime') loMime.LoadMime(lcHeadersText) * Do whatever you want.. * For example, look at the "To" header. ? "MIME To header:" ? loMime.GetHeaderField("To") ENDIF ? "---------------------------------" * Finally, if the original email was attached, you can load it into another Chilkat Email object instance and * do what you want with it.. IF (loEmail.NumAttachedMessages > 0) THEN * Get the 1st attachment message (assume we don't have more than one attached message) loOrigEmail = CreateObject('Chilkat.Email') lnSuccess = loEmail.GetAttachedEmail(0,loOrigEmail) IF (lnSuccess = 1) THEN ? "Attached message subject: " + loOrigEmail.Subject * Do whatever else you want.. ENDIF ENDIF RELEASE loEmail RELEASE loH2t RELEASE loJsonDsnInfo RELEASE loMime RELEASE loOrigEmail |
© 2000-2025 Chilkat Software, Inc. All Rights Reserved.