\chapter{SMTP Client}\label{cha:smtp} % The \ex{smtp} structure provides an client library for the Simple Mail Transfer Protocol, commonly used for sending email on the Internet. This library provides a simple wrapper for sending complete emails as well as procedures for composing custom SMTP transactions. The procedures described here usually return an SMTP reply code. For details, see RFC~821. \defun{smtp-send-mail}{from to-list headers body [host]}{code list} \begin{desc} This emails message \var{body} with hedaers \var{headers} to recipients in list \var{to-list}, using a sender address \var{from}. The email is handed off to the SMTP server running on \var{host}; default is the local host. \var{Body} is either a list of strings representing the lines of the message body or an input port which is exhausted to determine the message body. \var{Headers} is an association lists, mapping symbols representing RFC~822 field names to strings representing field bodies. This returns two values: \var{code} and \var{list}, the code returned by the server and the text message, represented as a list lines. If some recipients were rejected, \ex{smtp-send-mail} sends to the rest of the recipients, and returns code 700 and an association list whose elements are of the form \ex{(\var{loser-recipient} \var{code} . \var{text})}---that is, for each recipient refused by the server, you get the error data sent back for that guy. The success check is \ex{(< code 400)}. \end{desc} \defun{smtp-expand}{name host}{code text} \defunx{smtp-verify}{name host}{code text} \defunx{smtp-get-help}{host [details]}{code text-list} \begin{desc} These three are simple queries of the server as stated in the RFC~821: \ex{smtp-expann} asks the server to confirm that the argument identifies a mailing list, and if so, to return the membership of that list. The full name of the users (if known) and the fully specified mailboxes are returned in a multiline reply. \ex{Smtp-verify} asks the receiver to confirm that the argument identifies a user. If it is a user name, the full name of the user (if known) and the fully specified mailbox are returned. \ex{Smtp-get-help} causes the server to send helpful information. The command may take an argument (\var{details}) (e.g., any command name) and return more specific information as a response. \end{desc} \defun{smtp-connect}{host [port]}{smtp-connection} \begin{desc} \ex{Smtp-connect} returns an SMTP connection value that represents a connection to the SMTP server. \end{desc} \defun{smtp-transactions}{smtp-connection transaction1 ...}{code text-list} \defunx{smtp-transactions/no-close}{smtp-connection transaction1 ...}{code text-list} \begin{desc} These procedures make it easy to do simple sequences of SMTP commands. \var{Smtp-connection} must be an SMTP connection as returned by \ex{smtp-connect}. The \var{transaction} arguments must be transactions as returned by the procedures below. \ex{Smtp-transactions} and \ex{smtp-transactions/no-close} execute the transactions specified by the arguments. For each transaction, \begin{itemize} \item If the transaction's reply code is 221 or 421 (meaning the socket has been closed), then the transaction sequence is aborted, and \ex{smtp-transactions}/\ex{smtp-transactions/no-close} return the reply code and text from that transaction. \item If the reply code is an error code (in the four- or five-hundred range), the transaction sequence is aborted, and the fatal transaction's code and text values are returned. \ex{Smtp-transactions} will additionally close the socket for you; \ex{smtp-transactions/no-close} will not. \item If the transaction is the last in the transaction sequence, its reply code and text are returned. \item Otherwise, we throw away the current reply code and text, and proceed to the next transaction. \end{itemize} % \ex{Smtp-transactions} closes the socket after the transaction. (The \ex{smtp-quit} transaction, when executed, also closes the transaction.) If the socket should be kept open in the case of an abort, use \ex{Smtp-transactions/no-close}. \end{desc} \defunx{smtp-helo}{local-host-name}{smtp-transaction} \defunx{smtp-mail}{sender-address}{smtp-transaction} \defunx{smtp-rcpt}{destination-address}{smtp-transaction} \defunx{smtp-data}{socket message}{smtp-transaction} \defunx{smtp-send}{sender-address}{smtp-transaction} \defunx{smtp-soml}{sender-address}{smtp-transaction} \defunx{smtp-saml}{sender-address}{smtp-transaction} \defvarx{smtp-rset}{smtp-transaction} \defunx{smtp-vrfy}{user}{smtp-transaction} \defunx{smtp-expn}{user}{smtp-transaction} \defunx{smtp-help}{details}{smtp-transaction} \defvarx{smtp-noop}{smtp-transaction} \defvarx{smtp-quit}{smtp-transaction} \defvarx{smtp-turn}{smtp-transaction} \begin{desc} These transactions represent the commands of the SMTP protocol for use in \ex{smtp-transactions} and \ex{smtp-transactions/no-close}, i.e.\ they send the corresponding command along with the argument(s), if any. For details, consult RFC~821. The \ex{smtp-quit} transaction, in addition to sending a \ex{QUIT} command to the SMTP server, also closes the socket of its SMTP connection. \end{desc} %%% Local Variables: %%% mode: latex %%% TeX-master: "man" %%% End: