16.5. The Full Flow
The design example presented in this chapter separated responsibilities into a SendingMailServer and ReceivingMailServer. In some mail systems (such as the sendmail program), SendingMailServer and ReceivingMailServer functionality is handled by the same program. Other systems (such as qmail) break the functionality into multiple programs. For example, the qmail-smptd program acts as a ReceivingMailServer, the qmail-lspawn/qmail-local program handles delivery to the user, and the qmail-rspawn/qmail-remote program acts as a SendingMailServer.
To see how the responsibilities for a full mail system can be separated into multiple processes ("Do a Little Job Well and You May Be Called Upon Often"), look at Figure 16-4, which is an outline for a design for a complete system.[*]
[*] An additional process—a relay—can be part of the flow. A relay acts as a ReceivingMailServer and a SendingMailServer. Relaying mail, except from trusted SendingMailServers, is strongly discouraged by antispam guidelines.
Figure 16-4. Processes for delivering mail
Each process plays a role in delivering mail ("Separate of Concerns to Make Smaller Concerns"):