On this page:
6.1 SMTP Functions
6.2 SMTP Unit
6.3 SMTP Signature

6 SMTP: Sending E-Mail🔗

 (require net/smtp) package: net-lib
The net/smtp module provides tools for sending electronic mail messages using SMTP. The client must provide the address of an SMTP server; in contrast, the net/sendmail module uses a pre-configured sendmail on the local system.

The net/head library defines the format of a header string, which is used by smtp-send-message. The net/head module also provides utilities to verify the formatting of a mail address. The procedures of the net/smtp module assume that the given string arguments are well-formed.

6.1 SMTP Functions🔗


(smtp-send-message server-address    
  [#:port-no port-no/k    
  #:auth-user user    
  #:auth-passwd pw    
  #:xoauth2? xoauth2?    
  #:tcp-connect connect    
  #:tls-encode encode    
  port-no])  void?
  server-address : string?
  from : string?
  to : (listof string?)
  header : string?
  message : (listof (or/c string? bytes?))
  port-no/k : (integer-in 0 65535) = 25
  user : (or/c string? #f) = #f
  pw : (or/c string? #f) = #f
  xoauth2? : any/c = #f
  connect : 
(string? (integer-in 0 65535)
 . -> . (values input-port? output-port?))
   = tcp-connect
  encode : 
(or/c #f
      (input-port? output-port?
       #:mode 'connect
       #:encrypt 'tls
       #:close-original? #t
       . -> . (values input-port? output-port?)))
   = #f
  port-no : (integer-in 0 65535) = port-no/k
Connects to the server at server-address and port-no to send a message. The from argument specifies the mail address of the sender, and to is a list of recipient addresses (including “To:”, “CC”, and “BCC” recipients).

The header argument is the complete message header, which should already include “From:”, “To:”, and “CC:” fields consistent with the given sender and recipients. See also the net/head library for header-creating utilities.

The message argument is the body of the message, where each string or byte string in the list corresponds to a single line of message text. No string in message should contain a carriage return or linefeed character.

The optional port-no argument—which can be specified either with the #:port-no keyword or, for backward compatibility, as an extra argument after keywords—specifies the IP port to use in contacting the SMTP server.

The optional user and pw arguments supply a username and password for authenticated SMTP using the AUTH PLAIN protocol. If xoauth2? is true, then authentication uses the AUTH XOAUTH2 protocol, instead, and pw is used as an access token (which must obtained somehow before calling smtp-send-message).

The optional connect argument supplies a connection procedure to be used in place of tcp-connect. For example, use ssl-connect to connect to the server via SSL.

If the optional encode argument supplies a procedure instead of #f, then the ESMTP STARTTLS protocol is used to initiate SSL communication with the server. The procedure given as the encode argument should be like ports->ssl-ports; it will be called as

(encode r w #:mode 'connect #:encrypt 'tls #:close-original? #t)

and it should return two values: an input port and an output port. All further SMTP communication uses the returned ports.

For encrypted communication, normally either ssl-connect should be supplied for connect, or ports->ssl-ports should be supplied for encodeone or the other (depending on what the server expects), rather than both.

Changed in version 1.2 of package net-lib: Added the xoauth2? argument.


(smtp-sending-end-of-message)  (-> any)

(smtp-sending-end-of-message proc)  void?
  proc : (-> any)
A parameter that determines a send-done procedure to be called after smtp-send-message has completely sent the message. Before the send-done procedure is called, breaking the thread that is executing smtp-send-message cancels the send. After the send-done procedure is called, breaking may or may not cancel the send (and probably will not).

6.2 SMTP Unit🔗

smtp@ and smtp^ are deprecated. They exist for backward-compatibility and will likely be removed in the future. New code should use the net/smtp module.

 (require net/smtp-unit) package: compatibility-lib


smtp@ : unit?

Imports nothing, exports smtp^.

6.3 SMTP Signature🔗

 (require net/smtp-sig) package: compatibility-lib


smtp^ : signature

Includes everything exported by the net/smtp module.