.. index:: single: smtp_protocol
.. _smtp_protocol/0:

.. rst-class:: right

**protocol**

``smtp_protocol``
=================

Protocol for portable SMTP clients.

| **Availability:** 
|    ``logtalk_load(smtp(loader))``

| **Author:** Paulo Moura
| **Version:** 1:0:0
| **Date:** 2026-09-11

| **Compilation flags:**
|    ``static``


| **Dependencies:**
|   (none)


| **Remarks:**
|    (none)

| **Inherited public predicates:**
|    (none)

.. contents::
   :local:
   :backlinks: top

Public predicates
-----------------

.. index:: send/5
.. _smtp_protocol/0::send/5:

``send/5``
^^^^^^^^^^

Opens an SMTP session, sends a message, and closes the session. Unicode ``Subject`` and ``Comments`` header values are serialized as RFC 2047 UTF-8 Base64 encoded words; all other header values must be ASCII.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``send(Host,Port,Message,Result,Options)``
| **Mode and number of proofs:**
|    ``send(+atom,+integer,+compound,--compound,+list)`` - ``one_or_error``

| **Exceptions:**
|    ``Host`` or ``Port`` is a variable:
|        ``instantiation_error``
|    ``Host`` is neither a variable nor an atom:
|        ``type_error(atom,Host)``
|    ``Port`` is neither a variable nor an integer:
|        ``type_error(integer,Port)``
|    ``Port`` is an integer but not positive:
|        ``domain_error(positive_integer,Port)``
|    ``Message`` is not an SMTP message term:
|        ``domain_error(smtp_message,Message)``
|    The envelope sender or a recipient is a variable:
|        ``instantiation_error``
|    The envelope sender or a recipient is neither a variable nor an atom:
|        ``type_error(atom,Mailbox)``
|    The envelope sender or a recipient is not a valid mailbox:
|        ``domain_error(smtp_mailbox,Mailbox)``
|    ``Recipients`` is not a non-empty list of mailboxes or a mailbox atom:
|        ``domain_error(smtp_recipients,Recipients)``
|    ``Headers`` is not a list:
|        ``type_error(list,Headers)``
|    A header name or value is a variable:
|        ``instantiation_error``
|    A header name or value is neither a variable nor an atom:
|        ``type_error(atom,HeaderComponent)``
|    ``Header`` is not a valid header pair:
|        ``domain_error(smtp_header,Header)``
|    ``Body`` is not a supported text representation:
|        ``domain_error(smtp_body,Body)``
|    A caller-supplied MIME header conflicts with UTF-8 Base64 serialization or duplicates another MIME header:
|        ``domain_error(smtp_mime_header,Header)``
|    ``Options`` is a variable:
|        ``instantiation_error``
|    ``Options`` is neither a variable nor a list:
|        ``type_error(list,Options)``
|    An element ``Option`` of the list ``Options`` is a variable:
|        ``instantiation_error``
|    An element ``Option`` of the list ``Options`` is neither a variable nor a compound term:
|        ``type_error(compound,Option)``
|    An element ``Option`` of the list ``Options`` is a compound term but not a valid option:
|        ``domain_error(option,Option)``
|    The SMTP connection cannot be opened:
|        ``smtp_error(connection_failed)``
|    OpenSSL terminates the secure connection while an SMTP response is expected:
|        ``smtp_error(secure_connection_failed(Status,Diagnostic))``
|    The SMTP server closes the connection while a response is expected at ``Stage``:
|        ``smtp_error(connection_closed(Stage))``
|    The SMTP server rejects the session greeting:
|        ``smtp_error(greeting_failed(Code,Lines))``
|    The SMTP server returns an invalid or unexpected response:
|        ``smtp_error(protocol_error(Response))``
|    Authentication is requested over an insecure connection without explicit permission:
|        ``permission_error(authenticate,insecure_smtp_connection,plain)``
|    The SMTP server does not advertise a supported authentication mechanism:
|        ``smtp_error(authentication_not_supported)``
|    The SMTP server rejects authentication:
|        ``smtp_error(auth_failed(Code,Lines))``
|    The SMTP server rejects the envelope sender:
|        ``smtp_error(sender_rejected(Code,Lines))``
|    The SMTP server rejects the DATA command or the submitted message:
|        ``smtp_error(send_failed(Code,Lines))``


------------

.. index:: connect/4
.. _smtp_protocol/0::connect/4:

``connect/4``
^^^^^^^^^^^^^

Opens an SMTP session for sending one or more messages.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``connect(Host,Port,Connection,Options)``
| **Mode and number of proofs:**
|    ``connect(+atom,+integer,--compound,+list)`` - ``one_or_error``

