Simple Mail Transfer Protocol  
 

The Simple Mail Transfer Protocol (SMTP) enables applications to deliver email messages to one or more recipients. The control provides an interface for addressing and delivering messages, and extended features such as user authentication and delivery status notification. This control is typically used in conjunction with the Mail Message control to create the messages, and the Domain Name Service control to determine what servers are responsible for accepting mail for a specific user.

Mail Exchanges

When a message is delivered to a user, the application must determine what mail server is responsible for accepting messages for that user. This can be accomplished using the Domain Name Services (DNS) protocol, a protocol that is most commonly used to resolve host names such as www.microsoft.com into Internet addresses. This is typically accomplished by sending a request to a nameserver, a computer system that provides domain name services. In addition to resolving host names, nameservers can also provide information about those servers which are responsible for accepting mail for a given domain. There can be multiple servers which process mail for a domain with each server assigned a priority as part of their mail exchange (MX) record. If there is no mail exchange record for a domain, then the domain name itself is used.

To deliver a message directly to the recipient, you must examine the recipient address and request the list of mail exchanges for that user's domain. Using the DNS control, this is done by reading the MailExchange property array. If the recipient address is joe@example.com, you would want to enumerate the mail exchanges for the example.com domain. This will give you the name of the servers that will accept mail for users in that domain. For example, the property may return the host name mail.example.com as the name of the server which will accept mail for users in the example.com domain. Note that it is possible that one or more of the mail exchanges for a domain may not be in the recipient domain itself. In other words, it is possible that smtp.othercorp.net could be returned as a mail exchange for example.com. This is frequently the case when another organization is forwarding mail for that domain.

Therefore, there are three general steps that you must take when delivering mail directly to the recipient:

  1. Parse the address of each recipient in the message. If you are using the MIME control, the Recipient and Recipients properties can be helpful in extracting all of the recipient addresses. Everything after the atsign (@) in the address is the domain portion of that address.
  2. Perform an MX record lookup using the DNS control by setting the HostName property to the domain name and reading the values returned in the MailExchange property array. This property will return the name of the servers responsible for accepting mail for that user. If there are more than one server, they will be returned in order of their relative priority, with the highest priority server having a lower index value. This means that you should attempt to connect to those servers in the order that they are returned by the property, starting with an index value of zero.
  3. Attempt to connect to the first server returned by the MailExchange property array. The connection should be on the default port, and you should not attempt to use any authentication. If the server accepts the connection, then use the SendMessage method to deliver the message. If the connection is rejected or the message is not accepted, attempt to connect to the next mail exchange server until all servers have been tried.
  4. If no mail exchange servers were returned by the MIME control's MailExchange property, or you could not connect to any of them, attempt to connect to the domain specified in the address using the default port. If the connection succeeds, then deliver the message. If you cannot connect or the message is not accepted, then report to the user that the message could not be delivered.

One last important consideration is that many Internet Service Providers now block outbound connections on port 25 to any mail servers other than their own. If you are unable to establish any connections, either with the error that the connection was refused or it consistently times out, contact your ISP to determine if port 25 is being blocked as an anti-spam measure. If this is the case, it will be required that you relay all messages through their mail servers.

Relay Servers

In some situations it may not be possible to send mail directly to the server that accepts mail for a given domain. The two most common situations are corporate networks which have centralized servers that are responsible for delivering and forwarding messages, or an Internet Service Provider (ISP) which specifically blocks access to all mail servers other than their own. This is usually done as either a security measure or as a means to inhibit users from sending unsolicited commercial email messages. If the standard SMTP port is being blocked, then any connection attempts will either fail immediately with an error that the server is unreachable, or the connections will simply time-out. In either case, a relay server must be specified in order to send email messages.

A relay server is a system which will accept messages addressed to users who may be in a different domain, and will relay those messages to the appropriate server that does accept mail for the domain. Using a relay server is generally easier than sending messages directly to the recipient. In order to send a message through a relay, you need to perform the following steps:

  1. Connect to the relay server as you would normally.
  2. Authenticate the client to the server. This may or may not be required, depending on how the server is configured. Some servers may be configured to only require authentication if you are connecting from an IP address that is not recognized as part of that system's network, for example, if you are connecting using a different Internet Service Provider. Others may always require authentication. Check with the server administrator if necessary to determine if and when authentication is required.
  3. Use the SendMessage method to deliver the message to the recipients through the relay server. If there are multiple recipients, you can use the MIME control to enumerate the recipient addresses and then pass them to the SendMessage method.

It is important to note that using a mail server as a relay without the permission of the organization or individual who owns that server may violate Acceptable Use Policies and/or Terms of Service agreements with your service provider. Systems which relay messages from anyone, regardless of whether the message is coming from a recognized domain, are called open relays. Because open relays are often used to send unsolicited email, many administrators block mail that comes from one. It is recommended that users check with their network administrators or Internet service providers to determine if access to external mail servers is restricted and what is the acceptable use policy for relaying messages through their mail servers.

The following methods are available for use by your application:

Initialize
Initialize the control and load the Windows Sockets control for the current process. This method is normally not used if the control is placed on a form in languages such as Visual Basic. However, if the control is being created dynamically using a method similar to CreateObject, then the application must call this method to initialize the component before setting any properties or calling any other methods in the control.

Connect
Establish a connection to the SMTP server. Once the connection has been established, the other methods in the control may be used to deliver messages to the server.

Authenticate
Authenticate yourself to the server using a username and password. This method should be called immediately after the connection has been established to the server. This is typically required if you are attempting to use the mail server as a relay, asking it to forward the message on to the server that actually accepts email for the recipient. Many Internet Service Providers (ISPs) require that users authenticate prior to sending mail through their servers. You may need to contact the server administrator to determine if authentication is required.

Disconnect
Disconnect from the server and release any resources that have been allocated for the client session. After this method is called, the client session is no longer valid.

Uninitialize
Unload the Windows Sockets library and release any resources that have been allocated for the current process. This is the last method call that the application should make prior to terminating. This is only necessary if the application has previously called the Initialize method.

Message Delivery

There are two general methods that can be used to deliver messages through the mail server. In most cases, it can be done with a single method call. However, there are some circumstances where it would be more appropriate to perform the transaction in stages. The SMTP control supports both methods.

SendMessage
This is the simplest method for sending an email message through the server. You provide the sender and recipient addresses, along with the message contents and the method will submit the message to the server for delivery.

CreateMessage
This method begins a transaction in which a message is dynamically composed, addressed and delivered in stages. You provide the sender address and message size to this method, and after it returns you begin the next stage, which is addressing the message.

AddRecipient
This method adds a recipient address to the recipient list for the message. This should be called once for each recipient, as well as for any recipients who are to receive "blind copies" of the message. A blind copy is when the message is sent to a recipient, but that recipient's address is not listed in any of the headers of the message; the other recipients will be unaware that the message was delivered to him. Most servers have a limit of approximately 100 recipients per message. It is possible that this method will return an error for a specific recipient address; the address may be malformed or it may not be acceptable for some other reason. This does not mean that the message will be rejected in its entirety, only that the specified recipient is not acceptable.

AppendMessage
This method should be called after all of the recipients have been added. It is used to send the contents of the message to the server. It is also possible to use the lower level Write method to send data directly to the server, however AppendMessage is generally easier to use and can write data from memory, the system clipboard or from a file on disk.

CloseMessage
This method is called after the entire message has been sent to the server. This terminates the transaction and the message is submitted for delivery. Note that it is possible for the server to accept the message up to this point and then reject it at this final step due to some restriction, such as the message being too large.