libESMTP API Reference
Core API¶
The following describes the libESMTP core API which implements the functionality covered in RFC 5321 and RFC 5322.
-
smtp_session_t smtp_create_session(void)¶
Create a libESMTP session.
Parameters
void
no arguments
Description
Create a descriptor which maintains internal state for the SMTP session.
Return
A new SMTP session or NULL
on failure.
-
int smtp_set_server(smtp_session_t session, const char *hostport)¶
Set host and service for submission MTA.
Parameters
smtp_session_t session
The session.
const char *hostport
Hostname and port (service) for the SMTP server.
Description
Set the host name and service for the client connection. This is specified
in the format host.example.org[:service]
with no whitespace surrounding
the colon if service
is specified. service
may be a name from
/etc/services
or a decimal port number. If not specified the port
defaults to 587. Host and service name validity is not checked until an
attempt to connect to the remote host.
Return
Zero on failure, non-zero on success.
-
const char *smtp_get_server_name(smtp_session_t session)¶
get submission MTA canonic hostname.
Parameters
smtp_session_t session
The session.
Description
Get the canonic host name for the submission MTA. This is only valid after smtp_start_session() has been called, for example in the event callback after a connection has been established. If the canonic name is not available the host name set in smtp_set_server() is returned instead.
Return
MTA hostname or NULL.
-
int smtp_set_hostname(smtp_session_t session, const char *hostname)¶
Set the local host name.
Parameters
smtp_session_t session
The session.
const char *hostname
The local hostname.
Description
Set the name of the localhost. If hostname
is NULL
, the local host
name will be determined using uname(). If the system does not provide
uname() or equivalent, the hostname
parameter may not be NULL
.
Return
Zero on failure, non-zero on success.
-
smtp_message_t smtp_add_message(smtp_session_t session)¶
Add a message to the session.
Parameters
smtp_session_t session
The session.
Description
Add a message to the list of messages to be transferred to the remote MTA during an SMTP session.
Return
The descriptor for the message state, or NULL
on
failure.
-
int smtp_enumerate_messages(smtp_session_t session, smtp_enumerate_messagecb_t cb, void *arg)¶
Call function for each message in session.
Parameters
smtp_session_t session
The session.
smtp_enumerate_messagecb_t cb
callback function
void *arg
user data passed to the callback
Description
Call the callback function once for each message in an smtp session. The arg parameter is passed back to the application via the callback’s parameter of the same name.
Return
Zero on failure, non-zero on success.
-
const smtp_status_t *smtp_message_transfer_status(smtp_message_t message)¶
Retrieve message status.
Parameters
smtp_message_t message
The message.
Description
Retrieve the message transfer success/failure status from a previous SMTP session. This includes SMTP status codes, RFC 2034 enhanced status codes, if available, and text from the server describing the status. If a message is marked with a success or permanent failure status, it will not be resent if smtp_start_session() is called again.
Return
NULL
if no status information is available, otherwise a pointer to
the status information. The pointer remains valid until the next
call to libESMTP in the same thread.
-
int smtp_set_reverse_path(smtp_message_t message, const char *mailbox)¶
Set reverse path mailbox.
Parameters
smtp_message_t message
The message.
const char *mailbox
Reverse path mailbox.
Description
Set the reverse path (envelope sender) mailbox address. mailbox must be an
address using the syntax specified in RFC 5321. If a null reverse path is
required, specify mailbox as NULL
or ""
.
The reverse path mailbox address is used to generate a From:
header when
the message neither contains a From:
header nor has one been specified
using smtp_set_header().
It is strongly recommended that the message supplies a From: header specifying a single mailbox or a Sender: header and a From: header specifying multiple mailboxes or that the libESMTP header APIs are used to create them.
Not calling this API has the same effect as specifing mailbox as NULL
.
Return
Zero on failure, non-zero on success.
-
const smtp_status_t *smtp_reverse_path_status(smtp_message_t message)¶
Get the reverse path status.
Parameters
smtp_message_t message
The message.
Description
Retrieve the reverse path status from a previous SMTP session. This includes SMTP status codes, RFC 2034 enhanced status codes, if available, and text from the server describing the status.
Return
NULL
if no status information is available,
otherwise a pointer to the status information. The pointer remains valid
until the next call to libESMTP in the same thread.
-
int smtp_message_reset_status(smtp_message_t message)¶
Reset message status.
Parameters
smtp_message_t message
The message.
Description
Reset the message status to the state it would have before smtp_start_session() is called for the first time on the containing session. This may be used to force libESMTP to resend certain messages.
Return
Zero on failure, non-zero on success.
-
smtp_recipient_t smtp_add_recipient(smtp_message_t message, const char *mailbox)¶
Add a message recipient.
Parameters
smtp_message_t message
The message.
const char *mailbox
Recipient mailbox address.
Description
Add a recipient to the message. mailbox must be an address using the syntax specified in RFC 5321.
If neither the message contains a To:
header nor a To:
is specified
using smtp_set_header(), one header will be automatically generated using
the list of envelope recipients.
It is strongly recommended that the message supplies To:
, Cc:
and
Bcc:
headers or that the libESMTP header APIs are used to create them.
The envelope recipient need not be related to the To/Cc/Bcc recipients, for example, when a mail is resent to the recipients of a mailing list or as a result of alias expansion.
Return
The descriptor for the recipient state or NULL
for failure.
-
int smtp_enumerate_recipients(smtp_message_t message, smtp_enumerate_recipientcb_t cb, void *arg)¶
Call a function for each recipient.
Parameters
smtp_message_t message
The message.
smtp_enumerate_recipientcb_t cb
Callback function to process recipient.
void *arg
User data passed to the callback.
Description
Call the callback function once for each recipient in the SMTP message.
Return
Zero on failure, non-zero on success.
-
const smtp_status_t *smtp_recipient_status(smtp_recipient_t recipient)¶
Get the recipient status.
Parameters
smtp_recipient_t recipient
The recipient.
Description
Retrieve the recipient success/failure status from a previous SMTP session.
This includes SMTP status codes, RFC 2034 enhanced status codes, if
available and text from the server describing the status. If a recipient is
marked with a success or permanent failure status, it will not be resent if
smtp_start_session() is called again, however it may be used when generating
To:
or Cc:
headers if required.
Return
NULL
if no status information is available,
otherwise a pointer to the status information. The pointer remains valid
until the next call to libESMTP in the same thread.
-
int smtp_recipient_check_complete(smtp_recipient_t recipient)¶
Check if recipient processing is completed.
Parameters
smtp_recipient_t recipient
The recipient.
Description
Check whether processing is complete for the specified recipient of the message. Processing is considered complete when an MTA has assumed responsibility for delivering the message, or if it has indicated a permanent failure.
Return
Zero if processing is not complete, non-zero otherwise.
-
int smtp_recipient_reset_status(smtp_recipient_t recipient)¶
Reset recipient status.
Parameters
smtp_recipient_t recipient
The recipient.
Description
Reset the recipient status to the state it would have before smtp_start_session() is called for the first time on the containing session. This is used to force the libESMTP to resend previously successful recipients.
Return
Zero on failure, non-zero on success.
RFC 3461.
Delivery Status Notification (DSN)¶
The following APIs implement Delivery Status Notification (DSN) as described in RFC 3461.
Parameters
smtp_message_t message
The message.
enum ret_flags flags
an
enum ret_flags
Description
Instruct the reporting MTA whether to include the full content of the original message in the Delivery Status Notification, or just the headers.
Return
Zero on failure, non-zero on success.
-
int smtp_dsn_set_envid(smtp_message_t message, const char *envid)¶
Set the envelope identifier.
Parameters
smtp_message_t message
The message.
const char *envid
Envelope idientifier.
Description
Set the envelope identifier. This value is returned in the DSN and may be used by the MUA to associate the DSN with the message that caused it to be generated.
Return
Zero on failure, non-zero on success.
-
int smtp_dsn_set_notify(smtp_recipient_t recipient, enum notify_flags flags)¶
Set the DSN notify flags.
Parameters
smtp_recipient_t recipient
The recipient.
enum notify_flags flags
An
enum notify_flags
Description
Set the DSN notify options. Flags may be Notify_NOTSET
or Notify_NEVER
or
the bitwise OR of any combination of Notify_SUCCESS
, Notify_FAILURE
and
Notify_DELAY
.
Return
Zero on failure, non-zero on success.
-
int smtp_dsn_set_orcpt(smtp_recipient_t recipient, const char *address_type, const char *address)¶
Set the DSN ORCPT option.
Parameters
smtp_recipient_t recipient
The recipient.
const char *address_type
String specifying the address type.
const char *address
String specifying the original recipient address.
Description
Set the DSN ORCPT option. This DSN option is used only when performing mailing list expansion or similar situations when the envelope recipient no longer matches the recipient for whom the DSN is to be generated. Probably only useful to an MTA and should not normally be used by an MUA or other program which submits mail.
Return
Non zero on success, zero on failure.
RFC 1870
Size Extention¶
The following APIs implement the SMTP size extention as described in RFC 1870.
-
int smtp_size_set_estimate(smtp_message_t message, unsigned long size)¶
Set the message size estimate.
Parameters
smtp_message_t message
The message.
unsigned long size
The size estimate
Description
Used by the application to supply an estimate of the size of the message to be transferred.
Return
Non zero on success, zero on failure.
RFC 6152.
8bit-MIME Transport Extension¶
The 8-bit MIME extension described in RFC 6152 allows an SMTP client to declare the message body is either in strict conformance with RFC 5322 or that it is a MIME document where some or all of the MIME parts use 8-bit encoding.
-
int smtp_8bitmime_set_body(smtp_message_t message, enum e8bitmime_body body)¶
Set message body options.
Parameters
smtp_message_t message
The message.
enum e8bitmime_body body
Constant from
enum e8bitmime_body
.
Description
Declare the message body conformance. If the body type is not
E8bitmime_NOTSET
, libESMTP will use the event callback to notify the
application if the MTA does not support the 8BITMIME
extension.
Return
Non zero on success, zero on failure.
RFC 2852.
Deliver By Extension¶
-
int smtp_deliverby_set_mode(smtp_message_t message, long time, enum by_mode mode, int trace)¶
Set delivery tracing and conditions.
Parameters
smtp_message_t message
The message.
long time
Deliver by specified time.
enum by_mode mode
Delivery mode.
int trace
Trace mode.
Description
If time is before the earliest time the server can guarantee delivery,
libESMTP will emit a SMTP_EV_DELIVERBY_EXPIRED
event. The application may
optionally adjust latest acceptable the delivery time, otherwise the MAIL
command will be failed by the server.
Return
Non zero on success, zero on failure.
Callbacks
Callbacks¶
-
int smtp_set_messagecb(smtp_message_t message, smtp_messagecb_t cb, void *arg)¶
Set message reader.
Parameters
smtp_message_t message
The message.
smtp_messagecb_t cb
Callback function.
void *arg
application data (closure) passed to the callback.
Description
Set a callback function to read the message.
Return
Non zero on success, zero on failure.
-
int smtp_set_eventcb(smtp_session_t session, smtp_eventcb_t cb, void *arg)¶
Set event callback.
Parameters
smtp_session_t session
The session.
smtp_eventcb_t cb
Callback function.
void *arg
application data (closure) passed to the callback.
Description
Set callback to be called as protocol events occur.
Return
Non zero on success, zero on failure.
-
int smtp_set_monitorcb(smtp_session_t session, smtp_monitorcb_t cb, void *arg, int headers)¶
Set protocol monitor.
Parameters
smtp_session_t session
The session.
smtp_monitorcb_t cb
Callback function.
void *arg
application data (closure) passed to the callback.
int headers
non-zero to view headers.
Description
Set callback to be monitor the SMTP session. The monitor function is called to with the text of the protocol exchange and is flagged as being from the server or the client. Because the message body is potentially large it is excluded from the monitor. However, headers is non-zero the message headers are monitored.
Return
Non zero on success, zero on failure.
Protocol
SMTP Protocol¶
-
int smtp_start_session(smtp_session_t session)¶
Start an SMTP session.
Parameters
smtp_session_t session
The session to start.
Description
Initiate a mail submission session with an SMTP server.
This connects to an SMTP server and transfers the messages in the session. The SMTP envelope is constructed using the message and recipient parameters set up previously. The message callback is then used to read the message contents to the server. As the RFC 5322 headers are read from the application, they may be processed. Header processing terminates when the first line containing only CR-LF is encountered. The remainder of the message is copied verbatim.
This call is atomic in the sense that a connection to the server is made only when this is called and is closed down before it returns, i.e. there is no connection to the server outside this function.
Return
Zero on failure, non-zero on success.
Teardown
Tear Down Session¶
-
int smtp_destroy_session(smtp_session_t session)¶
Destroy a libESMTP session.
Parameters
smtp_session_t session
The session.
Description
Deallocate all resources associated with the SMTP session.
If application data has been set on any of the libESMTP structures, the associated destroy callback will be called with the application data as an argument.
If the deprecated legacy APIs are used to set application data or a destroy callback is not provided, the application must explicitly enumerate all messages and their recipients, and retrieve the data to be freed.
Return
always returns 1
Data
Application Data¶
Applications may attach arbitrary data to any of the libESMTP structures. The _release() variants of the APIs are preferred to the legacy versions as these will call a destroy callback when the smtp_session_t structure is destroyed, helping to avoid memory leaks that might have occurred using the deprecated APIs.
-
void *smtp_set_application_data(smtp_session_t session, void *data)¶
Associate data with a session.
Parameters
smtp_session_t session
The session.
void *data
Application data
Description
Associate application data with the session.
Only available when LIBESMTP_ENABLE_DEPRECATED_SYMBOLS
is defined.
Use smtp_set_application_data_release() instead.
Return
Previously set application data or NULL
-
void smtp_set_application_data_release(smtp_session_t session, void *data, void (*release)(void*))¶
Associate data with a session.
Parameters
smtp_session_t session
The session.
void *data
Application data
void (*release) (void *)
function to free/unref data.
Description
Associate application data with the session. If release is non-NULL it is called to free or unreference data when changed or the session is destroyed.
-
void *smtp_get_application_data(smtp_session_t session)¶
Get data from a session.
Parameters
smtp_session_t session
The session.
Description
Get application data from the session.
Return
Previously set application data or NULL
-
void *smtp_message_set_application_data(smtp_message_t message, void *data)¶
Associate data with a message.
Parameters
smtp_message_t message
The message.
void *data
Application data
Description
Associate application data with the message.
Only available when LIBESMTP_ENABLE_DEPRECATED_SYMBOLS
is defined.
Use smtp_message_set_application_data_release() instead.
Return
Previously set application data or NULL
-
void smtp_message_set_application_data_release(smtp_message_t message, void *data, void (*release)(void*))¶
Associate data with a message.
Parameters
smtp_message_t message
The message.
void *data
Application data
void (*release) (void *)
function to free/unref data.
Description
Associate application data with the message. If release is non-NULL it is called to free or unreference data when changed or the message is destroyed.
-
void *smtp_message_get_application_data(smtp_message_t message)¶
Get data from a message.
Parameters
smtp_message_t message
The message.
Description
Get application data from the message.
Return
Previously set application data or NULL
-
void *smtp_recipient_set_application_data(smtp_recipient_t recipient, void *data)¶
Associate data with a recipient.
Parameters
smtp_recipient_t recipient
The recipient.
void *data
Application data
Description
Associate application data with the recipient.
Only available when LIBESMTP_ENABLE_DEPRECATED_SYMBOLS
is defined.
Use smtp_recipient_set_application_data_release() instead.
Return
Previously set application data or NULL
-
void smtp_recipient_set_application_data_release(smtp_recipient_t recipient, void *data, void (*release)(void*))¶
Associate data with a recipient.
Parameters
smtp_recipient_t recipient
The recipient.
void *data
Application data
void (*release) (void *)
function to free/unref data.
Description
Associate application data with the recipient. If release is non-NULL it is called to free or unreference data when changed or the recipient is destroyed.
-
void *smtp_recipient_get_application_data(smtp_recipient_t recipient)¶
Get data from a recipient.
Parameters
smtp_recipient_t recipient
The recipient.
Description
Get application data from the recipient.
Return
Previously set application data or NULL
Miscellaneous
Miscellaneous APIs¶
-
int smtp_version(void *buf, size_t len, int what)¶
Identify libESMTP version.
Parameters
void *buf
Buffer to receive version string.
size_t len
Length of buffer.
int what
Which version information to be retrieved.
Description
Retrieve version information for the libESMTP in use. The version number depends on the what parameter.
Ver_VERSION – the libESMTP version is returned
Ver_SO_VERSION – the .so file version is returned
Ver_LT_VERSION – the libtool style API version is returned.
If the supplied buffer is too small to receive the version number, this function fails.
Return
Zero on failure, non-zero on success.
-
int smtp_option_require_all_recipients(smtp_session_t session, int state)¶
FAIL if server rejects any recipient.
Parameters
smtp_session_t session
The session.
int state
Boolean set non-zero to enable.
Description
Some applications can’t handle one recipient from many failing particularly
well. If the require_all_recipients
option is set, this will fail the
entire transaction even if some of the recipients were accepted in the RCPT
commands.
Return
Non zero on success, zero on failure.
-
long smtp_set_timeout(smtp_session_t session, int which, long value)¶
Set session timeouts.
Parameters
smtp_session_t session
The session.
int which
Which timeout to set. A constant from
enum rfc2822_timeouts
.long value
duration of timeout in seconds.
Description
Set the protocol timeouts. which is a constant from enum rfc2822_timeouts
specifying which timeout to set. The minimum values recommended in RFC 5322
are enforced unless which is bitwise-ORed with
Timeout_OVERRIDE_RFC2822_MINIMUM
. An absolute minumum timeout of one
second is imposed.
Return
the actual timeout set or zero on error.