Previous | Next | Contents | Index |
Messages stored in PMDF's message queues are removed from those queues by dequeuing them. This is typically done by channel programs.8 When a message is dequeued, it is literally removed from PMDF's message queues and, as far as PMDF is concerned, no longer exists. This means that dequeuing a message relieves PMDF of all further responsibility for the message---the responsibility is assumed to have been passed on to another mailer, gateway, or user agent.
The message queue serviced by a program is determined from
"out-of-band" information. For instance, under OpenVMS the
queue to be serviced is determined through the
PMDF_CHANNEL
logical whose translation value gives the
name of the channel to service. On UNIX and NT, the channel name is
given by the PMDF_CHANNEL
environment variable.
The steps taken to dequeue messages are as follows:
PMDFinitialize
.
PMDFdequeueInitialize
.
PMDFgetMessage
. This step also
reads the envelope From:
address from the accessed message.
To:
addresses and processing flags are
read by repeatedly calling PMDFgetRecipient
and
PMDFgetRecipientFlags
;
PMDFreadLine
or PMDFreadText
until the first
blank line is encountered, or by calling PMDFreadHeader
to
read the entire header at once; and
PMDFreadLine
or PMDFreadText
.
PMDFreadFailureLog
.
To:
address with
repeated calls to PMDFrecipientDisposition
.
PMDFdequeueMessageEnd
.
PMDFdequeueEnd
.
PMDFdone
.
When the disposition of each envelope To:
address is
determined, it should be reported to PMDF by calling
PMDFrecipientDisposition
. The recognized dispositions are
given in the description of the PMDFrecipientDisposition
routine and are repeated below.
Symbolic name | Value | Description |
---|---|---|
PMDF_DISP_DEFERRED | 1 | Recipient address processing has failed because of a temporary problem ( e.g., network down, remote host unreachable, mailbox busy, etc.); defer processing of this address until later. |
PMDF_DISP_DELIVERED | 2 | Recipient address was successfully delivered; generate a delivery status notification if required. |
PMDF_DISP_FAILED | 3 | Recipient address processing has failed because of a permanent problem ( e.g., invalid recipient address, recipient over quota, etc.); no further delivery attempts should be made for this address. Generate a non-delivery notification if required. |
PMDF_DISP_RELAYED | 4 | Recipient address was forwarded to another address or gatewayed into a non-NOTARY mail system. The message's NOTARY information was preserved - there is no need to generate a "relayed" notification message. |
PMDF_DISP_RELAYED_FOREIGN | 5 | Recipient address was forwarded to another address or gatewayed to a non-NOTARY mail system. The message's NOTARY information was not preserved - generate a "relayed" notification message if required. |
PMDF_DISP_RETURN | 6 | For this recipient, return the message as undeliverable; generate a non-delivery notification if required. |
When PMDFdequeueMessageEnd
is called, the resulting
processing depends upon the disposition of the envelope
To:
recipient addresses as reported with
PMDFrecipientDisposition
. If all recipient addresses have
a permanent disposition (PMDF_DISP_DELIVERED
,
PMDF_DISP_FAILED
, PMDF_DISP_RELAYED
,
PMDF_DISP_RELAYED_FOREIGN
, or
PMDF_DISP_RETURN
), then any required notifications are
generated and the message is permanently removed from the processing
queue. If all recipients are to be deferred
PMDF_DISP_DEFERRED
, then no notifications are generated
and the message is left in the queue for later re-processing. If some
recipients have a permanent disposition while others were deferred, then
If the program needs to abort message processing, it should call
PMDFdequeueMessageEnd
with a value of true
(1) for the defer argument to that routine. This will
leave the message in the processing queue for later re-processing.
In the loop represented by Step 3, PMDFgetMessage
will
repeatedly return each message in the current queue that requires
processing until there are no more messages to be processed. Each
message in the queue will only be presented once; i.e., a job
will not repeatedly see a message that it has deferred. Multiple jobs
can simultaneously run and process the same message queue: PMDF will
automatically prevent two or more jobs from simultaneously processing
the same message. When PMDFgetMessage
is called, the
accessed message is locked so that no other jobs can access that
message. The message is unlocked when
PMDFdequeueMessageEnd
is called, or when the job exits
(abnormally or otherwise).
Generally, programs which perform dequeue processing do not run
indefinitely but rather exit after processing all messages in a
specific queue. If it's necessary to write a program that never exits
and does dequeue processing, then PMDFdequeueEnd
,
PMDFcloseQueueCache
, PMDFcloseLogFile
should
be called after looping over every message in a message queue. When
it's time to try processing the message queue again,
PMDFdequeueInitialize
should be called before the first
PMDFgetMessage
call.
Examples 1-5, 1-6, 1-8, 1-9, 1-10, and 1-11 all illustrate message dequeue processing.
8 Channel programs comprise a broad class of programs that interface PMDF to other networks, mail systems (MTAs), and user agents (UAs). Gateways are an example of channel programs: channel programs which gateway or otherwise transport mail out of PMDF do so by dequeuing messages and are sometimes referred to as master channels; channel programs which gateway or otherwise transport mail into PMDF do so by enqueuing messages and are sometimes referred to as slave channels. Channel programs can also perform intermediate roles by dequeuing messages from one message queue and requeuing them to another while processing the message at the same time (e.g., converting the message body from one format to another). |
Previous | Next | Contents | Index |