[Search for users]
[Overall Top Noters]
[List of all Conferences]
[Download this site]
Title: | DEC TCP/IP Services for OpenVMS |
Notice: | Note 2-SSB Kits, 3-FT Kits, 4-Patch Info, 7-QAR System |
Moderator: | ucxaxp.ucx.lkg.dec.com::TIBBERT |
|
Created: | Thu Nov 17 1994 |
Last Modified: | Fri Jun 06 1997 |
Last Successful Update: | Fri Jun 06 1997 |
Number of topics: | 5568 |
Total number of notes: | 21492 |
5457.0. "An SMTP README for those supportinG UCX SMTP" by UCXAXP::ZIELONKO () Wed Apr 23 1997 06:29
Hi,
For a long time the lack of complete UCX SMTP documentation suitable for someone
who really wants to know what's going on has been bugging me. To this end I have
finally bitten the bullet and written up a brain dump on UCX SMTP - an
SMTP_README. Alot of this stuff is mentioned in other notes here and there and
every where. It contains "internals" type stuff, problem diagnopsisi type stuff,
configuration information and tips. It is intended mostlly for people solving
UCX SMTP problems.
It got to be very long - over 3000 lines so you may want to print it out and
read it in bits.
As changes are made to the code this file will be updated.
I have passed this information on to the UCX Doc's team to reduce and include in
the UCX SMTP doc's.
Karol
And awaaaaaaayy we go-o-o-o-!
Date: April, 14 1997
Author: Karol Zielonko
UCX-Version: V4.1 ECO 4, V4.2 SSB
------------
Contents
------------
Introduction
Part 1: SMTP Overview
What is SMTP?
What is MIME?
SMTP Protocol Overview
SMTP Protocol Overview
SMTP Client commands
SMTP Server Replies
SMTP Message Format
SMTP Mail Addresses
Local-part Notes
Domain Notes
Miscellaneous Addressing Topics
Source Routing
MX Record Overview
MX Example 1
MX Example 2
MX Example 3
Part 2: UCX SMTP
UCX SMTP's interface with VMS mail environment
Format of VMS mail message
Storing SMTP messages in VMS mail: Big square peg and small round hole.
UCX SMTP and callable VMS mail
Callable VMS mail overview
UCX SMTP's use of mail$send routines of callable mail
VMS mail Foreign Transport/MAIL$PROTOCOL Interface
VMS mail Foreign Transport
MAIL$PROTOCOL Interface
UCX SMTP Control File
CF Filenames - what they mean.
Control file layout
Address Area
Header Area
Text Area
Components of UCX SMTP
The UCX SMTP symbiont/queues
The UCX SMTP Receiver
The UCX SMTP MAIL$PROTOCOL code
The UCX SMTP control file code
UCX MX Lookup
Displaying MX records with UCX
Local vs. non-local SMTP mail
The SMTP Alternate Gateway/Zone
How UCX decides where to send non-local mail
How the symbiont sends a mail using the UCX MX Lookup gateway list
How the symbiont sends a mail through the alternate gateway
Further enhancements in worklist for mail destined for alternate gateway
Forwarding to an SMTP address
UCX SMTP and non-SMTP mail
SMTPfication of non-SMTP addresses
Example SMTPfications
When is SMTPfication necessary?
Mail from non-SMTP to SMTP
An example
SMTPfication as simple, generic mechanism for gatewaying mail
Mail from SMTP to non-SMTP
Another SMTP to non-SMTP case
Miscellaneous SMTP/non-SMTP issues
SMTP/non-SMTP worklist items
Undeliverable Mail
Configuring UCX SMTP
UCX SMTP Common directory
Local Aliases File
UCX SMTP Configuration database entry (UCX SET CONFIG SMTP)
Postmaster field
UCX SMTP configuration logicals
Miscellaneous VMS mail notes
VMS mail native support for SMTP addresses
Setting forwarding to an SMTP address
Miscellaneous SET FORWARD/USER tricks
The UCX SMTP cent sign hack
User use of the cent sign hack
UCX SMTP mailing lists
VMS Majordomo
Miscellaneous Stuff
Queue watcher program
Terms
--------------------------------------------------------------------------------
Introduction
--------------------------------------------------------------------------------
This document is for system managers who will be supporting VMS systems running
the UCX SMTP product. It is divided into two parts. The first part gives a
general overview of SMTP and the second part discusses UCX SMTP specifics. If
you are already familiar with SMTP and Internet mail you may want to skim or
skip the first part entirely.
This document mentions "UCX worklist items". These are meant to inform and not
to be taken as a commitment to do any particular item according to any time
schedule.
--------------------------------------------------------------------------------
Part 1: SMTP Overview
--------------------------------------------------------------------------------
This part gives a general overview of SMTP and Internet mail. It provides
information that is not specific to any operating system or implementation of
SMTP. It is a summary, a primer, an overview. It does not cover every detail.
Those who wish to know more are urged to look at the RFCs.
----------------------------------------
What is SMTP?
----------------------------------------
SMTP (for Simple Mail Transfer Protocol) is the Internet's mail transfer
protocol. The protocol itself is specified in RFC 821. The format for the text
of a mail message carried by an SMTP MTA is specified in RFC822. These RFCs are
amended by RFC 1123 Chapter 5.
----------------------------------------
What is MIME?
----------------------------------------
MIME (for Multipurpose Internet Mail Extensions) specifies an extension to RFC
822 to allow for mail message content other than simple 7 bit ASCII. It is
specified in RFCs 1521, 1522 and 1523. A MIME message is by definition RFC 822
compliant.
UCX SMTP currently has no special handling for MIME content and doesn't need to
since UCX SMTP is an MTA and creation/interpretation of mail message content is
not the job of an MTA. Therefore, discussion of MIME is outside the scope of
this document.
----------------------------------------
SMTP Protocol Overview
----------------------------------------
SMTP is a store and forward mail protocol which means that mail is routed** from
the originating host through 0 or more intermediate hosts before it reaches its
final destination host. Contrast this with DECnet's MAIL11 protocol where mail
is sent directly from the originating node to the destination node.
** This document uses the terms "route" and "relay" interchangably to refer to
SMTP application layer transfer of mail messages from one host to the next to
the next, etc. The term routing does not denote IP layer routing.
Some advantages of a store and forward mail system are:
Mail can be sent between hosts that cannot connect directly to one another,
for example when the originating and destination hosts are on opposite sides
of a firewall.
If the destination host is not available when mail is sent to it the mail can
be queued up on one of the intermediate hosts (or the originating host). The
MTA on the host where the mail is queued up will retry periodically and when
the destination host is available again the mail will go through.
Conventionally MTA's will continue to try to send a mail for some locally
configurable period of time after which the mail is bounced as undeliverable.
One advantage of a non store and forward mail system is that the sending user
knows immediately whether or not a mail message has been delivered to the
destination. This feature however can also be provided by SMTP if both the
originating and destination hosts support the Return-Receipt: message header.
Intermediate hosts need not support Return-Receipt. Currently UCX SMTP doesn't
support Return-Receipt but it is in the worklist.
The SMTP protocol is a set of simple ASCII commands and replies. A TCP
connection is requested by the SMTP client and accepted by the SMTP server
listening on port 25. The SMTP client sends the commands and the server replies
to them. The SMTP protocol uses TCP as its transport protocol and an SMTP server
listens on port 25.
--------------------
SMTP Client commands
--------------------
There are five commands which are essential for the transmission of SMTP mail.
They are "HELO", "MAIL FROM", "RCPT TO", "DATA" and "QUIT". Command descriptions
follow. The commands appear in upper case and the command parameters (where
applicable) in lower case.
HELO domain
domain The name of the sending (ie. client) host.
With the HELO command the client identifies itself to the server.
MAIL FROM:<reverse-path>
<reverse-path> The mail address to which the mail should be bounced if
it cannot be delivered. When the mail is delivered to
the destination host mailbox the address in the
reverse-path becomes the Return-Path mail header.
The angle brackets are required.
With the MAIL FROM command the client tells the server where to bounce the
mail. Only one MAIL FROM command per mail message is allowed. It *is* allowed
for the MAIL FROM to be "null". That is, "MAIL FROM:<>". This is required
when a mail message is bounced to prevent bounced mail about bounced mail.
That is, when an SMTP MTA tries to deliver a mail message and can't do so the
message must be "bounced" or sent back to the sender. The MTA that bounces
the mail creates a bounced mail message and the MAIL FROM address used in the
SMTP protocol dialog when sending this bounced mail is MAIL FROM:<>. This
indicates to any SMTP MTA that receives the bounced mail message that it
canot be further bounced. How that SMTP MTA deals with the situation where it
has a message with a null return path (ie. a null MAIL FROM address) is up to
the SMTP MTA.
RCPT TO:<forward-path>
<forward-path> A mail address to which the mail message should be
delivered.
The angle brackets are required.
With the RCPT TO commands the client tells the server where to deliver the
mail. For cases where mail is to be sent to multiple recipients there must be
one RCPT TO command sent for each recipient. That is, the RCPT TO command
cannot contain multiple addresses.
Note that although the mail message text itself may contain a To: header (or
other destination type header, eg Resent-To:) it is the address(es) in the
RCPT TO command(s) that the SMTP MTA sends the mail to.
DATA
The DATA command signals the end of the RCPT TO commands and tells the server
to prepare to receive the mail message itself.
When the client sends the DATA command the server returns a 354 Intermediate
reply (see "SMTP Server Replies"). At this point the client sends the lines
of the mail message. The end of each line of text is indicated by a <CRLF>.
The client indicates the end of the mail message by sending a '.' on a line
by itself (<CRLF>.<CRLF>). Note that the '.' and the following <CRLF> are
not part of the mail message itself. They simply constitute an SMTP protocol
"end of file" marker.
Once the SMTP server receives the <CRLF>.<CRLF> indicating the end of the
mail message it must acknowledge the receipt of the message and accept
responsibility for its delivery. It does so by returning a "250 OK" reply.
When the client receives this reply it knows that responsibility for delivery
of the mail now belongs to the server. At this point the client is free to
send another MAIL FROM command for the next mail message or to send a QUIT
command.
QUIT
With the QUIT command the client indicates it has no more commands to send.
On receipt of this command the server must send an OK reply and close the
connection.
The other commands described in RFC 821 are either non-essential or
inconsequential to our discussion of SMTP here.
Miscellaneous Protocol Notes:
- The SMTP client commands must end in <CRLF>.
- The SMTP server replies must end in <CRLF>.
- Text lines within the mail message must end in <CRLF>.
- Each text line in the mail message has a maximum length of 1000 characters
including the <CRLF>.
- The client must send the commands in this order - HELO, MAIL FROM, RCPT TO
and DATA.
- The addresses in the MAIL FROM and RCPT TO commands make up what is often
refered to as the "envelope". As stated above the addresses in these commands
hold the real destination and return (ie. bounce) addresses for the mail. An
SMTP MTA must save this information outside of the message itself.
It is not required that the addresses from the envelope match any addresses
in the headers sent with the mail. Take the case of a mailing list where the
RFC To: header is the name of the list itself but the RCPT TO addresses are
the names of the individual recipients. The From: field is the username of
the sender and the Reply-To field is the list itself. But the MAIL FROM
address is the username of the "owner" of the mailing list so that if any of
the recipients bounce the owner of the list (not the sender or the list
itself) receives the bounced mail.
- The Return-Path header is special in one respect that bears repeating. No
Return-Path header is ever sent via an SMTP protocol dialog in the SMTP
message headers. The Return-Path header is manually added into the list of
headers when the message reaches its final destination. When depositing an
SMTP mail message into the destination mailbox the destination host SMTP MTA
manually constructs a Return-Path header using the address of the MAIL FROM
command and puts that header into the mail message's headers. In the case
where a message is being routed by an SMTP MTA to another host the MAIL FROM
address is propagated as it was received when the mail came in.
--------------------
SMTP Server Replies
--------------------
Each SMTP command elicits a reply from the SMTP server. The format for the SMTP
server reply is
"nnn text"
where
"nnn" is a string of three ASCII digits known as the reply code.
"text" is free form ASCII text for the convenience of humans. The contents of
text are not specified by any RFC.
The individual digits in the reply code each have their own significance and are
interpreted separately. Only the first digit must be interpreted by the client.
It has four legal values - 2, 3, 4 and 5. The meanings of the first digit of the
reply code follow:
Value Meaning Comments
2 Postive Completion Requested action completed successfully
3 Positive Intermediate Requested action accepted. More info
needed from client. **
4 Transient Negative Completion Request failed due to temporary error
condition. Eg. Disk full. Client should
try again later.
5 Permanent Negative Completion Request failed due to permanent error
condition. Eg. No such user as the user
specified in the RCPT TO address. Client
should bounce the mail message.
** value 3 is a special case. It is sent only for the DATA command. The
"additional info" required is the text of the mail message itself.
Reply codes are explained in detail in Appendix E of RFC 821.
----------------------------------------
SMTP Message Format
----------------------------------------
RFC 822 specifies the format for an SMTP mail message. (ie. the format of the
data sent after the SMTP DATA client command). In a nutshell a mail message
consists of mail headers followed by a blank line followed by the mail body.
(The body is the text of the message.)
Mail headers are fixed format text lines which contain addressing, control,
diagnostic, identification and other miscellaneous information about the mail
message. All header lines must conform to a general header syntax specified by
RFC 822. Each header has a field name followed by a ":" followed by a field body
followed by a <CRLF>. For example with the header
Date: Fri, 28 Mar 1997 09:46:15 -0500<CRLF>
The field name is "Date". The field body is "Fri, 28 Mar 1997 09:46:15 -0500".
If the body of the header is to be extended accross multiple lines of text a
<CRLF> may be inserted into the field body followed by at least one "linear
white space" (TAB, space) character. An example of a multi line header is:
Received: by mysystem.someplace.dec.com with Microsoft Mail<CRLF>
id <[email protected]>; Thu, 27 Mar 1997<CRLF>
08:37:20 -0500<CRLF>
Most header bodies have additional syntactic structure imposed on them by RFC
822. The body of the Received: header above is a good example of such a complex
syntax.
Note that the <CRLF> at the end of lines is required by the SMTP protocol.
However, no requirement is made on how the mail is actually *stored* in the
local mailstore on the destination host. If a mail system stores the mail with
<LF> as the end of line character it must change the <LF>'s to <CRLF>'s when
transmitting the mail via SMTP.
----------------------------------------
SMTP Mail Addresses
----------------------------------------
As we have seen SMTP addresses appear in some of the SMTP client commands. They
also appear in many of the SMTP message headers. Understanding SMTP addressing
is essential for the diagnosis and resolution of mail problems.
RFC 822 specifies a comprehensive sytnax for SMTP addresses. An SMTP address
consists of two parts - the local-part and the domain. Syntactically they are
separated by an at sign (@). Ie. local-part@domain.
local-part
The local-part identifies a local delivery point for a mail message. It is
sometimes refered to as the user, username or left hand side. It is also
refered to by RFC 822 as the "domain-dependent string" since its
significance depends on what is understood by the MTA serving the domain
specified in the domain of the address. It should be interpreted only by
the final destination host not by any intermediate hosts through which the
mail is routed.
domain
The domain is sometimes refered to as the right hand side or the hostname.
It specifies either a hostname (or an IP address) where the recipient's
mailbox resides or an MX destination domain where the recipients mailbox
is served. (See "MX Record Overview".) This part of the address is used by
the originating host and any intermediate hosts to decide where to route
the mail.
--------------------
Local-part Notes
--------------------
Quoted and unquoted local parts:
The syntax allowed for a local-part allows a local part to take one of two
forms - a quoted string or an unquoted string. A quoted local part begins and
ends with a quotation mark (aka. double quote (") ). A local part that is
not quoted does not. Here are some example addresses with unquoted local
parts:
[email protected]
[email protected]
Here are some example addresses with quoted local parts:
"SUMNOD::BORIS"@xyzcorp.com
"XYZMTS::MRGATE::\"XYZMTS::MRGATE::NATASHA\""@xyzcorp.com
Rules for quoting the local part:
RFC 822 defines a set of characters which it calls "special characters". They
are:
()<>@,.;:\"[]
If the local part needs to contain any one of these characters except a
dot (.) then it MUST be quoted. (The dot character is a special character
but it is allowed in an unquoted local part. This syntactical exception is
what allows an address like [email protected].)
For example, if the SMTP MTA on xyzcorp.com wants to create an address
with the local part being a DECnet mail address SUMNOD::BORIS it must
quote the local part. Eg:
"SUMNOD::BORIS"@xyzcorp.com
because the local part contains special characters - namely colons.
Nested double quotes in local part:
Say the SMTP MTA on xyzcorp.com needed to make an address with the local part
being an MTS address of
XYZMTS::MRGATE::"XYZMTS::MRGATE::NATASHA"
Not only does this address contain the colons but it also contains double
quotes. This raises the issue of how double quotes are nested. RFC 822
specifies a 'C' like "escape" mechanism to allow for nested double quotes in
quoted strings. To nest a double quote in a quoted string the nested double
quote is preceded with a backslash character (\). So, given the desired local
part above, the address created by the MTA on xyzcorp.com would be:
"XYZMTS::MRGATE::\"XYZMTS::MRGATE::NATASHA\""@xyzcorp.com
UCX SMTP in fact does create such complicated address as the ones in this
section. The reasons for this are discussed in "UCX SMTP and non-SMTP mail".
--------------------
Domain Notes
--------------------
Syntactically the domain part takes one of the following two forms:
1) A DNS type hierarchical name as in "something.xyzcorp.com" in this
address:
[email protected]
2) An IP address as in "[1.2.3.4]" in this address:
jones@[1.2.3.4]
The use of IP addresses in SMTP mail addresses is allowed but strongly
discouraged. The square brackets are required.
--------------------
Miscellaneous Addressing Topics
--------------------
---------------
Source Routing
---------------
SMTP allows (although discourages) two ways for the sending mail user to specify
a particalur route for their mail to take as it goes from the originating host
to the destination host. This capability is called source routing. One syntax is
provided for explicitly in RFC 821. The other is an alternative that is a
defacto standard.
RFC 821 source routing:
RFC 821 and 822 provide for a syntax for source routing:
@a,@b:username@c
where a, b, and c are hosts. With such an address the final destination for
the mail is host c but it first must go to host a and then to host b.
Percent sign hack source routing:
A defacto standard for source routing is also generally supported by most
SMTP MTA's. It is called the %-hack. Its syntax is:
username%c%b@a
where a, b, and c are hosts. With such an address the final destination for
the mail is host c but it first must go to host a and then to host b. Ie.
this example accomplishes the exact same thing as the first.
Both of these syntaxes are supported by UCX SMTP.
----------------------------------------
MX Record Overview
----------------------------------------
SMTP MTA's make use of DNS MX records to assist them in the routing of mail
messages. An MX record tells an MTA where to route mail for a particular
destination domain. The DNS maintains MX records but SMTP MTA's *use* them. An
MX record has the following fields:
destination domain
This field matches the domain part of the address to which a mail is
going. It is essentially the "key" field of the MX record. For
example, if mail is to be sent to [email protected] an MX lookup is
done on the destination domain "xyzcorp.com".
Multiple MX records for the same destination domain are allowed.
Taking the key analogy further this is like saying the destination
domain field allows duplicate keys.
gateway hostname
The name of the host to which mail sent to the destination domain
should be routed.
preference
Prioritizes multiple MX records for the same destination domain. The
lower the preference value the higher the priority for the MX record.
That is, lower preference MX records are tried before higher
preference MX records.
It is allowed to have multiple MX records for the same destination
domain with the same preference.
Some advantages of multiple MX records for the same destination domain are:
1) They enable load balancing between mail routers. This is the case where
there are multiple MX records for the same destination domain with the same
preference.
2) They allow one mail router to be taken down with another left up so that
mail can continue to go through.
3) They provide MX based routes for mail internal and external to a firewall.
--------------------
MX Example 1
--------------------
For example, imagine the following three MX records for the destination domain
"xyzcorp.com":
Destination domain: Gateway: Preference:
xyzcorp.com mailhub1.xyzcorp.com 10
xyzcorp.com mailhub2.xyzcorp.com 10
xyzcorp.com otherhost.xyzcorp.com 20
Given these MX records, any SMTP MTA trying to send mail to the destination
domain xyzcorp.com using MX records should first try to send the mail to either
mailhub1.xyzcorp.com or mailhub2.xyzcorp.com. If that fails the MTA should try
the other of the two "mailhub" hosts. If that too fails it should try
otherhost.xyzcorp.com. If that fails the MTA should requeue the mail message in
its internal queueing mechanism and retry later.
The MX records in this example provide for the advantages of multiple MX records
listed above as number 1 and 2:
1) The fact that mailhub1 and mailhub2 are at the same MX preference provides
mail load balancing between the two hosts. This is because the DNS returns MX
records in a different order each time so that records with the same
preference are not always seen in the same order by the SMTP MTA.
2) Since there are multiple MX records for the domain xyzcorp.com, mail sent
to xyzcorp.com can still be relayed from a sending host to one of the MTA's
within the xyzcorp network as long as any of the xyzcorp hosts are alive.
Mailhub1 can be taken down for maintenance and mail will still continue to
flow through mailhub2.
Given the example MX records it is assumed that at least the lowest preference
mail hubs for the xyzcorp.com domain (ie. mailhub1 and mailhub2) are configured
internally to know how to deliver mail to each user in the xyzcorp.com domain.
For example user [email protected] mail reside on host zzz.xyzcorp.com.
Something on the mailhub system has to exist so that it knows to send mail to
[email protected] to jones on the zzz.xyzcorp.com host. It could be that
xyzcorp's network is small enough so that this can be accomplished with a simple
alias file for all corporate users. (That would be a SET FORWARD/USER=JONES
SMTP%"""[email protected]""" for a VMS system.) Otherwise more complex
mechanisms will need to be configured. These mechanisms depend on the SMTP
implementation running on the hosts and so are beyond the scope of this
document. (The creation of additional MX records as in MX Example 3 is useful in
getting mail from SMTP mail hubs to internal hosts on a large network.)
--------------------
MX Example 2
--------------------
What if both mailhub1 and mailhub2 were down? In this case remote MTA's will try
and fail to send the mail to the mailhub hosts and will succeed in sending the
mail to otherhost.xyzcorp.com. One of two possible scenarioes will occur
depending on how otherhost is configured:
1) If otherhost is configured internally to know how to deliver mail to each
user in the xyzcorp.com domain (as are mailhub1 and mailhub2) it will
deliver mail using this mechanism without further use of MX records.
2) If otherhost is not configured to know how to deliver mail to each user in
the xyzcorp.com domain it will act merely as a holding place for all mail
sent to xyzcorp.com. It will continually retry to route the mail to mailhub1
and mailhub2. As long as both of these systems are down it will continue to
requeue and retry the mail. Eventually either one of the mailhub hosts will
become available again and the mail will be routed there or the retry time
limit on otherhost will expire and the mail will bounce.
--------------------
MX Example 3
--------------------
In this example we switch gears from looking at imaginary xyzcorp's MX records
to Digital's own MX record setup. Here we illustrate the third advantage listed
of multiple MX records for the same destination domain which has to do with
firewall issues. We also illustrate a use of MX records that allows a setup
where corporate mailhubs do not have to know where each individual user lives
thus avoiding the problems mentioned at the end of Example 1.
Here are the MX records for the SMTP destination domain ucx.lkg.dec.com:
Destination domain: Gateway: Preference:
ucx.lkg.dec.com ucxaxp.ucx.lkg.dec.com 50
ucx.lkg.dec.com mail2.digital.com 100
ucx.lkg.dec.com mail1.digital.com 100
ucx.lkg.dec.com crl.dec.com 200
SMTP mail internal to corporate firewall:
Say user boris on host mrbig.ucx.lkg.dec.com sends mail to
[email protected]. Assuming the SMTP MTA on host mrbig uses MX records it
will first try to route the mail to ucxaxp.ucx.lkg.dec.com since that system
is in sole possesion of the lowest preference (ie. highest priority) MX
record for the destination domain of ucx.lkg.dec.com. Since both systems are
within the corporate firewall the smtp connection from mrbig to ucxaxp can be
made and the mail is transfered to ucxaxp. Once there it is delivered as
local mail to user jones.
Note: ucxaxp is a VMS UCX system serving mail for the domain ucx.lkg.dec.com.
See "Configuring UCX SMTP" and "Local vs. non-local SMTP mail" for more
information on how UCX SMTP can be configured to accept mail as local for
a domain that isn't the same as the UCX hostname.)
SMTP mail coming from outside corporate firewall:
Say user bullwinkle on host moose.wassamadda-u.edu sends mail to
[email protected]. Assuming the SMTP MTA on host moose uses MX records it
will first try to route the mail to ucxaxp.ucx.lkg.dec.com just as
mrbig.ucx.lkg.dec.com does. However, in this case connection to ucxaxp fails
because the two hosts are on opposite sides of the Digital firewall. Once the
connection to ucxaxp fails the next MX record is tried. In this case the next
MX record will be for either mail2.digital.com or mail1.digital.com since
they both have the same preference level. Which one is tried depends on which
MX record is returned first from DNS. The connection works because mail1 and
mail2 can accept SMTP connections from outside the firewall. At this point
say the connection is to mail1.digital.com and that the mail is transfered
successfully. Once the transfer is complete the SMTP MTA on mail1.digital.com
repeats the MX lookup process from the start. It sees that the lowest
preference MX record for mail addressed to the domain ucx.lkg.dec.com is for
ucxaxp.ucx.lkg.dec.com and so tries to connect to that host. This time the
direct connaction to ucxaxp works because mail1 can connect to hosts within
the firewall. So, the mail is transfered to ucxaxp and delivered locally to
uses jones as with the previous example.
Note: This example assumes that moose.wassamadda-u.edu is not inside its own
wassamadda-u firewall. However if it is inside a firewall then MX records
alone won't work since moose.wassamadda-u.edu won't be able to connect to
any hosts in the MX records for ucx.lkg.dec.com. In this case the moose
host must be configured to send mail destined to the world outside its
firewall to some host similar to mail1.digital.com that *can* connect
directly to the outside world. How this is done on host moose depends on
the SMTP implementation running there. See "Configuring UCX SMTP" and "How
UCX decides where to send non-local mail" for information on how to do
this for UCX SMTP.
These two examples show how MX records can be used to create different mail
routes depending on whether mail is within or accross the boundaries of
firewalls. It also demonstrates one way that a mail hub straddling a firewall
can be used to accept inbound mail from outside the firewall and route it to the
host inside the firewall that knows how to deliever it without the mailhub
knowing anything about individual users.
MX Record Notes:
- The fields of MX records and handling of them are not case sensitive.
- An MX destination domain may be a DNS host name but it is not requried to
be.
- For information on how to display MX records using UCX see "Displaying MX
records with UCX".
--------------------------------------------------------------------------------
Part 2: UCX SMTP
--------------------------------------------------------------------------------
This section is intended for
- The VMS system manager who is tasked with maintaining a system running UCX
SMTP.
- Anyone tasked with diagnosing problems with UCX SMTP.
The types of information included are:
- VMS implementation details and UCX SMTP implementation details where they
may help problem solvers diagnose problems through understanding of
underlying operations.
- Handy hints and tricks
- Configuration suggestions
- Examples to illustrate points
----------------------------------------
UCX SMTP's interface with VMS mail environment
----------------------------------------
As a VMS based SMTP MTA UCX SMTP has an interface with the VMS mail environment.
It uses this interface to:
- Deliver a mail message to VMS mail coming from SMTP
- Receive a mail message from VMS mail to send out via SMTP
It uses two distinct VMS mail interfaces to accomplish these tasks. To deliver
mail from SMTP to VMS mail it uses what is called "callable VMS mail". To accept
a mail message from VMS mail to send out via SMTP UCX SMTP implements a VMS mail
"foreign transport" using the the undocumented MAIL$PROTOCOL interface. This
section discusses these two interfaces and details about UCX SMTP's use of them
and VMS mail.
--------------------
Format of VMS mail message
--------------------
Just as an SMTP messages has a format so does a VMS mail message. Unlike SMTP
messages which have a rich set of headers VMS mail messages have only a small
set of headers. They are From, To, Subj and CC. As with SMTP the headers of a
VMS mail message are separated from the body of the VMS mail message by a single
blank line. In the case of an SMTP mail message delivered to VMS mail the body
of the VMS mail message is the entire text of the SMTP mail message - the SMTP
headers followed by blank line followed by the SMTP message body.**
** This assumes that UCX SMTP has been configured with /OPTION=TOP_HEADERS. See
"Configuring UCX SMTP".
---------------
Storing SMTP messages in VMS mail: Big square peg and small round hole.
---------------
Because of VMS mail's lack of support for the rich set of headers provided for
by SMTP messages there is bound to be a "loss of fidelity" when an SMTP message
is passed to VMS mail. The biggest loss of fidelity is with the "originator"
headers from the SMTP mail message.
SMTP messages can have many different "originator" type header fields - From,
Reply-To, Return-Path - each with a different purpose. However VMS mail supports
only one originator type header, the From header, so when an SMTP message is
passed to VMS mail UCX SMTP has to make a choice of which of the SMTP originator
fields to pass to VMS mail's From header. UCX uses a priority list of all the
possible SMTP originator headers to do this. When deciding which of the
originator headers to use in the VMS mail From line UCX SMTP starts at the top
of the priority list scanning the SMTP message headers for the particular header
from the priority list. If the header from the priority list is is found in the
message that header is used in the VMS mail From line. If not the scan goes to
the next header from the priority list. The priority list from first choice to
last choice is:
Resent-Reply-To
Resent-From
Reply-To
From
Resent-Sender
Sender
Return-Path
So, for example, if an SMTP mail message had a Reply-To, a From and a
Return-Path header the VMS mail from line would be taken from the Reply-To
header since Reply-To appears first in the priority list.
--------------------
UCX SMTP and callable VMS mail
--------------------
---------------
Callable VMS mail overview
---------------
VMS provides a suite of routines collectively refered to as "callable mail". The
routines are divided into four groups. There is one group of routines for
manipulating mail files, one for manipulating existing messages stored in
folders within a particular mailfile, one for getting and setting user profile
information and one for delivering a new message. Each of the four groups of
routines has a routine name prefix which all of the routines in the group start
with. They are:
Prefix: Purpose:
mail$mailfile_... Manipulate mailfiles
mail$message_... Manipulate existing messages in folders
mail$user_... Get/set user profile information
mail$send_... Deliver new mail to VMS mail
To deliver mail from the SMTP world into the VMS mail world UCX SMTP uses the
mail$send routines. UCX SMTP uses the mail$user routines to see the forwarding
string of a local user. (For more information on this see "Forwarding to an SMTP
address".)
Callable VMS mail is documented fully in the VMS Utility Routines Reference
Manual.
---------------
UCX SMTP's use of mail$send routines of callable mail
---------------
The mail$send routines provide a series of calls to pass a mail message to VMS
mail. The mail$send routines of interest are:
Routine: Use:
mail$send_add_address Passes the address of a recipient for the VMS
mail message.
mail$send_add_attribute Passes the text of the four VMS mail header
lines for the mail message. There is one
separate input item for each of the four
header lines - From, To, Subj, CC. Note that the
text of the To line as passed in the call to
mail$send_add_attribute is *not* the same as the
address passed to mail$send_add_address. The
text of the To line is uninterpreted by VMS
mail.
mail$send_add_bodypart Passes a single line of mail text to VMS mail.
Called in a loop.
mail$send_message Tells VMS callable mail that text of message is
complete and that it should now deliver the
message.
Example:
Say UCX system ucxsys.xyzcorp.com is delivering a mail from
[email protected] sent to [email protected]. To pass the mail to
VMS mail to be delivered UCX SMTP on ucxsys performs the following VMS
callable mail calls:
- Calls mail$send_add_address passing the address "boris".
- Calls mail$send_add_attribute passing the the text of the SMTP
message's To, CC (if any), and Subject field verbatim to VMS mail for the
text of the respective VMS mail header lines.
- Decides which originator field to use (see "Storing SMTP messages in
VMS Mail") for the VMS mail From line. Puts the SMTP% jacket around the
address to make it legal for a VMS mail reply and passes it to
mail$send_add_attribute as the text of the VMS mail from line.
- Calls mail$send_add_bodypart for each text line of the SMTP message
which includes the RFC 822 message headers, a blank line and the message
text.
- Calls mail$send_message to tell VMS mail to deliver the message to the
user.
--------------------
VMS mail Foreign Transport/MAIL$PROTOCOL Interface
--------------------
Up to this point we've discussed how SMTP mail coming into UCX SMTP is delivered
to VMS mail but not how mail is composed on VMS mail and sent out via UCX SMTP.
The mechanism to do this is called a "foreign transport". Foreign transports are
implemented using the MAIL$PROTOCOL interface.
---------------
VMS mail Foreign Transport
---------------
The VMS mail foreign transport mechanism allows mail to be sent over a mail
protocol other than Mail11. Foreign transport addresses begin with a special
prefix to identify them as such to the VMS mail address parser. It is a string,
which is the identifier for the foreign transport, followed by a percent sign
(%). After this comes the mail address itself in the syntax of the foreign
transport. The identifier for the UCX SMTP foreign transport is the string
"SMTP". So to send a mail via UCX SMTP from VMS mail the address entered in the
VMS mail To: must start with SMTP%. Because of VMS mail address parsing issues
there is also an extra set of double quotes needed** around an SMTP address so
the whole thing looks like:
MAIL> send
To: SMTP%"[email protected]"
** See "VMS mail address parsing notes"
---------------
MAIL$PROTOCOL Interface
---------------
When VMS mail sees a mail addressed to a foreign transport it needs to pass the
address to the foreign transport mechanism along with the mail message so that
the foreign transport can send it out. VMS mail does this using the
MAIL$PROTOCOL interface which is an undocumented, unsupported calling interface
between VMS mail and a foreign transport. It is implemented as a routine called
MAIL$PROTOCOL which resides in an image provided as part of the foreign
transport mechanism. When VMS mail sees a mail message to a foreign transport it
goes through a search process to locate the MAIL$PROTOCOL routine for the
foreign transport and then goes through a sequence of calls to the MAIL$PROTOCOL
routine to pass the address(es) and VMS header lines and message text along to
the foreign transport's MAIL$PROTOCOL routine.
MAIL$PROTOCOL search:
When VMS mail sees a mail message to a foreign transport it needs to find the
foreign transport's MAIL$PROTOCOL routine. As a first resort it looks for an
image file SYS$LIBRARY:xxx_MAILSHR.EXE where "xxx" is the foreign transport
string. Eg. SYS$LIBRARY:SMTP_MAILSHR.EXE. If it finds such an image it looks
for a routine named MAIL$PROTOCOL in the image. If it finds it then the
search is over.
If no xxx_MAILSHR file is found or it doesn't contain a MAIL$PROTOCOL routine
VMS mail will attempt to translate a logical MAIL$PROTOCOL_xxx where "xxx" is
the foreign transport string. If it finds one then the equivalence name of
the logical must be the filename (directory defaults to SYS$LIBRARY, file
extension defaults to .EXE) of the image file where the MAIL$PROTOCOL routine
is to be found. UCX SMTP uses this mechanism to point to its MAIL$PROTOCOL
routine in SYS$LIBRARY:UCX$SMTP_MAILSHR.EXE.
If no MAIL$PROTOCOL_xxx logical is found or the file specified doesn't
contain a MAIL$PROTOCOL routine then VMS mail signals an error message:
%MAIL-E-ERRACTRNS, error activating transport xxx
MAIL$PROTOCOL Calling sequence:
Once the MAIL$PROTOCOL routine is found and loaded VMS mail calls it
repeatedly to pass the mail information to the foreign transport. Each call
to the MAIL$PROTOCOL routine passes a function code to indicate what is to be
done, a pointer to a context block (created by the MAIL$PROTOCOL routine on
the first call) and eight parameters whose meanings vary depending on the
function code. There is an "initialization" function code sent first for each
message and one sent last to tell the MAIL$PROTOCOL routine to send the
message. There is a function code for a recipient address, one function code
each for the text from the From:, To:, Subj:, and CC: lines and a code for
the text of the mail itself (a pointer to an RMS rab for the text of the
messages is passed).
MAIL$PROTOCOL process context:
The MAIL$PROTOCOL code runs in the context of the process that sends mail to
the foreign transport address.
MAIL$PROTOCOL invocation with DECnet mail:
Consider this example:
MAIL> send
To: SUMNOD::SMTP%"[email protected]"
...
Such an address is entirely legal. It might be used from a system that has
DECnet but no TCP/IP installed as a means to still send SMTP mail. In what
process context is the MAIL$PROTOCOL interface being invoked in this example?
When such an address is used the MAIL$PROTOCOL code is running in the context
of the DECnet MAIL network object on the remote DECnet node. In this case
that's SUMNOD. The same ecanrio occurs when DECnet mail is sent to a user who
has mail forwarded to SMTP. This is important to know when debugging problems
with mail being sent between DECnet and SMTP mail. See "UCX SMTP and non-SMTP
mail".
----------------------------------------
UCX SMTP Control File
----------------------------------------
With UCX SMTP each mail message is packaged into a special purpose binary file
called a control file. This control file is submitted to a generic UCX SMTP
queue to be processed by the UCX SMTP symbiont. Each control file contains one
and only one SMTP mail message. Note that an SMTP message addressed to multiple
recipients is stored in one control file.
--------------------
CF Filenames - what they mean.
--------------------
The name of a control file and the directory it's in tell you something about
what type of mail it is. The format for the name of a control file is:
yymmddhhsshh_username.UCX_scsnode
where
"yymmddhhsshh" is a timestamp taken when the file is created.
"scsnode" is the value of the SYSGEN SCSNODE parameter.
"username" is the username of the process in which the CF was
created.
The different possiblities for "username" are:
Username: Meaning:
UCX_SMTP This is mail that came onto your system via SMTP. The control
file was created by the UCX SMTP receiver process which runs in
the UCX_SMTP account.
MAIL$SERVER This is mail that came in over DECnet and was destined for an
SMTP address. The control file was created by the DECnet Mail11
network object which runs in the MAIL$SERVER account. This
happens when the username on your system to which the DECnet/MTS
mail is destined has forwarded their mail to and SMTP address.
SYSTEM This is one of two things. If the control file is sitting in the
UCX_SMTP account's directory then it is a bounced mail message
created by the UCX SMTP symbiont which runs in the SYSTEM
account. Otherwise the control file will be in the default mail
directory of the SYSTEM user in which case the control file is
simply an SMTP mail sent by the SYSTEM user.
regular user
name This is mail composed by the user and sent to an SMTP address.
--------------------
Control file layout
--------------------
The UCX SMTP control file is a binary file that holds a single SMTP mail
messages. It has separate areas for the destination address information,
selected, pre-parsed RFC headers and the raw text itself. This section describes
these three areas.
---------------
Address Area
---------------
The address area of the control file contains each of the SMTP recipient
addresses. (ie. the addresses for the RCPT TO SMTP protocol command(s).) It is
implemented as a linked list of linked lists. The primary list is a list of the
domain parts of the addresses. Each domain node in the linked list points in
turn to a list of addresses within that domain. Say a mail was to delivered to
[email protected], [email protected] and [email protected]. The list would
look like this:
list head
|
|
V
| +-------------------+ +---------------------+
+--->| xyzcorp.com |-->| sumskool.edu |-->End-of-domain-list
+-------------------+ +---------------------+
domains | |
--------------+-------------------------+-----------
addresses | |
V V
+-------------------+ +---------------------+
| [email protected] | | [email protected] |
+-------------------+ +---------------------+
| |
V V
+-------------------+ End-of-address-list
| [email protected] |
+-------------------+
|
V
End-of-address-list
All nodes in the list (domain nodes and address nodes) also contain a block of
status bits. There are bits to indicate, among other things, if the address is
local or not (see "Local vs. non-local SMTP mail") , if the mail has been
successfully delivered, needs to be bounced or needs to be requeued.
---------------
Header Area
---------------
As the mail message is built into the control file certain headers are
pre-parsed into an area called the header area so that they can be accessed
without reparsing the entire header block. Each header value parsed into the
header area has a code to identify the name of the header (eg. FROM, TO, etc.)
and the value associated with it. The headers which are parsed into the header
area are:
Received, Return-Path, Date, From, To, Subject, CC, Sender, Comments,
Errors-To, Keywords, Reference, X-Organization, X-VMS-To, X-VMS-CC, Reply-To,
Resent-Reply-To, Resent-From, Resent-Sender and Message-ID
When you issue a UCX SHOW MAIL command the headers it shows you are actually
those from the header region, not from the text area. This explains why headers
other than those in the list above don't appear in the output of UCX SHOW MAIL.
The value of each header in the header area is stored in its "unfolded" format.
That is, multi-lined values are folded into one single line with all extraneous
white space removed.
Note about storage of the MAIL FROM address/Return-Path header:
As said in the SMTP Protocol review section the "envelope" addresses (those
from the MAIL FROM and RCPT TO commands) are to be stored separately from the
message headers. The RCPT TO addresses are stored separate from the headers
in the address area of the control file. However the MAIL FROM address is
stored in the Return-Path header. Note that if a mail message is to be sent
to another SMTP host the UCX SMTP client uses the address in the Return-Path
header in the address region of the control file to form the MAIL FROM
command. The Return-Path header is *not* sent by UCX SMTP as part of the RFC
822 message headers themselves. This is required by the RFCs since the
Return-Path header is only to be added into the headers by the final
destination host system. We only store it in the Return-Path header for the
convenience of our own implementation.
---------------
Text Area
---------------
The text area contains the raw text of the mail message. This includes the
headers, the blank line and the message body. In some cases the text area of the
control file contains a pointer to a text file that contains the text. This text
file is named exactly the same as the control file except that it's extension is
".UCX_scsnode_TEXT".
----------------------------------------
Components of UCX SMTP
----------------------------------------
This section introduces the different components of UCX SMTP. For purposes of
this discussion we break them up into the symbiont, the receiver, the
MAIL$PROTOCOL code, and the control file code.
--------------------
The UCX SMTP symbiont/queues
--------------------
As was said earlier each mail message is packaged into a special purpose binary
file called a control file and submitted to a generic UCX SMTP queue. This
generic queue points to one or more SMTP execution queues which run the UCX SMTP
symbiont hereafter refered to simply as the symbiont. ** The symbiont receives
jobs one at a time from the generic SMTP queue and delivers them either locally
(via callable VMS mail ) or remotely (via SMTP).
The UCX SMTP queues are set up for you. By default the generic SMTP queue points
to one SMTP execution queue. You can change this with the SET CONFIGURATION
SMTP/QUEUE command. See "Configuring UCX SMTP".
The UCX SMTP queues are started by the UCX START MAIL command and stopped by the
UCX STOP MAIL command. The SMTP satrtup file UCX$SMTP_STARTUP.COM does a UCX
START MAIL and the SMTP shutdown file does a UCX STOP MAIL. The symbiont process
(or processes for multiple execution queues) are created when the queues are
started. The symbiont process runs in the SYSTEM account.
The symbiont processes *all* mail on UCX SMTP. It sends outbound mail via SMTP
and delivers inbound mail to users via callable VMS mail. It also decides when
and if a mail message needs to be bounced and creates the bounced mail message
and sends that mail too. None of the other UCX SMTP components actually send any
mail. They package it into a control file and submit it to the symbiont.
** See your VMS documentation for more information about the VMS queueing system
and symbiont processes. For those who care the UCX SMTP symbiont is a single
streamed, asynchronous delivery SMB$ type symbiont. (See the VMS Utility
Routines Reference Manual for information on the implementation of VMS
symbionts.)
--------------------
The UCX SMTP Receiver
--------------------
The UCX SMTP receiver is invoked by the UCX Auxiliary Server when an inbound
TCP/IP connect comes into port 25 (assuming the UCX SMTP service has been
enabled). The Auxiliary server runs the COM file specified in the SMTP service
database entry UCX$SMTP_RECV_STARTUP.COM - which runs the receiver. The receiver
image is SYS$SYSTEM:UCX$SMTP_RECEIVER.EXE. The receiver process runs in the
UCX_SMTP account.
The receiver acts as the SMTP server in the SMTP client-server protocol dialog.
It saves the mail message from the client in a control file and submits it to
the symbiont once the message is received successfully. The receiver doesn't
deliver mail itself. Nor does it validate the existence of users to whom the
mail is being sent.
The receiver process is single threaded and once it serves a mail message it
exits. That is, for each new inbound connection to port 25 a new SMTP receiver
process is created.
--------------------
The UCX SMTP MAIL$PROTOCOL code
--------------------
This was discussed extensively in the section on the MAIL$PROTOCOL interface. To
review the MAIL$PROTOCOL code is invoked by VMS mail when a message is to be
delivered to an SMTP address. It runs in the context of the process that is
sending the mail. This is either a user who is sending SMTP mail from the VMS
mail UI or the DECNet Mail11 network object running in the MAIL$SERVER account.
The only additional information is that as the MAIL$PROTOCOL code receives the
mail message from VMS mail it packages it up into a control file and submits the
control file to the symbiont to deliver.
--------------------
The UCX SMTP control file code
--------------------
This code is called by each of the other four components. The receiver and
MAIL$PROTOCOL code use it to create control files. The symbiont uses it to read
control files and to create control files for bounced mail messages. The control
file code contains routines (among others) to:
- Create, delete, open and close a control file
- Put new domain, address, RFC header or line of text to file **
- Read existing domain, address, RFC header or line of text from file
- Read/write domain/address status blocks
- Submit a control file to the queue
The error reporting in this code is not up to snuff. 99% of the different
problems they incur are reported as either a generic "control file error" or
"Bad parameter". Fixing this is in the worklist.
** See "UCX SMTP Control File" for more information on the contents of the
control file.
----------------------------------------
UCX MX Lookup
----------------------------------------
As discussed earlier an SMTP mailer needs to access DNS maintained MX records in
order to help it route mail. UCX has a procedure called MX lookup to do this. It
has some value added over a raw DNS MX lookup. This section documents the UCX MX
lookup procedure.
The UCX MX lookup procedure is a routine that takes as input the destination
SMTP domain and returns a list of gateway hosts and preferences (well, sometimes
preferences, keep reading) associated with them. The value added over a raw DNS
MX lookup is twofold:
- The UCX MX lookup returns MX records sorted in ascending order of
preference (MX records returned higher priority before lower priority).
When there are multiple MX records with the same preference their order in
the return list is the same as returned by DNS. Since DNS returns records
in a different order each time the records with the same preference will
not appear in the same order in the UCX MX lookup sorted list each time.
This is essential for proper functioning of multiple MX records with the
same preference as a load balancing mechanism between peer mailhubs. For
an example of this see "MX Record Overview - MX Example 1".
- Four database search
As said earlier the UCX MX lookup procedure returns a list of gateway
hosts and preferences. What was not said is that the search for these
gateway hosts extends beyond DNS MX records. The UCX MX lookup actually
searches four "databases" (for lack of a better word) to resolve an MX
query. Following are the four databases that are searched in the order
they are searched:
UCX Local MX database
DNS MX lookup
UCX local host database
DNS host lookup
As you can see the last two databases listed here are looking at host
records not MX records. Given this the term "UCX MX Lookup" is a bit of a
misnomer because the MX lookup is looking at something in addition to MX
records. The UCX MX lookup takes the destination mail domain to be looked
up and performs queries on this domain in each of the above four
databases. In the case of the host databases it returns a preference of
"0" since there is no preference value associated with a host record.
The UCX SHOW MX command and the UCX SMTP code both call the UCX MX Lookup
routine which lives in SYS$LIBRARY:UCX$ACCESS_SHR.EXE. Consequently if you
want to see what MX records UCX SMTP sees for a particular non-local mail
domain just use UCX SHOW MX. (See "Displaying MX records with UCX".)
The MX lookup routine filters duplicate gateway names. It will never
return a record for a gateway that it has already passed back to the
caller. If it's already told you about a possible gateway there's no point
in repeating it. Try doing a UCX SHOW MX on a hostname that has an MX
record where the gateway name is the hostname itself. Notice that UCX SHOW
MX shows you the MX record but not the host record since it would simply
be a repeat of the MX record.
--------------------
Displaying MX records with UCX
--------------------
UCX supports two methods for MX lookup - the Unix based nslookup program and the
UCX SHOW MX_RECORDS command. UCX nslookup hooks directly to the DNS and returns
the MX records just as they are passed from the DNS - unsorted. The UCX SHOW MX
command provides some additional functionality on top of the bare DNS MX lookup.
See "UCX MX Lookup".
The following examples show how to use UCX's nslookup and UCX SHOW MX to do an
MX lookup on the destination domain "ucx.lkg.dec.com".
Nslookup invocation:
$ mcr ucx$nslookup
Default Server: ucxaxp.ucx.lkg.dec.com
Address: 16.20.208.53
> set type=MX
> ucx.lkg.dec.com
Server: ucxaxp.ucx.lkg.dec.com
Address: 16.20.208.53
ucx.lkg.dec.com preference = 100, mail exchanger = mail2.digital.com
ucx.lkg.dec.com preference = 200, mail exchanger = crl.dec.com
ucx.lkg.dec.com preference = 50, mail exchanger = ucxaxp.ucx.lkg.dec.com
ucx.lkg.dec.com preference = 75, mail exchanger = lassie.ucx.lkg.dec.com
ucx.lkg.dec.com preference = 100, mail exchanger = mail1.digital.com
ucx.lkg.dec.com nameserver = ucxaxp.ucx.lkg.dec.com
ucx.lkg.dec.com nameserver = lassie.ucx.lkg.dec.com
mail2.digital.com inet address = 204.123.2.56
crl.dec.com inet address = 192.58.206.2
ucxaxp.ucx.lkg.dec.com inet address = 16.20.208.53
lassie.ucx.lkg.dec.com inet address = 16.20.208.100
mail1.digital.com inet address = 204.123.2.50
> exit
The nslookup MX lookup first gives you the name and IP address of the DNS
server from which the information came. In the example it was
ucxaxp.ucx.lkg.dec.com. Next it gives you a list of MX records for the
destination domain you queried on. Note that the MX records are not sorted by
preference. This is because nslookup hooks directly into DNS which presents
the MX records to the caller in this unsorted fashion. Finally, as a niceity,
nslookup shows you the IP addresses for the mail exchanger (ie. gateway
hostname) fields.
UCX SHO MX_RECORDS invocation:
UCXAXP> ucx
UCX> sho mx ucx.lkg.dec.com
BIND MX database
Server: 16.20.208.53 ucxaxp.ucx.lkg.dec.com
Gate address Preference Gate name
16.20.208.53 50 ucxaxp.UCX.LKG.DEC.COM
16.20.208.100 75 lassie.UCX.LKG.DEC.COM
204.123.2.56 100 mail2.digital.com
204.123.2.50 100 mail1.digital.com
192.58.206.2 200 crl.dec.com
BIND database
Server: 16.20.208.53 ucxaxp.ucx.lkg.dec.com
Host address Host name
16.20.208.208 UCX.LKG.DEC.COM
UCX> exit
Note that there are differences in the output of nslookup and UCX SHOW MX.
These are due to the value added by the UCX MX Lookup. For more information
see "UCX MX Lookup".
----------------------------------------
Local vs. non-local SMTP mail
----------------------------------------
To deliver mail to any address UCX SMTP needs to assess whether the address is
"local" or not. If an address is local the symbiont strips off the domain part
of the address and delivers the mail to the local-part of the address via VMS
callable mail. If an address is non-local it is relayed via SMTP off to another
host for it to deliver (or to relay further).
UCX SMTP determines if an address is local when it initially parses the address
and stores it into the control file address region. Once the address is parsed
into a local-part and domain part the SMTP address parsing code looks at the
domain part of the address to see if it is local. In order to determine if the
domain part of the SMTP address is local or not the UCX SMTP parsing routine
performs the following steps:
- Compare the domain to the SMTP substitute domain. If the domain matches
the SMTP substitute domain it is considered local. This step is not performed
if:
- The logical UCX$SMTP_NO_SUBS_DOMAIN_INBOUND is defined. See
"Configuring UCX SMTP".
- No substitute domain is configured.
- Compare the domain case insensitively to the domains listed in the local
aliases file. If a match occurs then it is considered local.
- Build a list of all IP addresses for the domain and compare
this list to a list of all of the local host's IP addresses (including any IP
cluster alias). If a match occurs then the address is local.
Miscellaneous notes:
- The status blocks of the domain and address nodes in the linked list of
the control file address area contain a "local" bit which is set if the
address is local. After this any code that reads this address from the
control file knows if it is local or not.
- When talking about local and non-local mail it is important to remember
that a mail message can be both. In the case where there are multiple SMTP
recipients and one of them is local and another is not the mail is delivered
locally to the local address and relayed out via SMTP to the non-local one.
So strictly speaking it's not the mail that's local or non-local it's the
address. By convention though when we are talking about delivering mail to a
local address we call it local mail and when we are delivering mail to a
non-local address we call it non-local mail.
----------------------------------------
The SMTP Alternate Gateway/Zone
----------------------------------------
The SMTP alternate gateway along with the SMTP zone provide an alternative to
using straight MX records to send non-local mail. When you define an alternate
gateway any mail destined for a domain outside the zone is sent to the alternate
gateway. If an alternate gateway is defined and no zone is defined then the
value of the UCX$INET_DOMAIN logical is used as the zone. This means that all
mail to systems outside your DNS zone will be sent to the alternate gateway.
----------------------------------------
How UCX decides where to send non-local mail
----------------------------------------
This section describes how UCX SMTP decides where to send a mail to a non-local
address since that has been a source of alot of confusion. There are a few
things that affect where the symbiont tries to route the mail:
- The alternate gateway and zone and the results of the UCX MX lookup on the
alternate gateway. See "The SMTP Alternate Gateway/Zone"
- The results of the UCX MX Lookup on the domain part of the recipient
address. See "UCX MX Lookup".
- Definition of a few select UCX SMTP configuration logicals:
- UCX$SMTP_ALTGATE_ALWAYS
- UCX$SMTP_MX_IF_NOALTGATE
- UCX$SMTP_NO_MX
See "Non-local mail routing options" under "UCX SMTP configuration
logicals" for more information on these logicals.
As described in the section about the alternate gateway and zone mail destined
for a domain outside the zone is sent to the alternate gateway.
If no alternate gateway is configured then all non-local mail is delivered using
the UCX MX Lookup gateway list. (See "UCX MX Lookup").
If an alternate gateway is configured but the domain of the recipient address
is within the zone then the message is sent to that address using the UCX MX
Lookup gateway list.
Modifications to this behavior:
If you have configured the UCX$SMTP_ALTGATE_ALWAYS logical then all non-local
mail is sent to the alternate gateway. No zone check is performed.
If you have configured the UCX$SMTP_MX_IF_NOALTGATE logical then any mail
that is to be sent to the alternate gateway will be sent using the UCX MX
Lookup gateway list *if* the symbiont is unable to get to the alternate
gateway. If you have not configured this option and UCX SMTp caanot get to
the alternate gateway the message will be requeued.
If you have configured the UCX$SMTP_NO_MX logical then mail that is not
destined for the alternate gateway will not be sent using the UCX MX Lookup
gateway list. Rather, the domain part of the address will be translated into
a DNS host name directly and the mail sent directly to that address. If the
domain of the address doesn't translate as a DNS hostname the mail will
bounce. This feature isn't particularly useful.
--------------------
How the symbiont sends a mail using the UCX MX Lookup gateway list
--------------------
When the symbiont decides that mail to a particular recipient is not going out
via the alternate gateway (eg. no alternate gateway is defined or the recipient
address is within the zone) the symbiont must relay the mail itself. First it
calls the UCX MX Lookup routine passing it the domain part of the recipient
address. As described in "UCX MX Lookup" this returns a list of potential
gateways for the mail in a prioritized order. The symbiont tries to send the
mail via the SMTP protocol to the first gateway in the list. If this fails it
tries the next gateway in the list and on and on until either the mail has been
sent or the list is exhausted. If the list is exhausted then the mail is
requeued to be tried at a later time.
--------------------
How the symbiont sends a mail through the alternate gateway
--------------------
To send a mail to the alternate gateway you might conclude that the symbiont
translates the alternate gateway to an IP address using gethostbyname and
connects to the address. This assumption is understandable but incorrect. To
send mail to the alternate gateway the symbiont calls the UCX MX Lookup routine
(see "UCX MX Lookup") on the alternate gateway and uses the resulting list of
gateways to get the mail to the alternate gateway. To understand the benefit of
this consider this example which is how we at UCX engineering have UCX SMTP
configured on our own system.
First our alternate gateway and zone:
UCX> sho config smtp
...
Alternate gateway: relay.dec.com
...
Zone: dec.com
...
What if we try to translate the alternate gateway, "relay.dec.com" as a host name?
UCX> sho host relay.dec.com
%UCX-W-NORECORD, Information not found
-RMS-E-RNF, record not found
There is no such host as relay.dec.com because relay.dec.com is just an MX
destination domain with multiple records at the same preference:
UCX> sho mx relay.dec.com
BIND MX database
Server: 16.20.208.53 ucxaxp.ucx.lkg.dec.com
Gate address Preference Gate name
192.208.46.10 100 mail11.digital.com
192.208.46.20 100 mail12.digital.com
192.208.46.30 100 mail13.digital.com
204.123.2.56 200 mail2.digital.com
204.123.2.50 200 mail1.digital.com
193.56.15.21 300 mail21.digital.com
When UCX SMTP on our system sees a mail destined for a domain outside of
"dec.com" it uses the above list of MX records to send the mail to what is
really an imaginary entity called "relay.dec.com". So, even when mail is routed
through the alternate gateway the UCX MX Lookup list is used.
---------------
Further enhancements in worklist for mail destined for alternate gateway
---------------
This section documents some items which are in the worklist with respect to mail
destined for the alternate gateway.
Enhance caching of alternate gateway MX records:
The symbiont calls the UCX MX Lookup procedure for the alternate gateway once
at initialization time and caches the resulting list of gateways. This is
done for efficiency to save the cost of an MX lookup on the alternate gateway
each time mail is to be sent to the alternate gateway. The symbiont refreshes
the cached list of MX records for the alternate gateway every 24 hours.
There is a problem with this. Consider the case of our own relay.dec.com
alternate gateway. The domain relay.dec.com has multiple MX records defined
for it at the same preference. As we discussed in "MX Example 1" in the
section "MX Record Overview" in part 1 this is to achieve load balancing
between the gateway hosts that share the same preference. Load balancing
should occur because the MX records with the same preference appear in a
different order each time they are looked up. However since the MX records
for the alternate gateway are cached by the UCX SMTP symbiont it uses the
same MX record sequence every time and so cannot take advantage of the load
balancing that has been set up for the alternate gateway.
For example if the UCX SMTP symbiont has cached the MX records for
relay.dec.com as above it would always try to connect to mail11.digital.com
first. No mail would get sent through mail12.digital.com or
mail13.digital.com. When the MX records are refreshed after 24 hours the
order of the gateways with the same preference may change and then the
symbiont will connect to a different host - but always the same one - until
another 24 hours passes and the alternate gateway MX cache is refreshed
again.
The solution for this is to periodically reshuffle the order of the MX
records (with the same preference) in the alternate gateway MX list.
Send all mail to alternate gateway in one SMTP session:
UCX SMTP has a design inefficiency with respect to sending mail via the
alternate gateway for mail with multiple recipients outside the zone. This is
most commonly encountered when sending mail to a mailing list in which there
are multiple recipients outside the zone. With the present design of the
control file the the symbiont does everything on a domain by domain basis. It
sends mail to one domain and then to the next and to the next, etc. If
addresses in different domains are all destined for the alternate gateway
they will still be sent separately.
Say for example you have a zone of z.com with an alternate gateway of
mail.z.com and you have a mailing list with the addresses [email protected] and
[email protected]. Since these two addresses are in different domains they are
processed separately by the symbiont. First we connect to the alternate
gateway and go through the whole SMTP dialog for [email protected]. Eg:
send: HELO whereever.z.com
recv: 250 mail.z.com Hello whereever.z.com pleased to meet you
send: MAIL FROM:<[email protected]>
recv: 250 <[email protected]>... Sender ok
send: RCPT TO:<[email protected]>
recv: 250 Recipient ok
send: DATA
recv: 354 Enter mail, end with "." on a line by itself
send: message headers
send: [blank line]
send: message text
send: .
recv: 250 Message accepted for delivery
send: QUIT
recv: 221 closing connection
Then the link is disconnected and we go on to do the exact same thing for
[email protected]. For mailing lists with many recipients outside the zone this is
costly. It would be far more effient if the mail was sent through the
alternate gateway with multiple RCPT TO commands for each of the domains
destined for the alternate gateway. Eg:
send: HELO whereever.z.com
recv: 250 mail.z.com Hello whereever.z.com pleased to meet you
send: MAIL FROM:<[email protected]>
recv: 250 <[email protected]>... Sender ok
send: RCPT TO:<[email protected]>
send: RCPT TO:<[email protected]>
recv: 250 Recipient ok
send: DATA
recv: 354 Enter mail, end with "." on a line by itself
send: message headers
send: [blank line]
send: message text
send: .
recv: 250 Message accepted for delivery
send: QUIT
recv: 221 closing connection
There is a work around for this. You need to trick UCX SMTP into dealing with
each of the addresses destined for the alternate gateway as if they were in
the same domain. You can do this by defining the addresses of users in a
mailing list who are outside the zone using the percent sign hack. Taking the
example above you'd create the list like so:
$ Create alist.dis
user1%[email protected]
user2%[email protected]
<CTRL-Z>
Using the percent sign hack you have given both of the addresses the same
domain part - the name of your alternate gateway. As far as UCX SMTP is
concerned they are in the same domain. This means that when the symbiont goes
to deliver the mail each of these addresses will be in the linked list under
the "mail.z.com" domain and will be dealt with together.
----------------------------------------
Forwarding to an SMTP address
----------------------------------------
Consider the case where an SMTP mail comes into your system that is to be
delivered locally and the recipient has a mail forwarded to an SMTP address.
This section discusses some special case handling in the symbiont to handle
such forwarding to an SMTP address which is refered to as SMTP-to-SMTP
forwarding.
When the symbiont delivers mail locally it checks the local-part of the address
to see if there is a forwarding string (ie. SET FORWARD) for it. It does so
using the mail$user_* VMS callable mail routines. If there is a forwarding
string the symbiont checks to see if it is an SMTP address. If it is then some
special handling is in order.
Let's take an example to show what would happen if there was *no* special
checking for delivering SMTP mail to a local recipient with their mail forwarded
to SMTP. Say user jones on a UCX system called systm2.xyzcorp.com has forwarded
their mail to SMTP%"[email protected]". Now say mail arrives on
systm2.xyzcorp.com for [email protected]. What would happen if the
symbiont didn't make special checks for SMTP forwarding here? The symbiont would
deliver mail via callable mail to the reciopient address "jones". What is VMS
mail going to do with this? It sees the mail is forwarded to SMTP% and so it
locates and invokes the UCX SMTP MAIL$PROTOCOL routine (see "VMS mail Foreign
Transport/MAIL$PROTOCOL Interface") to deliver the message. VMS mail passes the
recipient's forwarding address - [email protected] - to the
MAIL$PROTOCOL routine as the recipient address. This happens inline in the
symbiont process but is totally transparent to the symbiont code itself. As far
as the symbiont code is concerned it has made a simple call to
mail$send_add_address for user jones. After the call to mail$send_add_address
the symbiont passes the VMS From, To, etc lines to callable mail and each call
is redirected by VMS mail to the SMTP MAIL$PROTOCOL code. Finally the symbiont
passess each line of text starting with the message's RFC headers and then the
blank line and the text of the message.And agin this is passed to the
MAIL$PROTOCOL code. Sounds fine, no?
This creates a problem though. Invoking the MAIL$PROTOCOL code causes the
generation of a *new* SMTP mail message with *new* SMTP headers. The entirety of
the existing SMTP message that we are trying to send (including its RFC 822
headers) is now hidden away - "encapsulated" - inside the new message as the
text of the message. There are now two blocks of RFC 822 headers in the new
message. The first block of headers are the ones the MAIL$PROTOCOL interface has
just created. They are followed by a blank line and the original RFC 822
headers, another blank line and the original body. This is obviously a pain
since the recipient has more headers to read through. It is also a bug since it
breaks the SMTP loop detection mechanism.
The SMTP loop detection mechanism requires that each MTA that touches a message
append a Received: header and that each MTA count Received: headers and bounce
the mail if the number of Received headers surpasses some locally configurable
limit. (This BTW is UCX SMTP's HOP_COUNT_MAX.) In this fashion mail that has
taken "too many hops" will be bounced as looping. Going back to the example say
that user jones had inadvertantly set their forwarding on host "othersys" right
back to systm2.xyzcorp.com - the classic mail forwarding loop. In this scenario
the mail would bounce back and forth between the two systems getting one
additional set of headers each time it was processed by systm2. Since each new
block of headers encapsulates the existing message into a new message thus
making the old block of headers invisible (they become the body of the message)
a Received: header is added on each time to the outermost block of headers and
then this block of headers is encapsulated within the message and a new header
block is created. So we have a mail message of many, many separate blocks of RFC
headers each with two Received: headers (one from systm2 and one from othersys)
rather than a single block of headers with *all* the Received: headers. As a
consequence the code that counts Received: headers to detect looping can't work
and the mail loops forwever. (BTW. UCX SMTP had this bug for a long time.)
To fix this the UCX SMTP symbiont checks to see if a local user to whom it is
delivering an SMTP message has mail forwarding set to an SMTP address. If it
does it dynamically adds a new address - the user's forwarding address - to the
control file address list. It then marks the address status block of the old
address as having been successfully delivered. In the case of our example that
means that the recipient address [email protected] is marked as delivered
successfully and jones's forwarding address [email protected] is
dynamically added to the control file. The symbiont will see this address and
then deliver the mail to othersys.xyzcorp.com via SMTP without the encapsulation
and bugs described above.
Situation where encapsulation problem can still occur:
If you define a SYSTEM logical name pointing to an SMTP address and the
symbiont tries to deliver mail to that address that situation is not caught
yet and you'll get the header encapsulation. EG:
$ DEFINE/SYSTEM JONES SMTP%"""[email protected]"""
Try it. You'll see.
Support for setting forward to SMTP address without SMTP% jacket:
For some later versions of VMS you can do:
MAIL> SET FORWARD/[email protected]
Ie. you don't need the SMTP jacket. UCX SMTP can handle this too. That is,
its special case check to see if an address has been forwarded to SMTP
detects this kind of forwarding.
----------------------------------------
UCX SMTP and non-SMTP mail
----------------------------------------
One issue for any VMS based SMTP mailer is how to deal with mail coming from or
going to non-SMTP mailers. This happens mostly when users have their mail
forwarded. If a user's mail is forwarded to an SMTP address and a non-SMTP mail
(say DECnet) arrives that's the case where mail is going from a non-SMTP MTA to
SMTP. If a user's mail is forwarded to a non-SMTP address (say DECnet) and an
SMTP mail arrives it's the case of mail going from SMTP to a non-SMTP MTA. This
section discusses what happens when mail moves accross the boundary between SMTP
and non-SMTP MTA's.
--------------------
SMTPfication of non-SMTP addresses
--------------------
Before discussing the specifics of what's happening when mail moves accross the
boundary between SMTP and non-SMTP MTA's it is necessary to understand a
procedure implemented in UCX SMTP for transforming any non-SMTP address into an
SMTP address. This procedure is called SMTPfication and is used on addresses as
they cross the boundary from non-SMTP land to SMTP land. With SMTPfication the
non-SMTP address is munged and this munged string becomes the local-part of the
created SMTP address. The domain part of the created SMTP address becomes the
UCX SMTP substitute domain or, if no substitute domain is configured, the host's
hostname.
The SMTPfication steps are as follows:
1) Scan the non-smtp address and prefix a backslash (\) character to each
double quote character (if any).
2) Put the entire string in double quotes.
3) Append an '@' followed by the substitute domain (or hostname if no
substitute domain)
---------------
Example SMTPfications
---------------
This section gives some examples of address being SMTPfied. They all assume that
the UCX SMTP host doing the SMTPfication has a substitute domain of
xyzcorp.com.
Example 1 - DECnet address:
Before SMTPfication:
SUMNOD::SMITH
After Step 1 (Prefix double quotes with a \):
SUMNOD::SMITH
After Step 2 (Put entire string in double quotes):
"SUMNOD::SMITH"
After Step 3 (append @domain):
"SUMNOD::SMITH"@xyzcorp.com
Example 2 - MTS address:
Before SMTPfication:
SUMNOD::XXXMTS::MRGATE::"YYYMTS::A1::SMITH"
After Step 1 (Prefix double quotes with a \):
SUMNOD::XXXMTS::MRGATE::\"YYYMTS::A1::SMITH\"
After Step 2 (Put entire string in double quotes):
"SUMNOD::XXXMTS::MRGATE::\"YYYMTS::A1::SMITH\""
After Step 3 (append @domain):
"SUMNOD::XXXMTS::MRGATE::\"YYYMTS::A1::SMITH\""@xyzcorp.com
Example 3 - another foreign transport address:
Before SMTPfication:
DSN%SRQ$Z123456-7890
After SMTPfication:
"DSN%SRQ$Z123456-7890"@xyzcorp.com
Example 4 - Quoted DECnet address:
Before SMTPfication:
SUMNOD::"[email protected]"
After SMTPfication:
"SUMNOD::\"[email protected]\""@xyzcorp.com
Example 5 - X.400 --> MTS address. Yuk!:
Before SMTPfication:
SUMNOD::MRGATE::"XXX::1=FI::2=XXX::3=XYZ::JOE SMITH"
After SMTPfication:
"SUMNOD::MRGATE::\"XXX::1=FI::2=XXX::3=XYZ::JOE SMITH\""@xyzcorp.com
---------------
When is SMTPfication necessary?
---------------
SMTPfication becomes necessary whenever the UCX SMTP code needs to form an
address from a VMS address for an RFC 822 header or an SMTP protocol command and
the string to be used for the local-part of the address is not a simple
username. SMTPfication is not needed for a simple VMS username because a VMS
username is syntactically legal for the local-part of an RFC 822 address. For
example the simple VMS mail address of JONES becomes [email protected] not
"jones"@xyzcorp.com. However the latter form is actually legal and would work.
SMTPfication is also performed by the UCX POP server when it creates the
dummied up From: RFC 822 header from the VMS mail From: line. For more
information on POP's dummied up RFC 822 headers see the POP documentation.
--------------------
Mail from non-SMTP to SMTP
--------------------
The first case we will discuss is the one where a mail comes from a non-SMTP
mail environment and is to be delivered into the SMTP environment. The most
common cuase for this is when a non-SMTP mail arrives for a user with mail
forwarded to an SMTP address.
The key issue in accepting mail from a non-SMTP MTA and passing it into the SMTP
world is getting the From: and Return-Path: (er um, the MAIL FROM) addresses
correct. If the From: address is not correct the recipient will not be able to
reply. If the address that we put in the MAIL FROM: command is not correct and
the mail needs to be bounced then it will not be bouncable.
When mail arrives for a user with mail forwarded to an SMTP address VMS mail
invokes the SMTP MAIL$PROTOCOL code (see "VMS mail Foreign Transport/
MAIL$PROTOCOL Interface") and passes the mail message to it to deliver. As
discussed in the MAIL$PROTOCOL section one of the calls that VMS mail makes to
the SMTP MAIL$PROTOCOL routine passes the VMS mail From: line. The SMTP
MAIL$PROTOCOL code uses the VMS mail from: line to form the RFC 822 From: and
Return-Path: headers. To do so it uses SMTPfication on the VMS mail From: line.
---------------
An example
---------------
Take an example where user SMITH on DECnet node SYSTM1 sends an DECnet mail to
user JONES on DECnet SYSTM2. Say that DECnet node systm2's UCX host name is also
systm2.xyzcorp.com and that its substitute domain is xyzcorp.com. Finally say
that user JONES has their mail forwarded to SMTP%"[email protected]".
On SYSTM1 SMITH does:
MAIL> send
To: SYSTM2::JONES
Subject: Test
test text here
<CTRL-Z>
On SYSTM2 the MAIL$SERVER network object (running SYS$SYSTEM:MAIL_SERVER.EXE)
delivers the mail to user JONES and sees that it is forwarded to SMTP%. This
means the UCX SMTP MAIL$PROTOCOL routine is called to deliver the message. When
the From: line is passed to MAIL$PROTOCOL it's:
From: SYSTM1::SMITH
At this point the MAIL$PROTOCOL routine forms an RFC 822 From: line of
From: "SYSTM1::SMITH"@xyzcorp.com
And the Retun-Path header (which will be put into the MAIL FROM SMTP protocol
command) is the same. Ie:
Return-Path: "SYSTM1::SMITH"@xyzcorp.com
Note that nothing special needs to get done with the To: field. The SMTP
MAIL$PROTOCOL code forms the RFC 822 To: field from the value passed to it with
the recipient address function code which is whatever was inside the SMTP%
jacket. In this case it's the forward string for user jones which is
[email protected]. Ie. This scenario doesn't complicate the
construction of the To: header.
After the rest of the MAIL$PROTOCOL interface calls are made the mail is
packaged up into a control file, submitted to the symbiont and delivered to
[email protected].
---------------
SMTPfication as simple, generic mechanism for gatewaying mail
---------------
Consider the RFC From address "NODE::USER"@dom.ain. As illustrated by the
example above, the SMTPfication procedure applied to a mail address as it passes
from outside SMTP to SMTP is a way preserving the path that the mail has taken
within the mail address itself. Such a mechanism does produce syntactically
complex addresses but it is also useful as a generic mechanism for gatewaying
mail that works for any possible non-SMTP address that the UCX SMTP
MAIL$PROTOCOL code could be passed.
--------------------
Mail from SMTP to non-SMTP
--------------------
Now consider the case where mail is sent from the SMTP world into a non-SMTP
MTA. The example above is a good starting point. Say that user jones on
othersys.xyzcorp.com receives the example mail from SMITH and replies. If
othersys is a UCX SMTP system the VMS mail From: line will look like:
From: SMTP%"�SYSTM1::SMITH�@xyzcorp.com"
For the time being ignore the cent signs in this address. They are required
because of historical address parsing deficiencies in VMS mail which are being
worked on. See "The UCX SMTP cent sign hack" for more information. Suffice it to
say that this how an RFC 822 From: line of `From: "SYSTM1::SMITH"@xyzcorp.com'
is stuffed into the VMS mail From line by UCX SMTP.
Say that user jones replies to this mail. This will cause a mail to be sent to
the address in the VMS mail From: line - SMTP%"�SYSTM1::SMITH�@xyzcorp.com".
Since this address starts with SMTP% VMS mail invokes the UCX SMTP MAIL$PROTOCOL
code on othersys. In this case the construction of the From: header is easy. The
From: line passed to the MAIL$PROTOCOL code is JONES so the RFC 822 From: header
is simply [email protected]. (Let's assume that this system has no
substitute domain.)
When the SMTP MAIL$PROTOCOL code is passed the recipient address function code the
address looks like: �SYSTM1::SMITH�@xyzcorp.com. The MAIL$PROTOCOL code converts
the cent signs back to double quotes and this yields an RFC 822 To: header of:
To: "SYSTM1::SMITH"@xyzcorp.com
This address is also put into the control file address area (so that the
symbiont sends it out with a RCPT TO:<"SYSTM1::SMITH"@xyzcorp.com>). Once the
rest of the message is packaged up into a control file and submitted the
symbiont gets it and sends the mail using the SMTP protocol to
systm2.xyzcorp.com. (Let's assume that the MX record for xyzcorp.com points to
systm2.xyzcorp.com so systm2 receives the mail.)
When systm2 receives the mail it sees that it's local mail because the domain of
the RCPT TO: address is xyzcorp.com which matches its substitute domain. (See
"Local vs. non-local SMTP mail".) So the symbiont delivers the mail locally via
callable VMS mail. (See "UCX SMTP and callable VMS mail".) To construct the
recipient address string to pass to callable VMS mail's mail$send_add_address
routine the symbiont now un-SMTPfies the recipient address. This is just the
reverse of the SMTPfication. So starting with this:
"SYSTM1::SMITH"@xyzcorp.com
it strips off the @domain to get this:
"SYSTM1::SMITH"
and strips off the outer double quotes to get this:
SYSTM1::SMITH
In this example there are no \" sequences but if there were it would remove the
'\' characters too as the last step of un-SMTPfying the address. So, the string
that the symbiont passes to callable mail as the recipient address is
SYSTM1::SMITH.
To form the VMS mail From: line the symbiont does nothing special. It chooses
the From: RFC 822 header to be placed into the VMS mail from line and packages
it into an SMTP% jacket to make it a legal VMS incarnation of an SMTP address.
So the VMS mail From line that is passed to callable mail by the symbiont is:
From: SMTP%"[email protected]"
Now the rest of the mail is passed to VMS callable mail and the symbiont is done
delivering the mail. At this point the MAIL11 server takes over and delivers the
mail to SMITH on SYSTM1. (Actually it's done in line with the symbiont call to
callable mail because, after all, MAIL11 is not a store and forward protocol but
that's an unimportant detail.)
Note that the VMS mail From: line that SMITH sees will be enhanced by the MAIL11
code from what the SMTP symbiont passed to callable mail. The VMS mail From:
line that SMITH sees will be:
From: SYSTM2::SMTP%"[email protected]"
The SYSTM2:: is added to the front because the mail made the hop from SYSTM2 to
SYSMT1 via DECnet.
Now say a reply is done. This will basically do the same thing as the original
send that SMITH did to SYSTM2::JONES. The only difference between sending to
SYSTM2::JONES and SYSTM2::SMTP%"[email protected]" is that sending to
SYSTM2::SMTP%"[email protected]" saves the extra step performed in the
MAIL$SERVER on SYSTM2 of looking to see that jones has their mail forwarded
SMTP%"[email protected]".
---------------
Another SMTP to non-SMTP case
---------------
Another case similar to the example above is the case where SMTP mail is to be
delivered locally to a user who has their mail forwarded to a non-SMTP address.
Say systm2.xyzcorp.com is delivering a mail to [email protected] and user DOE has
mail forwarded to SYSTM1::DOE. In this case the symbiont doesn't know it's
gatewaying mail. It simply passes the string "doe" to VMS callable mail as the
recipient address and the VMS mail From: line is SMTP%"[email protected]".
When user DOE on SYSTM1 reads their mail it the VMS mail From: line appears in
exactly the same format as the previous example:
From: SYSTM2::SMTP%"[email protected]"
--------------------
Miscellaneous SMTP/non-SMTP issues
--------------------
Not just DECnet that works like above:
The examples above all used DECnet as the prototypical non-SMTP MTA. However
all the same things happen with other non-SMTP address like MTS addresses and
other foreign transport address too (eg. DSN%, NM%, etc.)
Unix sendmail.cf files tend to munge these addresses.
If some of these addresses (eg. From: "NODE::USER"@dom.ain) are passed
through or delivered to Unix systems there is a high likelyhood that the Unix
system will modify and corrupt the address. The cause of this is a Unix
sendmail.cf file that doesn't understand the address format and so misparses
it and rewrites it incorrectly. If you see this happen it is important to
understand that these addresses although syntactically complex are entirely
legal according to the RFC 822 address syntax.
Often the corruption of the address will be such that it still manages to get
delivered to where it is going but is unreplyable. Sometimes it never even
gets to where it's going and has to be bounced. Usually in that case the mail
can't be bounced either since the MAIL FROM address is in the same format as
the From address and if the one couldn't be understood then the other won't
be either. In that case it will most likely become a dead letter.
Here are some examples of correct versions of these types of addresses and
the types of munging that are commonly performed by bad sendmail.cf files.
Correct:
From: "SUMNOD::SMITH"@xyzcorp.com
Incorrect variant:
From: SUMNOD::[email protected]
This address is incorrect because the local part contains a colon
which is an RFC 822 "special" character. The RFC address syntax
requires that a local-part that contains a special character must be
in double quotes.
Correct:
From: "SUMNOD::XXXMTS::MRGATE::\"YYYMTS::A1::SMITH\""@xyzcorp.com
Incorrect variants:
From: "SUMNOD::XXXMTS::MRGATE::"YYYMTS::A1::SMITH""@xyzcorp.com
This variant is wrong because it doesn't "escape" the nested double
quotes with backslashes.
From: SUMNOD::XXXMTS::MRGATE::\"YYYMTS::A1::SMITH\"@xyzcorp.com
This variant is wrong for the same reason that
SUMNOD::[email protected] is wrong. Special characters in a
local-part require double quotes around the local part.
From: SUMNOD::XXXMTS::MRGATE::"YYYMTS::A1::SMITH"@xyzcorp.com
This variant is wrong for both reasons.
--------------------
SMTP/non-SMTP worklist items
--------------------
This section documents some items in the UCX worklist which will hopefully make
life easier for users who want to send mail between non-SMTP environments and
the Internet via UCX SMTP. The problem is that the complex addresses generated
by UCX SMTP's SMTPfication are usually munged by Unix sendmail.cf files.
Provide mechanism to hide DECnet addresses:
UCX may add support for hiding DECnet addresses inside SMTP addresses. This
is a commonly supported practice. The two options are
1) Have a special SMTP domain (perhaps configurable by the UCX system
manager) that UCX SMTP recognizes as mail destined for DECnet. For mail
coming from SMTP to this domain the SMTP mailer essentially takes whatever
is before the first "." in the domain and that is the DECnet nodename. For
mail coming from DECnet destined for SMTP we take the DECnet node name and
tack on the special DECnet domain to form an SMTP address. Digital's own
"enet.dec.com" domain is an example of this. When one sends mail to
[email protected] the mail goes via SMTP to a Digital mail hub that
has a wildcard MX for *.enet.dec.com pointing to it. This mail hub
transforms [email protected] to NODNAM::USER and forwards the mail
to that address via DECnet.
For example:
Say the new feature allows the system manager to configure their
special DECnet domain and the manager of xyzcorp.com has theirs set to
decnet.xyzcorp.com. Further assume they have a wildcard MX record set
up so that mail to be sent to *.decnet.xyzcorp.com is to be sent to
systm2.xyzcorp.com. Say a mail is sent from the Internet somewhere
outside xyzcorp's corporate network to [email protected].
It is routed via SMTP to systm2.xyzcorp.com. At this point UCX SMTP
sees that the domain of the SMTP address is the "special" DECnet domain
and so transforms the recipient address from
[email protected] to systm1::smith and delivers the mail
locally via callable mail to the address systm1::smith.
Coming in the other direction DECnet mail sent from SMITH to
SYSTM2::JONES where jones has mail forwarded via SMTP as in the
examples earlier in this section would no longer be From:
"SYSTM1::SMITH"@xyzcorp.com. It would now be From:
[email protected]
2) The other option is just a different syntactical technique to do the
same thing. With option 2 we put hooks in the mailer to support special
interpretation of the percent sign hack when the domain following the
percent sign indicates a particular foreign transport.
For example:
smith%[email protected]
Provide mechanism hide MTS addresses:
It may be possible to do the same thing for MTS (aka Message Router, MRGATE)
mail too. Eg: To: [email protected] funnels mail off to joeuser via
MTS when it arrives at xyzcorp.com.
For sites where users have VMS mail forwarded to ALL-in-1 see the description
of the UCX SMTP UCX$SMTP_REWRITE_MTS_FROM logical in section "Special case
logicals for MTS interaction".
----------------------------------------
Undeliverable Mail
----------------------------------------
When UCX encounters a mail that it cannot deliver it must bounce it back to the
sender. To do so it forms an undeliverable mail message (aka. a "bounced mail")
and sends it to the address in the SMTP Return-Path header (which is from the
MAIL FROM SMTP protocol command). In other words the MAIL FROM address of the
mail we were not able to deliver becomes the RCPT TO address of the bounced mail
message. The bounced mail message contains information about what went wrong,
which addresses got the mail and which didn't (for multiple recipient mail
messages) and also the entire text of the mail message being bounced. As
required by the SMTP RFC's the bounced mail message is sent with a null MAIL
FROM command (ie. MAIL FROM:<>) to prevent bounced mail about bounced mail.
What if we can neither deliver nor bounce a mail?
In the case where we discover that we cannot deliver a mail message and then
try to bounce it and cannot bounce it either what to do? Under such
circumstances UCX SMTP delivers the mail to the UCX_SMTP account under the
assumption that UCX_SMTP is forwarded to some account that is read regularly
by someone who wants to know about dead letters. (See "Postmaster field"
section of "UCX SMTP Configuration database entry".) If, for some reason, the
message cannot be delivered to the UCX_SMTP account it is left as an orphan
control file. ie. A dead letter. A message is signalled to the UCX SMTP
symbiont log.
What to do if bouncing bounced mail?:
Since a null MAIL FROM is legal an SMTP mailer must handle the case where it
is trying to bounce a mail message and the MAIL FROM is null. This is the
case where we are trying to deliver a message which is itself a bounced mail
and so cannot be bounced. In this case UCX SMTP will send the message to the
UCX_SMTP account. As above, if the message cannot be delivered to the
UCX_SMTP account it is left as an orphan control file and a message is
signalled to the UCX SMTP symbiont log.
----------------------------------------
Configuring UCX SMTP
----------------------------------------
This section documents the buttons knobs you have to configure UCX SMTP.
--------------------
UCX SMTP Common directory
--------------------
In earlier versions of UCX SMTP all files were stored in the UCX_SMTP system
specific directories. UCX SMTP now allows the system manager to create a
directory visible to all cluster nodes (or a subset) and store certain SMTP
files there. To use this feature the system manager must create the directory
and define a system logical UCX$SMTP_COMMON to point to it. At this time the
following files may go into UCX$SMTP_COMMON:
- UCX SMTP mailing list (.DIS) files. See "UCX SMTP Mailing Lists"
- The Local Aliases file. (See "Local Aliases File")
--------------------
Local Aliases File
--------------------
The local alias feature allows the system manager to define a list of domains
that UCX SMTP will interpret as local. (See "Local vs. non-local SMTP mail".) If
it sees mail to any one of the domains specified as local aliases it will
deliver the mail on the local system via callable VMS mail rather than
forwarding it on to another system via the SMTP protocol.
To define the aliases that you want to be considered local you simply use your
text editor or the DCL create command to create a file called
UCX$SMTP_LOCAL_ALIASES.TXT. You can put the file in either the UCX$SMTP_COMMON
directory or, if you don't define UCX$SMTP_COMMON, you can put the file in
SYS$SPECIFIC:[UCX_SMTP]. Each line in the file is one domain that you want UCX
SMTP to recognize as local. For example:
$ SET DEF UCX$SMTP_COMMON
$ CREATE UCX$SMTP_LOCAL_ALIASES.TXT
!
! This is a comment.
alias1.mydomain.edu
alias2.mydomain.edu
alias3.mydomain.edu
<CTRL-Z>
$ @SYS$MANAGER:UCX$SMTP_SHUTDOWN.COM
$ @SYS$MANAGER:UCX$SMTP_STARTUP.COM
The above example tells UCX SMTP to recognize "alias1.mydomain.com",
"alias2.mydomain.com" and "alias3.mydomain.com" as local. If the symbiont on
your host sees mail to [email protected], [email protected] or
[email protected] it will consider the mail local and try to deliver it
to the user on your system.
The entries in the local alias file must adhere to the following syntax rules.
- There may be only one alias entry per line.
- Comments follow the same rules of SMTP .DIS files. The comment character,
a "!", must appear in the first column.
- UCX SMTP does not append the local domain name to an entry that it reads
with no "." in it. For example, if your local domain is "mydomain.com" and
you want "alias1.mydomain.com" to be recognized as local you must enter
"alias1.mydomain.com" into the local alias file. Entering "alias1" is not
sufficient.
Other miscellaneous notes:
- When UCX SMTP compares entries in the local alias file with the domain of
an address it does so case insensitively. For example, if the local alias
file contains "alias1.mydomain.edu" and a mail is sent to
"ALIAS1.MYDOMAIN.EDU" a match occurs and the mail is considered local.
- The local aliases file protection must be W:RE.
- There is a maximum of 255 aliases each of which can be a maximum of 64
characters long.
- After changing the local alias file you must stop and restart UCX SMTP in
order for the changes to take effect.
One use of the local aliases file is in a cluster where you want each host to
accept inbound mail for all of the cluster members. Simply enter the names of
the cluster members into the local aliases file in UCX$SMTP_COMMON.
--------------------
UCX SMTP Configuration database entry (UCX SET CONFIG SMTP)
--------------------
This section suplements the other UCX SMTP documentation on the UCX SMTP
CONFUGRATION database entry.
---------------
Postmaster field
---------------
There are too many bugs that arise when users try to change the Postmaser field
in the UCX SMTP configuration database and it's inclusion as a configurable item
was at best poorly executed and at worst ill-conceived. Therefore
- the account that UCX SMTP runs in is UCX_SMTP.
- The Postmaster field is a deprecated field.
- Leave it alone. Ie. Leave it as UCX_SMTP.
- Do not muck around with the UCX_SMTP account unless you have been asked to
do so by Digital.
All sites should also set forward for two key SMTP usernames to an account which
is read regularly. The system account is the most likely candidate. Eg:
MAIL> SET FORWARD/USER=UCX_SMTP SYSTEM
MAIL> SET FORWARD/USER=POSTMASTER SYSTEM
Setting forward for UCX_SMTP to SYSTEM means that any messages which could
neither be delivered to the recipient nor bounced back to the sender are
delivered to the SYSTEM user.
--------------------
UCX SMTP configuration logicals
--------------------
This is to document the SMTP configuration logicals which, heretofore, have been
documented only in release notes.
Notes about SMTP logicals:
- SMTP logicals governing the behavior of the symbiont are translated at
queue startup time. If the logical value is changed or deassigned then the
queue must be stopped and started in order for the change to take effect. Ie.
you need to do UCX STOP MAIL, define your logicals, then do UCX START MAIL.
- SMTP logicals governing the behavior of the receiver are translated when
the receiver image starts up. Since a new receiver process is started for
each inbound connection to port 25 there is nothing to start or stop. The
logicals take effect for the next receiver process created.
- Some SMTP configuration logicals are "boolean" in nature in that they are
associated with an SMTP configuration option that is either on or off. If
the logical is defined then the option is considered to be on. If it is not
defined then the option is off. The actual *value* of the logical is not
examined by the symbiont although by convention these logicals are defined to
"1". Defining the logical to "OFF" or "NO" or "0" will still have the effect
of turning the option on! To turn the option off don't define the logical at
all.
- The SMTP configuration logicals must be defined as /SYSTEM except where
noted.
Here is a list of all of the UCX$SMTP logicals. Boolean logicals are marked as
such.
********************************************************************************
* Diagnostic logicals
********************************************************************************
Name: UCX$SMTP_LOG_LEVEL
Type: Numeric
Values: 2,3 or 5
This logical tells the SMTP symbiont what diagnostic information to write to the
log file. It can have one of three values, 2, 3 or 5 with 2 being the least
verbose and 5 being the most. The values are cumulative in that all messages
printed out by one logging level are printed out by each of the more verbose
logging levels. A value of "3" is recommended.
Value "2"
- All of the SMTP configuration info is logged when the symbiont starts
up.
- The "next open file" message is printed giving the name of each control
file before processing on it begins.
- All mail headers and mail recipients in a control file are logged after
control file processing is complete.
Value "3"
- Logs additional information about symbiont initialization and symbiont
activity during control file processing without being overly verbose.
Value "5"
- Full symbiont diagnostics. For use only when diagnosing problems. Much
of this will only be of use to Digital engineering staff but a diligent
user can still get a sense of what's going on.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_NOSEY
Type: Boolean
Values: NA
This logical tells the symbiont to print out the Subject RFC header when it logs
the RFC headers if UCX$SMTP_LOG_LEVEL is defined. If this logical is not defined
then the Subject header is logged as "Subject: <omitted>".
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_LOG_LINE_NUMBERS
Type: Boolean
Values: NA
If defined line numbers are written to UCX SMTP logs. This includes the
symbiont, receiver and MAIL$PROTOCOL (DEBUG.TXT) logs.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_SYMB_TRACE
Type: Boolean
Values: NA
This logical tells the symbiont to log all messages received from and
transmitted to remote SMTP servers. It allows you to trace the SMTP application
layer protocol. Any unprintable and/or control characters sent/received are
printed as \n where 'n' is the hex value of the character. For example, command
lines and replies are terminated with a <CR><LF> which would appear in the log
like this:
send buf=MAIL FROM:<[email protected]>\d\a
recv buf=250 <[email protected]>... Sender OK\d\a
The "\d\a" is the <CR><LF>. CR is hex 'd' and LF is hex 'a'.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_RECV_TRACE
Obsoletes: UCX$SMTP_PROTO_TRACE
Type: Boolean
Values: NA
This logical tells the receiver to log all messages received from and
transmitted to remote SMTP clients. The same conventions for logging unprintable
and/or control characters are used.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_RECV_DEBUG
Obsoletes: UCX$SMTP_PROTO_DEBUG
Type: Boolean
Values: NA
This logical tells the receiver to log full diagnostics. It performs a similar
function to the symbiont's UCX$SMTP_LOG_LEVEL 5.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_VMSMAIL_SEND
Type: Boolean
Values: NA
If this logical is defined the MAIL$PROTOCOL will log diagnostics to a file
named DEBUG.TXT in the default directory. Much of this will only be of use to
Digital engineering staff but if you are familiar with the MAIL$PROTOCOL
interface you can see what is coming into the SMTP MAIL$PROTOCOL code. If you
are debugging the mail$protocol code running in a user process sending mail
then this logical need not be a system logical. If you are debugging the
MAIL$PROTOCOL code running when DECnet mail comes in then it's running in the
context of the DECnet Mail11 network object and so the logical needs to be a
system (or group logical).
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_VMSMAIL_PARSE
Type: Boolean
Values: NA
This causes the UCX SMTP address parsing code to log diagnostics. The symbiont,
receiver and the MAIL$PROTOCOL code are all sensitive to this logical. This
logical is primarily for the use of Digital engineering staff.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_LOG_MEMORY, UCX$SMTP_LOG_EFS
Type: Boolean
Values: NA
These options are primarily for use of Digital staff in tracing memory leaks and
event flag leaks.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_SYMB_SNAPSHOT_BLOCKS and UCX$SMTP_RECV_SNAPSHOT_BLOCKS
Type: Numeric
Values: 1-1000
In cases where errors are being signalled in the symbiont or receiver logs
intermittently and are not reproducable at will it is often not desirable to
simply run with full diagnostics turned on and wait for the error to occur
again. This wastes disk space creating huge logs and slows down processing of
mail dramatically.
The symbiont and receiver have a feature called "snapshot logging" which allows
you to run with full diagnostics turned on but only write the diagnostics to the
log file if an error is signalled. This saves disk space and allows the receiver
and/or symbiont to run at a normal speed. As each line of diagnostic text is
generated it is saved in an internal "snapshot" buffer rather than to the disk.
The buffer is "circular" in that once it fills up, new lines of text simply
start to overwrite the old data already there. This provides an up to date
snapshot of the last "so many" lines of diagnostic text.
There are two logicals to turn this feature on. One for the symbiont and one for
the receiver. They are respectvely UCX$SMTP_SYMB_SNAPSHOT_BLOCKS and
UCX$SMTP_RECV_SNAPSHOT_BLOCKS. The value you assign to these logicals is the
desired size of the snapshot buffer in VMS blocks (1 block being 512 bytes).
Defining either one of these logicals for the given component(s) (symbiont
and/or receiver) turns on the snapshot logging function.
When turning this feature on you are still required to define the other SMTP
diagnostic logicals that tell UCX SMTP what types of logging you want. (EG. For
the symbiont you still want to define UCX$SMTP_LOG_LEVEL to 5.) Here are two
examples of setting up symbiont and receiver snapshot logicals.
This sets log level to 5 and turns on snapshot logging for the SMTP symbiont
with a snapshot buffer of 200 blocks.
$ DEFINE/SYSTEM UCX$SMTP_LOG_LEVEL 5
$ DEFINE/SYSTEM UCX$SMTP_SYMB_SNAPSHOT_BLOCKS 200
This sets all of the receiver diagnostics on and turns on snapshot logging for
the receiver with a snapshot buffer of 200 blocks.
$ DEFINE/SYSTEM UCX$SMTP_RECV_DEBUG 1
$ DEFINE/SYSTEM UCX$SMTP_RECV_TRACE 1
$ DEFINE/SYSTEM UCX$SMTP_RECV_SNAPSHOT_BLOCKS 200
Note that when you have snapshot buffering turned on for the symbiont it takes
some time for the symbiont process to stop when you do a UCX STOP MAIL or stop
the queue. This is because stopping the queue causes the symbiont to signal the
"Symbiont stopping" condition which is not an error but which still causes the
snapshot buffer to be dumped. The amount of time writing out the snapshot buffer
takes depends on its size and the speed of the system and its disks. When the
queue state is "Stopped" rather than "Stopping" the symbiont is process is
really stopped.
********************************************************************************
* Miscellaneous Configuration logicals
********************************************************************************
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_NO_SUBS_DOMAIN_INBOUND
Type: Boolean
Values: NA
Tells UCX SMTP not to consider mail sent to the substitute domain as local.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_COMMON
Type: String
Values: NA
This logical specifies cluster common directory where certain UCX SMTP files can
be placed by the system manager. UCX SMTP will now look for .DIS files and for
the local alias file in this directory if it is defined. It is the system
manager's responsibility to define this logical before UCX SMTP startup and to
create the directory and to move the .DIS files and/or local alias file there.
If UCX$SMTP_COMMON is not defined then UCX SMTP will look for the files in
SYS$SPECIFIC:[UCX_SMTP].
This logical may be a search list. You may wish to have UCX SMTP look at the
clusterwide directory first and SYS$SPECIFIC:[UCX_SMTP] second. For example:
$ DEFINE/SYSTEM UCX$SMTP_COMMON WORKDISK:[SMTP_DIS], -
SYS$SPECIFIC:[UCX_SMTP]
Note that other files like control files and logs are still kept in
SYS$SPECIFIC:[UCX_SMTP] directory.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_JACKET_LOCAL
Type: Boolean
Values: NA
This option affects the VMS mail From: line of mail delivered by the SMTP
symbiont. The SMTP symbiont contains logic to detect when SMTP mail that
originated on the local host is also being delivered to VMS mail on the local
host. In this case the From: line text that the symbiont passes to VMS mail will
contain only the username rather than SMTP%"username@host". Put another way, the
symbiont won't put the VMS mail From: line in the SMTP% jacket on local-to-local
mail. Since the VMS mail From: line contains only the username it is impossible
to tell that the mail message went through SMTP simply from looking at the VMS
mail From: line. This causes problems for the POP server which looks at the
From: address when it's deciding whether or not it can safely ignore the VMS
mail headers and, instead, use the SMTP RFC headers from the body of the mail.
The UCX$SMTP_JACKET_LOCAL option tells the symbiont to put the SMTP jacket on
local-to-local mail to short circuit the above described special case handling
of local-to-local mail.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_INBOUND_NOXVMS
Type: Boolean
Values: NA
This option affects the VMS mail To: and CC: lines of mail delivered by the SMTP
symbiont. It tells the symbiont not to use the RFC X-VMS-To header (if any) as
the text of the VMS mail To: line and the X-VMS-CC header (if any) as the text
of the VMS mail CC: line. Instead the RFC To: and CC: lines are used. If
UCX$SMTP_INBOUND_NOXVMS is *not* defined the SMTP symbiont will use the text of
the X-VMS-To and X-VMS-CC lines (if present) for their respective VMS mail
header lines.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_VMSDEF_TO
Type: Boolean
Values: NA
This option affects the VMS mail To: line of mail delivered by the SMTP
symbiont. It tells the symbiont not to pass any text for the To: line to VMS
callable mail when delivering local mail. This causes VMS callable mail to use
the default text for the To: line which will be the username. This option
overrides UCX$SMTP_INBOUND_NOXVMS for the To: field.
********************************************************************************
* Special case logicals for MTS interaction
********************************************************************************
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_MTS_ALLIN1
Type: Boolean
Values: NA
When relaying mail from the SMTP environment to MTS (aka. Message Router) the
symbiont puts "UCX_SMTP" into the From field. This hack, the "UCX_SMTP hack",
was needed because without it older versions of MR/MRGATE would purposefully
bounce the mail with a "Return path too complicated" error.
The UCX_SMTP hack is no longer needed provided that you are running MR V3.3A and
MRGATE V3.3A and either UCX V3.2 ECO 8 or UCX V3.3 ECO 1 or UCX V4.0. Version
3.3A of MR/MRGATE will not bounce the mail and will pass it on to VMSmail with
the nested double quotes. VMSmail will not reject the mail because of the nested
double quotes in the from field but *the mail will be unreplyable*. With a
future version of VMS mail it will be replyable. That is, nested double quotes
will be supported by VMS mail.
The UCX$SMTP_MTS_ALLIN1 option disables the UCX_SMTP hack. This will allow the
correct From: address to be received by your All-in-1 users.
In summary, if you want to short circuit the UCX_SMTP hack then you need to
upgrade MR and MRGATE to version V3.3A and you need to define the
UCX$SMTP_MTS_ALLIN1 logical before SMTP queue startup.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_REWRITE_MTS_FROM
Type: Boolean
Values: NA
Many sites make heavy use of All-in-1 and MTS. They have all or many of their
users forwarded to All-in-1 via MTS addresses. For example:
MAIL> !All-in-1
MAIL> set forwa/user=bjarne MRGATE::A1::BJARNE
This setup can cause problems when an SMTP mail comes in from the Internet, is
forwarded to MTS and is replied to from the all-in-1 account. Either the reply
is bounced once it makes its way onto the Internet or the mail makes it to the
other end but can't be replied to because the return address has been corrupted.
To fully understand what the trouble is an example is required. Say there is a
UCX SMTP system with the host name xyz.com and on this system mail to user
bjarne is forwarded to All-in-1 as above. Now say that user [email protected] sends
an SMTP mail over the Internet to [email protected]. This mail will be relayed to
the UCX xyz.com system and then the SMTP symbiont on xyz.com will hand the mail
off to VMS mail which will hand it off to MTS (because of the forwarding for
user bjarne) which will deliver it to the all-in-1 user on the other system.
Now, say that the user BJARNE on that system decides to reply to the mail. If he
does, the reply is sent via MTS back to the XYZ.COM system. At this point the
SMTP symbiont on xyz.com must form a From RFC header for the mail to be sent
into SMTP and out onto the Internet. It use the UCX SMTP SMTPfication procedure
to do this. So the SMTP From header would look something like this:
From: "MRGATE::SUMNOD::\"MRGATE::SUMNOD::BJARNE\""@XYZ.COM
Once this is done the mail is sent out into the Internet and UCX SMTP is done
with it. The problem is that, although this address is absolutely correct, most
U*ix systems on the Internet do not have sendmail.cf files that can handle such
addresses; the result, bounced mail and/or corrupted addresses. See
"Miscellaneous SMTP/non-SMTP issues".
The UCX$SMTP_REWRITE_MTS_FROM configuration logical allows the system manager to
tell the symbiont that when it tries to form an address in the From field such
as the one above it should parse the simple USERNAME out of the complex MTS
address and append the local host name to that instead. It's a type of simple
address rewriting. This way only a simple address gets sent out on the Internet.
Since the user is forwarding their mail on XYZ.COM to MTS, a reply coming *back*
to this user will be correctly relayed back to MTS.
Given the above example where mail comes from the Internet to user
[email protected] and is forwared to All-in-1 and replied to, the RFC From: header
that UCX SMTP sends onto the Internet for the reply will no longer be:
From: "MRGATE::SUMNOD::\"MRGATE::SUMNOD::BJARNE\""@XYZ.COM
It will now be:
From: [email protected]
Now when the mail goes out into the net the reply path will be simple and cause
no porblems. If the recipient replies the reply will come back to user bjarne on
xyz.com and, because this user has their mail forwarded it will go to MTS and on
to All-in-1 as desired.
There is an important caveat to this feature which requires that it be used with
caution. There is one scenario where it won't work right. Say a user on host
xyz.com has their mail forwarded to SMTP%"[email protected]" and that this
user receives a mail from MTS (say it's from MRGATE::A1::JONES). If the
UCX$SMTP_REWRITE_MTS_FROM logical is defined on xyz.com then user "mary" will
receive the mail on myhost.xyz.com as being from [email protected] because the SMTP
symbiont on xyz.com has parsed out just the username from the MTS From address.
If user mary replies to this it will cause a mail to be sent to [email protected].
In this example note that we have not said whether or not user jones even has an
account on xyz.com at all. If they do then the mail will be delivered to their
account on host xyz.com. If the account is forwarded it will go to where it was
forwarded to. If jones doesn't have an account though, which is likely, then the
mail will be bounced. For this reason this feature is really only for use on
sites that have most or all of their users forwarded to All-in-1 as above.
********************************************************************************
* Non-local mail routing options
********************************************************************************
"Non-local mail" is mail that is destined for another system rather than "local"
mail which is to be delivered locally to VMS mail.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_ALTGATE_ALWAYS
Type: Boolean
Values: NA
This option tells the symbiont to send all non-local mail to the alternate
gateway. No zone check is performed.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_MX_IF_NOALTGATE
Type: Boolean
Values: NA
Tells the symbiont to try to use MX records to get to a host if the alternate
gateway cannot be reached.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Name: UCX$SMTP_NO_MX
Type: Boolean
Values: NA
Ths option tells the SMTP symbiont not to use MX records to tell it where to
route mail. Rather it will try to translate the domain part of each SMTP address
into a host name and send directly to that address. Note that if the host name
doesn't translate to an address the mail will bounce. If the host is not
available then the mail will be requeued.
----------------------------------------
Miscellaneous VMS mail notes
----------------------------------------
--------------------
VMS mail native support for SMTP addresses
--------------------
Version 6.2+ of VMS contains built in support for SMTP type addresses in the VMS
mail To: line field without the SMTP% jacket. Eg: One can do
MAIL> send
To: [email protected]
rather than
MAIL> send
To: SMTP%"[email protected]"
When mail is sent to an SMTP address without the SMTP% jacket it is still
funneled to the MAIL$PROTOCOL interface just as it is when the SMTP% jacket is
used. This new feature makes use of SMTP address more seamless. See VMS
documentation for more information on VMS mail's native support for SMTP
addresses. Also see the UCX User Guide chapter on SMTP.
--------------------
Setting forwarding to an SMTP address
--------------------
On most VMS versions one needs to set forward to an SMTP address as follows:
MAIL> SET FORWARD SMTP%"""[email protected]"""
More recent versions allow:
MAIL> SET FORWARD SMTP%"[email protected]"
or even
MAIL> SET FORWARD [email protected]
See your VMS documentation and release notes or try it yourself to see what your
system supports. If you try it yourself always remember to do a SHOW FORWARD to
see the result. Older systems which expect the triple double quotes on either
side of the SMTP forwarding address will accept SET FORWARD
SMTP%"[email protected]" but will result in a forwarding address of
SMTP%[email protected] which then can't be parsed by VMS mail. What you want is
a SHOW FORWARD result that shows one pair of double quotes around the address.
Eg:
MAIL> sho forw
JONES has mail forwarded to SMTP%"[email protected]"
On clusters with different versions of VMS installed on different cluster
members there's no problem as long as you use the SMTP% jacket and the result of
a SHOW FORWARD is as above. (Ie. one pair of double quotes.)
All currently supported versions of UCX SMTP support users who've done a SET
FORWARD directly to an SMTP address without the SMTP% jacket regardless of which
VMS version is running. This support becomes an issue when UCX SMTP delivers
mail to a user who has in turn forwarded their mail out via SMTP. See
"Forwarding to an SMTP address".
--------------------
Miscellaneous SET FORWARD/USER tricks
--------------------
The VMS mail SET FORWARD/USER command allows one to create "aliases" for many
different purposes. Its syntax is:
MAIL> SET FORWARD/USER=alias-string forwarding-address
The /USER qualifier requires SYSNAM to prevent unprivileged users from
malisciously changing forwarding for other users. In the case where the SET
FORWARD/USER capability is needed by an unprivileged user the user must simply
request that the forward be set up on their behalf by a privileged user.
The key to the SET FORWARD/USER command is that the alias-string need not be a
username. Nor is it constrained by VMS username sytnax. The value can be up to
31 characters (compared with VMS username limit of 12 characters).
Here are some examples of functionality that can be gained through use of the
SET FORWARD/USER command and UCX SMTP:
1) Funnel mail for an alias to multiple users without a list file
UCX SMTP supports use of SET FORW/USER to create an alias that points to
an inline list of users. Say for example you wanted to create a "tech
suport" alias for technical support for some reason. You want anyone to be
able to send mail to this user (actually it's not a user, just an alias)
on your system and have it go to all of the the technical support people.
Further say there are at most only two or three peope in this role and you
don't want to set up and SMTP mailing list for it. You can do this:
MAIL> set forw/user=tech-support smtp%"""jones, [email protected]"""
MAIL> sho forw /user=tech-support
TECH-SUPPORT has mail forwarded to SMTP%"""jones, [email protected]"""
Note that you can't do this with plain old VMS mail addresses since VMS
mail doesn't support this. Eg. This can't be done
MAIL> set forw/user=xxxx jones,smith
%CLI-W-NOLIST, list of parameter values not allowed - check use of
comma (,) \JONES,SMITH\
But you can do it like so:
MAIL> set forw/user=xxxx SMTP%"""jones,smith"""
MAIL> sho forw/user=xxxx
XXXX has mail forwarded to SMTP%"jones,smith"
2) Use Firstname.Lastname syntax
The alias-string can contain a dot (.) which makes it possible to receive
mail where the local-part of the address contains a dot. One use of this
is the Firstname.Lastname syntax. Eg:
MAIL> SET FORWARD/USER=Beth.Jones SMTP%"""[email protected]"""
3) SHOW FORWARD/USER takes wildcards.
MAIL> sho forw/user=j*
Username Forwarding address
JIM_KIRK ENTPRS::SPOCK
JOE.BLOW SMTP%"[email protected]"
JONATHAN.QUINCY.HORNBLOWER SMTP%"[email protected]"
JONES SMTP%"[email protected]"
--------------------
The UCX SMTP cent sign hack
--------------------
Many SMTP address formed by UCX SMTP for the RFC 822 From field use the double
qoute character. For example:
From: "SYSTM1::SMITH"@xyzcorp.com
This has historically posed a problem when it comes time to put the RFC 822 From
header into the VMS mail From: line. To put the RFC 822 From: address into the
VMS mail From: line VMS mail (for most of its life) has required the address to
be enclosed in the SMTP% jacket. It also has required that the address in the
SMTP% jacket is itself enclosed in double quotes. Eg:
From: SMTP%"[email protected]"
^^^^^^ ^
VMS mail || |
requires || |
all of || |
this --->--++----->------>--+
Finally, VMS mail (until only very recently) hasn't allowed nested double
quotes. **
Given all this it was necesary to contrive some means to slip nested double
quotes by VMS mail in the VMS mail From: line. If this wasn't done mail from
SMTP with SMTP From: addresses containing double quotes would not be replyable
since the VMS mail From: line would not be syntactically correct. To "mask" the
nested double quotes UCX SMTP changes each one into a cent sign character before
passing it to VMS callable mail as the VMS mail From: line. This has come to be
known as the cent sign hack (not to be confused with the percent sign hack).
Now an example to illustrate. The RFC 822 From header of:
From: "SYSTM1::SMITH"@xyzcorp.com
becomes the VMS mail "cent sign hacked" From: line of:
From: SMTP%"�SYSTM1::SMITH�@xyzcorp.com"
If a reply is done to this what happens? VMS mail invokes the UCX SMTP
MAIL$PROTOCOL routine and passes this recipient address:
�SYSTM1::SMITH�@xyzcorp.com
When parsing the recipient address UCX SMTP's MAIL$PROTOCOL code changes the
cent signs back to double quotes and then continues normally.
** Well, more recent versions of VMS mail (VMS V7.?) have added support for
nested double qoutes. It's in the UCX SMTP worklist to change our code so
that you can either use the cent sign hack or some new code to properly nest
double quotes. (This will be configurable so UCX SMTP can contiue to function
with older versions of VMS mail that don't support nested double quotes.)
---------------
User use of the cent sign hack
---------------
Although the cent sign hack was invented for the reason above it can also be
employed by users who need to send mail to an SMTP address that requires double
quotes. (This is a rare occurence but it is still supported.) You can
purposefully compose and address like this providing you know how to use your
keyboard's compose key. The compose sequence for the cent sign is "C|". Working
in a DECterm the use of the compose key is non-intuitive. To type a cent sign
you need to
1) Hold down the compose key and then touch the space bar and release both
keys.
2) type the c key
3) type the | key
And voila - �
----------------------------------------
UCX SMTP mailing lists
----------------------------------------
A mailing list is a list of addresses contained in a file that can be sent to as
if it were a simple username. In UCX SMTP the name for a mailing list is the
name of the file itself. UCX SMTP mailing list files can reside in onw of two
places - either SYS$SPECIFIC:[UCX_SMTP] or UCX$SMTP_COMMON. The file must have a
.DIS extension and should be readable by the UCX_SMTP account. @@@
The entries in the local alias file must adhere to the following syntax rules.
- There may be only one address entry per line.
- The address must be SMTP addresses, not VMS addresses.
- No SMTP% jacket
- To get DECnet address in a UCX SMTP.DIS file enter it as:
<"NODNAM::USER">
The <" and "> are required.
- The comment character, a "!", must appear in the first column.
--------------------
VMS Majordomo
--------------------
Majordomo is a popular Unix based mailing list manager program it. It automates
maintenance of lists to a large degree. It also pre-processes each mail sent to
this list and allows for:
- Canned headers and text to be appended to each message sent to the list.
- Users to subscribe and unsubscribe themselves from the list.
- Moderated lists
- Digests
With a digest messages sent to the list are saved and compiled into a
single message - a "digest" - and then mailed out as one large mail
message.
- Archives
- users can see directories "served" by Majordomo and fetch files via email
Majordomo has been ported to VMS/UCX and is available for use as *unsupported*
software. The get more information simply send a mail message to
[email protected]
The subject of the mail doesn't matter. In the body of the mail enter
info vms-majordomo-users
----------------------------------------
Miscellaneous Stuff
----------------------------------------
--------------------
Queue watcher program
--------------------
In cases where queues are crashing it is desirable to have a workaround to let
mail keep flowing without constant human intervention. UCX SMTP provides such a
feature in the form of an unsupported "queue watcher" program called
UCX$RESTART_SMTPQ.COM which is supplied, as is, in the UCX$EXAMPLES directory.
This procedure file watches your SMTP queues and restarts them it it finds them
crashed. It runs as a self-perpetuating batch job. Among it's features are:
It won't restart your SMTP queues when you have shut down UCX SMTP.
It will find the likely "culprit job" that caused the queue to crash and put
that job on hold so that its simply doesn't come back into the queue and
crash the queue again.
It will optionally check the symbiont process's page file count and
gracefully stop it if it is running low. (This is the case where there is a
memory leak.) After the queue stops it will restart the queue transparent to
you. Stopping and restarting the queue stops the old symbiont process and
starts a new one with a fresh, full sized page file count again. This lets
mail keep flowing in spite of memory leaks. being incurred in the symbiont
process.
The UCX$RESTART_SMTPQ.COM procedure file contains instructions on its use.
--------------------------------------------------------------------------------
Terms
--------------------------------------------------------------------------------
address: See mail address.
body: The part of the mail after the headers, separated from
the headers by a single blank line. See "SMTP Message
Format Basics" and "Format of VMS mail message".
bounced mail: A mail message composed by an MTA indicating that
another message which the MTA was charged with
delivering couldn't be delivered. A bounced mail message
(aka. undeliverable mail notification) may contain
sections:
- that show what went wrong (often an SMTP protocol
dump or an error returned by the MTA's host mail
system),
- that show which addresses were successfully
delivered and which weren't
- that contain the text of the undelivered mail
message including the headers.
cent sign hack: The UCX SMTP practice of changing a double quote in an
SMTP address to cent sign character (�) before passing
it to VMS mail as the From: line to get around VMS
mail's inability to handle nested double quotes.
CF: Acronym for UCX SMTP control file.
control file: The binary file into which UCX SMTP packages up each
SMTP mail message. See "UCX SMTP Control File".
<CRLF> The sequence of ASCII characters composed of a carriage
return (decimal 13) followed by a line feed (decimal
10).
domain: The part of a mail address after the "@". Also called
the right hand side or the host. In the address
"[email protected]" the string "XYZCorp.COM" is the
domain. See "SMTP Mail Addresses".
envelope: The source and destination addresses sent in the SMTP
protocol's MAIL FROM and RCPT TO commands. The
destination address or addresses from the RCPT TO
command(s) may match certain headers contained in the
mail message but are not required to. The Return-Path
header appended to the mail message's headers at
delivery time must take the address of the MAIL FROM
command. See "SMTP Protocol Overview".
foreign transport: A VMS mail term. A foreign transport is a mail transport
other than VMS mail's native MAIL11 protocol through
which users want to send mail. To cause a mail message
to be sent over a foreign transport the foreign
transport mail address in the VMS mail To: line is
prefixed with a string which is the name of the foreign
transport and a percent sign (%). Common examples are
SMTP% and NM%. See "VMS mail Foreign Transport/
MAIL$PROTOCOL Interface".
headers: The initial lines of a mail message which mus comply
with a pre-defined format. SMTP and VMS mail define
different legal headers. For information on SMTP headers
(aka. RFC 822 headers) see "SMTP Message Format Basics".
For information on VMS mail headers see "Format of VMS
mail message". The syntax of SMTP headers is specified
fully in RFC 822.
local-part: The part of a mail address before the "@". Also called
the left hand side or the user. In the address
"[email protected]" the string "jones" is the
local-part. See "SMTP Mail Addresses".
local mail: Any mail message being sent to an address where the
domain part of the address is such that UCX SMTP must
deliver the mail locally via callable VMS mail to the
local-part of the adrdress. See "Local vs. non-local
SMTP mail".
Mail11: The VMS/DECnet mail protocol.
MAIL$PROTOCOL Interface: The procedure call interface that VMS mail uses to pass
a mail message to a foreign transport.
mail message: The mail text or "payload" that is transfered by the MTA
and delivered by the MUA to the destination mail
address. It is not to be confused with the "envelope".
The text of the mail message consists of the headers
followed by a blank line followed by the body. See
"header" and "body".
The format of a mail message is specified in RFC 822 and
enhanced by the MIME RFCs. See "SMTP Message Format
Basics" and "What is MIME?".
mail address: The text string used to represent a point to which an
MTA delivers a mail message or to identify the point
from which the mail came. Syntax is defined in RFC 822,
Chapter 6.1. In its simplest form an address appears as
the familiar "user@host". Rather than use the terms user
and host the terms "local-part" and "domain" are used
here.
Mail User Agent: See MUA.
Message Transfer Agent: See MTA.
MUA: The Mail User Agent. The user interface component of a
host's mail system. With it users read, compose and
file their mail messages.
MTA: Message Transfer Agent. The software that implements the
SMTP protocol (client and server) to transfer mail
between an originating host and a destination host.
MX record: A DNS maintained resource record used by SMTP MTA's to
assist in the routing of mail. See "MX Record Overview".
non-local mail: Any mail message being sent to an address where the
domain part of the address is such that UCX SMTP must
relay the message to another SMTP host. See "Local vs.
non-local SMTP mail".
orphan control file: A control file for which there is no corresponding entry
in an SMTP queue. This can occur when a catastrophic
error was incurred while processing the control file
(like a corrupt control file) *or* when the message
could neither be delivered, nor bounced nor delivered to
the UCX_SMTP account. See "Undeliverable Mail".
outbound mail: Synonym for non-local mail.
percent sign hack: Aka. BBN hack, %-hack, See "Source Routing".
reply code: The three ASCII digit string sent at the start of each
reply sent by the SMTP server to the client. These are
explained in detail in Appendix E of RFC 821. See "SMTP
Server Replies".
RFC: Request For Comments. In the Internet world the
specifications that define standards, like the SMTP
protocol, are called RFC's.
RFC 822 headers: See definition of headers.
SMTP% jacket: The SMTP text around an SMTP address that identifies it
as such. For most VMS systems this is the SMTP% plus the
additional double quotes. Eg.
SMTP%"[email protected]"
^^^^^^ ^
|| |
++-<- SMTP% jacket -->--->--+
SMTPfication: The process of transforming any non-SMTP mail address
into an SMTP legal mail address. This is strictly a UCX
SMTP term. See "SMTPfication of non-SMTP addresses".
source routing: The capability for mail addresses to explicitly specify
the route the mail message should take as part of the
address itself. See "Source Routing".
stray control file: Synonym for orphan control file.
T.R | Title | User | Personal Name | Date | Lines
|
---|