| **Exceptions:**
|    ``Host`` or ``Port`` is a variable:
|        ``instantiation_error``
|    ``Host`` is neither a variable nor an atom:
|        ``type_error(atom,Host)``
|    ``Port`` is neither a variable nor an integer:
|        ``type_error(integer,Port)``
|    ``Port`` is an integer but not positive:
|        ``domain_error(positive_integer,Port)``
|    ``Options`` is a variable:
|        ``instantiation_error``
|    ``Options`` is neither a variable nor a list:
|        ``type_error(list,Options)``
|    An element ``Option`` of the list ``Options`` is a variable:
|        ``instantiation_error``
|    An element ``Option`` of the list ``Options`` is neither a variable nor a compound term:
|        ``type_error(compound,Option)``
|    An element ``Option`` of the list ``Options`` is a compound term but not a valid option:
|        ``domain_error(option,Option)``
|    ``Option`` is valid but is not a connection option:
|        ``domain_error(smtp_connection_option,Option)``
|    The SMTP connection cannot be opened:
|        ``smtp_error(connection_failed)``
|    OpenSSL terminates the secure connection while an SMTP response is expected:
|        ``smtp_error(secure_connection_failed(Status,Diagnostic))``
|    The SMTP server closes the connection while a response is expected at ``Stage``:
|        ``smtp_error(connection_closed(Stage))``
|    The SMTP server rejects the session greeting:
|        ``smtp_error(greeting_failed(Code,Lines))``
|    The SMTP server returns an invalid or unexpected response:
|        ``smtp_error(protocol_error(Response))``
|    Authentication is requested over an insecure connection without explicit permission:
|        ``permission_error(authenticate,insecure_smtp_connection,plain)``
|    The SMTP server does not advertise a supported authentication mechanism:
|        ``smtp_error(authentication_not_supported)``
|    The SMTP server rejects authentication:
|        ``smtp_error(auth_failed(Code,Lines))``


------------

.. index:: disconnect/1
.. _smtp_protocol/0::disconnect/1:

``disconnect/1``
^^^^^^^^^^^^^^^^

Gracefully closes an SMTP session.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``disconnect(Connection)``
| **Mode and number of proofs:**
|    ``disconnect(+compound)`` - ``one_or_error``

| **Exceptions:**
|    ``Connection`` is not an open SMTP connection handle:
|        ``domain_error(smtp_connection,Connection)``


------------

.. index:: connection_alive/1
.. _smtp_protocol/0::connection_alive/1:

``connection_alive/1``
^^^^^^^^^^^^^^^^^^^^^^

Checks if the local streams for an SMTP connection are open.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``connection_alive(Connection)``
| **Mode and number of proofs:**
|    ``connection_alive(+compound)`` - ``zero_or_one``


------------

.. index:: send/4
.. _smtp_protocol/0::send/4:

``send/4``
^^^^^^^^^^

Sends a message over an open SMTP session. Unicode ``Subject`` and ``Comments`` header values are serialized as RFC 2047 UTF-8 Base64 encoded words; all other header values must be ASCII.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``send(Connection,Message,Result,Options)``
| **Mode and number of proofs:**
|    ``send(+compound,+compound,--compound,+list)`` - ``one_or_error``

| **Exceptions:**
|    ``Connection`` is not an open SMTP connection handle:
|        ``domain_error(smtp_connection,Connection)``
|    ``Message`` is not an SMTP message term:
|        ``domain_error(smtp_message,Message)``
|    The envelope sender or a recipient is a variable:
|        ``instantiation_error``
|    The envelope sender or a recipient is neither a variable nor an atom:
|        ``type_error(atom,Mailbox)``
|    The envelope sender or a recipient is not a valid mailbox:
|        ``domain_error(smtp_mailbox,Mailbox)``
|    ``Recipients`` is not a non-empty list of mailboxes or a mailbox atom:
|        ``domain_error(smtp_recipients,Recipients)``
|    ``Headers`` is not a list:
|        ``type_error(list,Headers)``
|    A header name or value is a variable:
|        ``instantiation_error``
|    A header name or value is neither a variable nor an atom:
|        ``type_error(atom,HeaderComponent)``
|    ``Header`` is not a valid header pair:
|        ``domain_error(smtp_header,Header)``
|    ``Body`` is not a supported text representation:
|        ``domain_error(smtp_body,Body)``
|    A caller-supplied MIME header conflicts with UTF-8 Base64 serialization or duplicates another MIME header:
|        ``domain_error(smtp_mime_header,Header)``
|    ``Options`` is a variable:
|        ``instantiation_error``
|    ``Options`` is neither a variable nor a list:
|        ``type_error(list,Options)``
|    An element ``Option`` of the list ``Options`` is a variable:
|        ``instantiation_error``
|    An element ``Option`` of the list ``Options`` is neither a variable nor a compound term:
|        ``type_error(compound,Option)``
|    An element ``Option`` of the list ``Options`` is a compound term but not a valid option:
|        ``domain_error(option,Option)``
|    ``Option`` is valid but is not a transaction option:
|        ``domain_error(smtp_transaction_option,Option)``
|    The SMTP server closes the connection while a response is expected at ``Stage``:
|        ``smtp_error(connection_closed(Stage))``
|    The SMTP server returns an invalid or unexpected response:
|        ``smtp_error(protocol_error(Response))``
|    The SMTP server rejects the envelope sender:
|        ``smtp_error(sender_rejected(Code,Lines))``
|    The SMTP server rejects the DATA command or the submitted message:
|        ``smtp_error(send_failed(Code,Lines))``


------------

Protected predicates
--------------------

(none)

Private predicates
------------------

(none)

Operators
---------

(none)

