Previous | Next | Contents | Index |
Examples 1-10 and 1-11 illustrate the use of
PMDFdequeueMessageEnd
to return a message to its
originator. A message in the channel's queue is accessed and each of
its envelope "To:" recipients are given a disposition of
PMDF_DISP_RETURN which indicates that the message is undeliverable for
that recipient. Then, when PMDFdequeueMessageEnd
is
called, a bounce message is automatically generated and sent back to
the original message's originator. The original message is then removed
from the queue. Note that no notification message will be generated if
the NOTARY flags for all of the recipients specify PMDF_RETURN_NEVER.
These two particular examples, through the use of
PMDFgetMessage
, return each and every message in a message
queue. A sample returned message is shown in Example 1-12.
It is important to remember to define the PMDF_CHANNEL logical (OpenVMS) or environment variable (UNIX and Windows) to be the name of the channel (in lower case) to be serviced by this program. Also, if experimenting from your own account, do not leave this logical or environment variable defined while not experimenting --- PMDF can see it when you send mail and submit that mail as though it was enqueued by the channel given by PMDF_CHANNEL. (This is a debugging feature.) |
The following items of note are identified with callouts in each of the two programs:
get_message
is a routine which
will return true (1) if PMDFgetMessage
successfully
accesses a message or false (0) otherwise. If
PMDFgetMessage
returns any error other than
PMDF__EOF
, then the check routine is invoked.
PMDFinitialize
is invoked with
the ischannel argument true.
PMDFdequeueInitialize
.
get_message
routine,
the program loops over all messages to be processed.
PMDFdequeueMessageEnd
is called.
Example 1-10 Dequeuing & Returning Messages (Pascal) |
---|
(* api_example7.pas -- Return channel which returns all mail queued to it *) [inherit ('pmdf_exe:apidef')] program api_example7; type uword = [word] 0..65535; string = packed array [1..ALFA_SIZE] of char; var from_adr, orig_adr, to_adr : string; from_adr_len, orig_adr_len, to_adr_len : uword; dq_context : PMDF_dq; empty : varying [1] of char; nflags : integer; function SYS$EXIT (%immed status : integer := %immed 1) : integer; extern; procedure check (stat : integer); (1) var reason : varying [20] of char; begin (* check *) if not odd (stat) then begin writev (reason, 'Error ', stat:0); if dq_context <> nil then PMDF_defer_message (dq_context, true, reason); end; (* if *) end; (* check *) function get_message : boolean; (2) var msg_file : string; msg_file_len : uword; stat : integer; begin (* get_message *) stat := PMDF_get_message (dq_context, msg_file, msg_file_len, from_adr, from_adr_len); get_message := odd (stat); if (not odd (stat)) and (stat <> PMDF__EOF) then check (stat); end; (* get_message *) begin (* api_example7 *) dq_context := nil; empty := ''; check (PMDF_initialize (true)); (3) check (PMDF_dequeue_initialize (dq_context)); (4) while get_message do begin (5) while odd (PMDF_get_recipient (dq_context, to_adr, to_adr_len, (6) orig_adr, orig_adr_len)) do begin check (PMDF_get_recipient_flags (dq_context, nflags)); (7) check (PMDF_recipient_disposition (dq_context, nflags, (8) PMDF_DISP_RETURN, substr (to_adr, 1, to_adr_len), substr (orig_adr, 1, orig_adr_len), 'Message undeliverable; returned by the postmaster')); end; (* while *) check (PMDF_dequeue_message_end (dq_context, false, empty)); (9) end; (* while *) check (PMDF_dequeue_end (dq_context)); (10) check (PMDF_done); end. (* api_example7 *) |
Example 1-11 Dequeuing & Returning Messages (C) |
---|
/* api_example8.c -- Return channel which returns all mail queued to it */ #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef __VMS #include "pmdf_com:apidef.h" #else #include "/pmdf/include/apidef.h" #endif typedef char string[ALFA_SIZE+1]; string from_adr; int from_adr_len, item_index; PMDF_dq *dq_context = 0; void check (int stat) (1) { char reason[20]; if (!(1 & stat)) { sprintf (reason, "Reason %d", stat); if (dq_context) PMDFdeferMessage (&dq_context, 1, reason, strlen (reason)); if (!stat) exit (0); else exit (stat); } } int get_message (void) (2) { string msg_file; int msg_file_len, stat; msg_file_len = from_adr_len = ALFA_SIZE; stat = PMDFgetMessage (&dq_context, msg_file, &msg_file_len, from_adr, &from_adr_len); if (!(1 & stat) && stat != PMDF__EOF) check (stat); return (1 & stat); } main () { string orig_adr, to_adr; int i, nflags, orig_adr_len, to_adr_len; channel_len = ALFA_SIZE; check (PMDFinitialize (1)); (3) check (PMDFdequeueInitialize (&dq_context)); (4) while (get_message ()) { (5) item_index = 0; to_adr_len = orig_adr_len = ALFA_SIZE; while (1 & PMDFgetRecipient (&dq_context, to_adr, &to_adr_len, (6) orig_adr, &orig_adr_len)) { check (PMDFgetRecipientFlags (&dq_context, &nflags)); (7) check (PMDFrecipientDisposition (&dq_context, nflags, (8) PMDF_DISP_RETURN, to_adr, to_adr_len, orig_adr, orig_adr_len, "Message undeliverable; returned by the postmaster", 49)); to_adr_len = orig_adr_len = ALFA_SIZE; } check (PMDFdequeueMessageEnd (&dq_context, 0, "", 0)); (9) } check (PMDFdequeueEnd (&dq_context)); (10) check (PMDFdone ()); } |
Example 1-12 shows a sample return message generated by
PMDFreturnMessage
. In that example, the following items
are marked with callouts: the message header, (1); a MIME
header line indicating that the message is a multi-part message,
(2); the first body part which contains a human readable
explanation as to why the message was returned, (3); the
second body part which contains a machine readable explanation as to
why the message was returned, (4); and the third body
part containing the message being returned, (5).
Example 1-12 Output of Examples 1-10 and 1-11 |
---|
Received: from example.com (PMDF V6.1 #8790) (1) id <01IXGG2X55A88Y55Z3@example.com>; Sat, 04 May 2012 18:04:00 EDT Date: Sat, 04 May 2012 18:04:00 EDT From: PMDF Internet Messaging <postmaster@example.com> Subject: Delivery Notification: Delivery has been manually aborted To: Trinculo@example.com, postmaster@example.com Message-id: <01IXGG2Y8J468Y55Z3@example.com> MIME-version: 1.0 Content-type: MULTIPART/REPORT; REPORT-TYPE=DELIVERY-STATUS; (2) BOUNDARY="Boundary_(ID_78nMbcjsTsCboulbhJC84A)" --Boundary_(ID_78nMbcjsTsCboulbhJC84A) (3) Content-type: text/plain; charset=us-ascii Content-language: EN-US This report relates to a message you sent with the following header fields: Message-id: <01IXGGR0TSYS8Y55Z3@example.com> Date: Sat, 04 May 2012 18:04:00 -0400 (EDT) From: Trinculo@example.com To: Stephano@example.com Subject: Meeting next Wednesday Your message is being returned. It was forced to return by the postmaster. The recipient list for this message was: Recipient address: Stephano@example.com Reason: Message undeliverable; returned by the postmaster --Boundary_(ID_78nMbcjsTsCboulbhJC84A) (4) Content-type: message/DELIVERY-STATUS Original-envelope-id: 01IXGFBILT3M8Y55Z3@example.com Reporting-MTA: dns;example.com Action: failed Status: 5.0.0 (Message undeliverable; returned by the postmaster) Original-recipient: rfc822;Stephano@example.com Final-recipient: rfc822;Stephano@example.com --Boundary_(ID_78nMbcjsTsCboulbhJC84A) (5) Content-type: text/rfc822-headers Return-path: Trinculo@example.com Received: from example.com by example.com (PMDF V6.1 #8790) id <01IXGG2X55A88Y55Z3@example.com> (original mail from Trinculo@example.com); Sat, 04 May 2012 18:04:00 EDT Received: from example.com by example.com (PMDF V6.1 #8790) id <01IXGFBIKQIO8Y55Z3@example.com> for Stephano@example.com; Sat, 04 May 2012 18:04:00 EDT Date: Sat, 04 May 2012 18:04:00 -0400 (EDT) From: Trinculo@example.com Subject: Meeting next Wednesday To: Stephano@example.com Message-id: <01IXGFBILT3M8Y55Z3@example.com> MIME-version: 1.0 Content-type: TEXT/PLAIN; CHARSET=US-ASCII Can we reschedule the meeting of comic relief characters to be at 14:30? --Boundary_(ID_78nMbcjsTsCboulbhJC84A)-- |
Previous | Next | Contents | Index |