// Created August 20, 2023 #pragma once #ifndef ESP_MAIL_CONST_H #define ESP_MAIL_CONST_H #include "ESP_Mail_Client_Version.h" #if !VALID_VERSION_CHECK(30409) #error "Mixed versions compilation." #endif #include #include "ESP_Mail_FS.h" #include "ESP_Mail_Error.h" #include "extras/MB_FS.h" #include "extras/RFC2047.h" #include #include #if defined(ESP_MAIL_DEBUG_PORT) #define ESP_MAIL_DEFAULT_DEBUG_PORT ESP_MAIL_DEBUG_PORT #else #define ESP_MAIL_DEFAULT_DEBUG_PORT Serial #endif #include #include #define _vectorImpl std::vector #define MB_VECTOR std::vector #if !defined(FPSTR) #define FPSTR #endif #include "extras/Networks_Provider.h" #include "extras/ESP8266_Supports.h" #if defined(ESP8266) #if __has_include() #include #endif #endif #if defined(ENABLE_IMAP) && (defined(ESP32) || defined(ESP8266) || defined(MB_ARDUINO_PICO)) #if defined(ESP32) #include #elif defined(ESP8266) || defined(MB_ARDUINO_PICO) #include #endif #define ESP_MAIL_OTA_UPDATE_ENABLED #endif #if !defined(SILENT_MODE) && (defined(ENABLE_SMTP) || defined(ENABLE_IMAP)) #define SESSION_DEBUG_ENABLED #endif #define TCP_CLIENT_DEFAULT_TCP_TIMEOUT_SEC 30 #if defined(ENABLE_SMTP) || defined(ENABLE_IMAP) #define MAX_EMAIL_SEARCH_LIMIT 1000 #define BASE64_CHUNKED_LEN 76 #define FLOWED_TEXT_LEN 78 #define QP_ENC_MSG_LEN 76 #define ESP_MAIL_NETWORK_RECONNECT_TIMEOUT 10000 #define ESP_MAIL_PROGRESS_REPORT_STEP 5 #define ESP_MAIL_CLIENT_TRANSFER_DATA_FAILED 0 #define ESP_MAIL_CLIENT_STREAM_CHUNK_SIZE 256 #define ESP_MAIL_CLIENT_RESPONSE_BUFFER_SIZE 1024 // should be 1 k or more to prevent buffer overflow #define ESP_MAIL_CLIENT_VALID_TS 1577836800 #endif typedef enum { esp_mail_cert_type_undefined = -1, esp_mail_cert_type_none = 0, esp_mail_cert_type_data, esp_mail_cert_type_file, esp_mail_cert_type_bundle } esp_mail_cert_type; typedef enum { esp_mail_client_type_undefined, esp_mail_client_type_internal_basic_client, esp_mail_client_type_external_basic_client, esp_mail_client_type_external_gsm_client } esp_mail_client_type; /* The filesystem types enum */ enum esp_mail_file_storage_type { esp_mail_file_storage_type_none, esp_mail_file_storage_type_flash, esp_mail_file_storage_type_sd }; /* The session types enum */ enum esp_mail_session_type { esp_mail_session_type_smtp, esp_mail_session_type_imap }; /* The secure connection mode preference */ typedef enum { // No preferences esp_mail_secure_mode_undefined = 0, // Always use SSL and TLS via STARTTLS rfc2595 section 3 and rfc3207 esp_mail_secure_mode_ssl_tls, // Plain text mode only (non SSL/TLS) // To disable SSL/TLS permanently, define ESP_MAIL_DISABLE_SSL in ESP_Mail_FS.h esp_mail_secure_mode_nonsecure } esp_mail_secure_mode; using namespace mb_string; #if defined(ENABLE_SMTP) || defined(ENABLE_IMAP) typedef void (*NetworkConnectionHandler)(void); /* The file types enum */ enum esp_mail_file_extension { /** The arrangement is related to mimeinfo struct. * Do not modify or remove. */ esp_mail_file_extension_html, esp_mail_file_extension_htm, esp_mail_file_extension_css, esp_mail_file_extension_txt, esp_mail_file_extension_js, esp_mail_file_extension_json, esp_mail_file_extension_png, esp_mail_file_extension_gif, esp_mail_file_extension_jpg, esp_mail_file_extension_ico, esp_mail_file_extension_svg, esp_mail_file_extension_ttf, esp_mail_file_extension_otf, esp_mail_file_extension_woff, esp_mail_file_extension_woff2, esp_mail_file_extension_eot, esp_mail_file_extension_sfnt, esp_mail_file_extension_xml, esp_mail_file_extension_pdf, esp_mail_file_extension_zip, esp_mail_file_extension_gz, esp_mail_file_extension_appcache, esp_mail_file_extension_dat, esp_mail_file_extension_binary, esp_mail_file_extension_maxType }; struct esp_mail_mime_prop_t { char endsWith[10]; char mimeType[30]; }; const struct esp_mail_mime_prop_t mimeinfo[esp_mail_file_extension_maxType] PROGMEM = { /** The arrangement is related to esp_mail_file_extension enum. * Do not modify or remove. */ {".html", "text/html"}, {".htm", "text/html"}, {".css", "text/css"}, {".txt", "text/plain"}, {".js", "application/javascript"}, {".json", "application/json"}, {".png", "image/png"}, {".gif", "image/gif"}, {".jpg", "image/jpeg"}, {".ico", "image/x-icon"}, {".svg", "image/svg+xml"}, {".ttf", "application/x-font-ttf"}, {".otf", "application/x-font-opentype"}, {".woff", "application/font-woff"}, {".woff2", "application/font-woff2"}, {".eot", "application/vnd.ms-fontobject"}, {".sfnt", "application/font-sfnt"}, {".xml", "text/xml"}, {".pdf", "application/pdf"}, {".zip", "application/zip"}, {".gz", "application/x-gzip"}, {".appcache", "text/cache-manifest"}, {".dat", "application/dat"}, {"", "application/octet-stream"}}; #if defined(ENABLE_SMTP) /* The SMTP commands types enum */ enum esp_mail_smtp_command_types { /** The SMTP commands per stansards. * The arrangement is related to smtp_commands struct. * Do not modify or remove. */ esp_mail_smtp_command_auth, esp_mail_smtp_command_login, esp_mail_smtp_command_helo, esp_mail_smtp_command_ehlo, esp_mail_smtp_command_quit, esp_mail_smtp_command_mail, esp_mail_smtp_command_rcpt, esp_mail_smtp_command_data, esp_mail_smtp_command_bdat, esp_mail_smtp_command_last, esp_mail_smtp_command_plain, esp_mail_smtp_command_from, esp_mail_smtp_command_to, esp_mail_smtp_command_notify, esp_mail_smtp_command_success, esp_mail_smtp_command_failure, esp_mail_smtp_command_delay, esp_mail_smtp_command_body, esp_mail_smtp_command_terminate, esp_mail_smtp_command_starttls, esp_mail_smtp_command_maxType }; /* The SMTP server capability types enum (except for SASL) */ enum esp_mail_smtp_send_capability_types { /** The server capability keywords per standard. * The arrangement is related to smtp_send_capabilities struct. * Do not modify or remove. */ esp_mail_smtp_send_capability_binary_mime, esp_mail_smtp_send_capability_8bit_mime, esp_mail_smtp_send_capability_chunking, esp_mail_smtp_send_capability_utf8, esp_mail_smtp_send_capability_pipelining, esp_mail_smtp_send_capability_dsn, esp_mail_smtp_send_capability_esmtp, esp_mail_smtp_send_capability_maxType }; #endif #if defined(ENABLE_IMAP) /* The IMAP server response types enum */ enum esp_mail_imap_response_types { /** The IMAP response. * The arrangement is related to imap_responses struct. * Do not modify or remove. */ esp_mail_imap_response_ok, esp_mail_imap_response_no, esp_mail_imap_response_bad, esp_mail_imap_response_list, esp_mail_imap_response_flags, esp_mail_imap_response_search, esp_mail_imap_response_fetch, esp_mail_imap_response_nil, esp_mail_imap_response_uid, esp_mail_imap_response_capability_untagged, esp_mail_imap_response_capability, esp_mail_imap_response_lsub, esp_mail_imap_response_quota, esp_mail_imap_response_quotaroot, esp_mail_imap_response_acl, esp_mail_imap_response_myrights, esp_mail_imap_response_namespace, esp_mail_imap_response_untagged, esp_mail_imap_response_exists, esp_mail_imap_response_expunge, esp_mail_imap_response_recent, esp_mail_imap_response_uidnext, esp_mail_imap_response_unseen, esp_mail_imap_response_id, esp_mail_imap_response_highest_modsec, esp_mail_imap_response_nomodsec, esp_mail_imap_response_permanent_flags, esp_mail_imap_response_uidvalidity, esp_mail_imap_response_maxType }; /* The IMAP commands types enum */ enum esp_mail_imap_command_types { /** The IMAP commands per standards. * The arrangement is related to imap_commands struct. * Do not modify or remove. */ esp_mail_imap_command_starttls, esp_mail_imap_command_append, esp_mail_imap_command_capability, esp_mail_imap_command_authenticate, esp_mail_imap_command_plain, esp_mail_imap_command_uid, esp_mail_imap_command_fetch, esp_mail_imap_command_flags, esp_mail_imap_command_login, esp_mail_imap_command_list, esp_mail_imap_command_examine, esp_mail_imap_command_search, esp_mail_imap_command_logout, esp_mail_imap_command_body, esp_mail_imap_command_mime, esp_mail_imap_command_close, esp_mail_imap_command_exists, esp_mail_imap_command_peek, esp_mail_imap_command_text, esp_mail_imap_command_fields, esp_mail_imap_command_header, esp_mail_imap_command_new, esp_mail_imap_command_all, esp_mail_imap_command_select, esp_mail_imap_command_expunge, esp_mail_imap_command_create, esp_mail_imap_command_delete, esp_mail_imap_command_idle, esp_mail_imap_command_done, esp_mail_imap_command_recent, esp_mail_imap_command_unseen, esp_mail_imap_command_rename, esp_mail_imap_command_lsub, esp_mail_imap_command_subscribe, esp_mail_imap_command_unsubscribe, esp_mail_imap_command_silent, esp_mail_imap_command_move, esp_mail_imap_command_getquota, esp_mail_imap_command_setquota, esp_mail_imap_command_root, esp_mail_imap_command_get_acl, esp_mail_imap_command_set_acl, esp_mail_imap_command_delete_acl, esp_mail_imap_command_myrights, esp_mail_imap_command_namespace, esp_mail_imap_command_enable, esp_mail_imap_command_xoauth2, esp_mail_imap_command_store, esp_mail_imap_command_plus_flags, esp_mail_imap_command_minus_flags, esp_mail_imap_command_copy, esp_mail_imap_command_id, esp_mail_imap_command_unselect, esp_mail_imap_command_condstore, esp_mail_imap_command_noop, esp_mail_imap_command_unchangedsince, esp_mail_imap_command_changedsince, esp_mail_imap_command_modsec, esp_mail_imap_command_maxType }; /* The IMAP server capability types enum (except for SASL) */ enum esp_mail_imap_read_capability_types { /** The server capability keywords per standard. * The arrangement is related imap_read_capabilities struct. * Do not modify or remove. */ esp_mail_imap_read_capability_imap4, esp_mail_imap_read_capability_imap4rev1, // rfc2177 esp_mail_imap_read_capability_idle, esp_mail_imap_read_capability_literal_plus, esp_mail_imap_read_capability_literal_minus, esp_mail_imap_read_capability_multiappend, esp_mail_imap_read_capability_uidplus, // rfc4314 esp_mail_imap_read_capability_acl, esp_mail_imap_read_capability_binary, esp_mail_imap_read_capability_logindisable, // rfc6851 esp_mail_imap_read_capability_move, // rfc2087 esp_mail_imap_read_capability_quota, // rfc2342 esp_mail_imap_read_capability_namespace, // rfc5161 esp_mail_imap_read_capability_enable, // rfc2971 esp_mail_imap_read_capability_id, esp_mail_imap_read_capability_unselect, esp_mail_imap_read_capability_children, // rfc7162 (rfc4551 obsoleted) esp_mail_imap_read_capability_condstore, esp_mail_imap_read_capability_auto_caps, esp_mail_imap_read_capability_maxType }; /* The Identification keys enum used for IMAP ID command */ enum esp_mail_imap_identification_keys { /** The identification keys per standard. * The arrangement is related imap_identification_keys struct. * Do not modify or remove. */ esp_mail_imap_identification_key_name, esp_mail_imap_identification_key_version, esp_mail_imap_identification_key_os, esp_mail_imap_identification_key_os_version, esp_mail_imap_identification_key_vendor, esp_mail_imap_identification_key_support_url, esp_mail_imap_identification_key_address, esp_mail_imap_identification_key_date, esp_mail_imap_identification_key_command, esp_mail_imap_identification_key_arguments, esp_mail_imap_identification_key_environment, esp_mail_imap_identification_key_maxType }; #endif /* The character encoding types enum used for decoding */ enum esp_mail_char_decoding_types { /** Supported charactor encodings. * The arrangement is related to char_decodings struct. * Do not modify or remove. */ esp_mail_char_decoding_utf8, esp_mail_char_decoding_iso_8859_1, esp_mail_char_decoding_iso_8859_11, esp_mail_char_decoding_tis_620, esp_mail_char_decoding_windows_874, esp_mail_char_decoding_maxType }; /* The MIME multipart message types */ enum esp_mail_multipart_types { /** MultiPart MIME. * The arrangement is related to multipart_types struct. * Do not modify or remove. */ esp_mail_multipart_type_mixed, esp_mail_multipart_type_related, esp_mail_multipart_type_parallel, esp_mail_multipart_type_alternative, esp_mail_multipart_maxType }; /* The rfc822 message header fileds types enum */ enum esp_mail_rfc822_header_field_types { /** The rfc822 message header fields. * The arrangement is related to rfc822_headers struct. * Do not modify or remove. */ esp_mail_rfc822_header_field_from, esp_mail_rfc822_header_field_sender, esp_mail_rfc822_header_field_to, esp_mail_rfc822_header_field_cc, esp_mail_rfc822_header_field_subject, esp_mail_rfc822_header_field_date, esp_mail_rfc822_header_field_msg_id, esp_mail_rfc822_header_field_return_path, esp_mail_rfc822_header_field_reply_to, esp_mail_rfc822_header_field_in_reply_to, esp_mail_rfc822_header_field_references, esp_mail_rfc822_header_field_comments, esp_mail_rfc822_header_field_keywords, esp_mail_rfc822_header_field_bcc, esp_mail_rfc822_header_field_flags, esp_mail_rfc822_header_field_maxType }; /* The message header fileds types enum and its subproperties enum */ enum esp_mail_message_header_field_types { /** Additional fields and props. * Some are used for the library information data field name. * The arrangement is related to message_headers struct. * Do not modify or remove. */ esp_mail_message_header_field_number, esp_mail_message_header_field_uid, esp_mail_message_header_field_accept_language, esp_mail_message_header_field_content_language, esp_mail_message_header_field_filename, esp_mail_message_header_field_name, esp_mail_message_header_field_size, esp_mail_message_header_field_mime, esp_mail_message_header_field_type, esp_mail_message_header_field_description, esp_mail_message_header_field_creation_date, esp_mail_message_header_field_x_priority, esp_mail_message_header_field_x_msmail_priority, esp_mail_message_header_field_importance, esp_mail_message_header_field_content_type, esp_mail_message_header_field_content_transfer_encoding, esp_mail_message_header_field_content_disposition, esp_mail_message_header_field_content_location, esp_mail_message_header_field_content_id, esp_mail_message_header_field_content_description, esp_mail_message_header_field_mime_version, esp_mail_message_header_field_charset, esp_mail_message_header_field_format, esp_mail_message_header_field_delsp, esp_mail_message_header_field_modification_date, esp_mail_message_header_field_maxType }; /* The auth capability types enum which shared usage between SMTP and IMAP */ enum esp_mail_auth_capability_types { /** The server capability keywords per standard. * The arrangement is related to smtp_auth_capabilities and imap_auth_capabilities structs. * Do not modify or remove. */ esp_mail_auth_capability_plain, esp_mail_auth_capability_xoauth2, esp_mail_auth_capability_cram_md5, esp_mail_auth_capability_digest_md5, esp_mail_auth_capability_login, esp_mail_auth_capability_starttls, // imap rfc4959 esp_mail_auth_capability_sasl_ir, esp_mail_auth_capability_maxType, }; /* The smessage types enum */ enum esp_mail_message_type { esp_mail_msg_type_none = 0, esp_mail_msg_type_plain = 1, esp_mail_msg_type_html = 2, esp_mail_msg_type_enriched = 1 }; /* The string mark types enum used in joinStringx functions */ enum esp_mail_string_mark_type { esp_mail_string_mark_type_none, esp_mail_string_mark_type_double_quote, esp_mail_string_mark_type_angle_bracket, esp_mail_string_mark_type_round_bracket, esp_mail_string_mark_type_curly_bracket, esp_mail_string_mark_type_square_bracket }; /* The debug TAG types enum */ enum esp_mail_debug_tag_type { esp_mail_debug_tag_type_client, esp_mail_debug_tag_type_server, esp_mail_debug_tag_type_error, esp_mail_debug_tag_type_info, esp_mail_debug_tag_type_warning }; /* The embed attachment types enum */ enum esp_mail_smtp_embed_message_type { esp_mail_smtp_embed_message_type_attachment = 0, esp_mail_smtp_embed_message_type_inline }; /* The attachment types enum */ enum esp_mail_attach_type { esp_mail_att_type_none, esp_mail_att_type_attachment, esp_mail_att_type_inline }; /* The debug levels for printing the debug information via Serial port */ enum esp_mail_debug_level { esp_mail_debug_level_none = 0, esp_mail_debug_level_basic, esp_mail_debug_level_maintainer = 0xfff, esp_mail_debug_level_developer = esp_mail_debug_level_maintainer + 1 }; /* The content transfer encoding enum */ enum esp_mail_msg_xencoding { esp_mail_msg_xencoding_none, /* rfc2045 section 2.7 */ esp_mail_msg_xencoding_7bit, esp_mail_msg_xencoding_qp, esp_mail_msg_xencoding_base64, /* rfc2045 section 2.8 */ esp_mail_msg_xencoding_8bit, /* rfc2045 section 2.9 */ esp_mail_msg_xencoding_binary }; /* The port protocols enum */ enum esp_mail_protocol { esp_mail_protocol_plain_text, esp_mail_protocol_ssl, esp_mail_protocol_tls }; /* The internal use strct */ struct esp_mail_internal_use_t { esp_mail_msg_xencoding xencoding = esp_mail_msg_xencoding_none; MB_String cid; }; /* The struct contains port number and its protocol */ struct port_function { uint16_t port; esp_mail_protocol protocol; }; /* The struct that contains the list of port_function and its size */ struct esp_mail_ports_functions { friend class IMAPSession; friend class SMTPSession; friend class esp_mail_session_config_t; uint16_t size = 0; port_function *list = nullptr; bool use_internal_list = false; }; /* The content transfer encoding type struct */ struct esp_mail_transfer_encoding_t { /* The default 7-bit transfer encoding for US-ACII characters*/ static constexpr const char *enc_7bit = "7bit"; /* The quoted printable transfer encoding for non-US-ASCII characters*/ static constexpr const char *enc_qp = "quoted-printable"; /* The base64 encoded transfer encoding */ static constexpr const char *enc_base64 = "base64"; /* The 8-bit transfer encoding for extended-US-ASCII characters*/ static constexpr const char *enc_8bit = "8bit"; /* The binary transfer encoding for extended-US-ASCII characters with no line * length limit*/ static constexpr const char *enc_binary = "binary"; }; /* The content disposition types strucr (rfc 2183) */ struct esp_mail_content_disposition_type_t { /** if it is intended to be displayed automatically * upon display of the message. */ static constexpr const char *inline_ = "inline"; /** to indicate that they are separate from the main body * of the mail message, and that their display should not * be automatic, but contingent upon some further action of the user. */ static constexpr const char *attachment = "attachment"; }; /* The file (SD/flash) message content struct used for providing SMTP message content from file */ struct esp_mail_file_message_content_t { /* The file path include its name */ MB_String name; /** The type of file storages e.g. * esp_mail_file_storage_type_none, * esp_mail_file_storage_type_flash, and * esp_mail_file_storage_type_sd */ esp_mail_file_storage_type type = esp_mail_file_storage_type_flash; }; /* The blob or flash string message content struct used for providing SMTP message content from blob or flash string */ struct esp_mail_blob_message_content_t { /* The array of content in flash memory */ const uint8_t *data = nullptr; /* The array size in bytes */ size_t size = 0; }; /* The option to embed this message content as a file */ struct esp_mail_smtp_embed_message_body_t { /* Enable to send this message body as file */ bool enable = false; /* The name of embedded file */ MB_String filename; /** The embedded type * esp_mail_smtp_embed_message_type_attachment or 0 * esp_mail_smtp_embed_message_type_inline or 1 */ esp_mail_smtp_embed_message_type type = esp_mail_smtp_embed_message_type_attachment; }; /** This is the base struct for SMTP message. * This is for input and later used as esp_mail_plain_body_t * and esp_mail_html_body_t. * Its members are similar to esp_mail_imap_plain_body_t * and esp_mail_imap_html_body_t unless it contains * MB_String object to hold the string. */ struct esp_mail_message_body_t { /* The option to embed this message content as a file */ struct esp_mail_smtp_embed_message_body_t embed; /* The PLAIN/HTML content of the message */ MB_String content; const char *nonCopyContent = ""; /* The blob that contins PLAIN/HTML content of the message */ struct esp_mail_blob_message_content_t blob; /* The file that contins PLAIN/HTML content of the message */ struct esp_mail_file_message_content_t file; /* The charset of the PLAIN/HTML content of the message */ MB_String charSet = "UTF-8"; /* The content type of message */ MB_String content_type = mimeinfo[esp_mail_file_extension_txt].mimeType; /* The option to encode the content for data transfer */ MB_String transfer_encoding = "7bit"; /* The option to send the PLAIN text with wrapping */ bool flowed = false; /* The internal usage data */ struct esp_mail_internal_use_t _int; }; /** The PLAIN text body details of the fetching message. * This is for output and its members are similar to * esp_mail_message_body_t unless there is no string object * to hold string data unless the pointer to the const strings * in IMAPSession object. */ struct esp_mail_imap_plain_body_t { /* The option to embed this message content as a file */ struct esp_mail_smtp_embed_message_body_t embed; /* The PLAIN text content of the message */ const char *content = ""; /* The blob that contins PLAIN text content of the message */ struct esp_mail_blob_message_content_t blob; /* The file that contins PLAIN text content of the message */ struct esp_mail_file_message_content_t file; /* The charset of the PLAIN text content of the message */ const char *charSet = "UTF-8"; /* The content type of message */ const char *content_type = mimeinfo[esp_mail_file_extension_txt].mimeType; /* The option to encode the content for data transfer */ const char *transfer_encoding = "7bit"; /* The option to send the PLAIN text with wrapping */ bool flowed = false; /* The internal usage data */ struct esp_mail_internal_use_t _int; }; /** The HTML body details of the fetching message. * This is for output and its members are similar to * esp_mail_message_body_t unless there is no string object * to hold string data unless the pointer to the const strings * in IMAPSession object. */ struct esp_mail_imap_html_body_t { /* The option to embedded the content as a file */ struct esp_mail_smtp_embed_message_body_t embed; /* The HTML content of the message */ const char *content = ""; /* The blob that contins HTML content of the message */ struct esp_mail_blob_message_content_t blob; /* The file that contins HTML content of the message */ struct esp_mail_file_message_content_t file; /* The charset of the HTML content of the message */ const char *charSet = "UTF-8"; /* The content type of message */ const char *content_type = mimeinfo[esp_mail_file_extension_html].mimeType; /* The option to encode the content for data transfer */ const char *transfer_encoding = "7bit"; /* The internal usage data */ struct esp_mail_internal_use_t _int; }; /* The PLAIN text body details of the message */ typedef struct esp_mail_message_body_t esp_mail_plain_body_t; /* The HTML text body details of the message */ typedef struct esp_mail_message_body_t esp_mail_html_body_t; /* The attachment info struct used for output */ struct esp_mail_attachment_info_t { const char *filename = ""; const char *name = ""; const char *creationDate = ""; const char *mime = ""; const char *description = ""; esp_mail_attach_type type = esp_mail_att_type_none; size_t size; }; #if defined(ENABLE_SMTP) struct esp_mail_smtp_command_t { char text[9]; }; struct esp_mail_timestamp_value_t { /* The time format of timestamp to inject into subject or content as using in strftime C++ function */ MB_String format; /* The tag that will be replaced with current timestamp */ MB_String tag; }; /** The SMTP commands per stansards. * The arrangement is related to esp_mail_smtp_command_types enum. * Do not modify or remove. */ const struct esp_mail_smtp_command_t smtp_commands[esp_mail_smtp_command_maxType] PROGMEM = { "AUTH", "LOGIN", "HELO", "EHLO", "QUIT", "MAIL", "RCPT", "DATA", "BDAT", "LAST", "PLAIN", "FROM:", "TO:", "NOTIFY", "SUCCESS", "FAILURE", "DELAY", "BODY", "\r\n.\r\n", "STARTTLS"}; struct esp_mail_smtp_commands_tokens { public: esp_mail_smtp_commands_tokens(bool pre) { preToken = pre; } MB_String operator[](size_t index) { MB_String s = preToken ? " " : smtp_commands[index].text; s += !preToken ? " " : smtp_commands[index].text; return s; } private: bool preToken = false; }; // The smtp commands with leading space. static esp_mail_smtp_commands_tokens smtp_cmd_pre_tokens(true); // The smtp commands with trailing space. static esp_mail_smtp_commands_tokens smtp_cmd_post_tokens(false); #endif #if defined(ENABLE_IMAP) struct esp_mail_imap_command_t { char text[15]; }; /** The IMAP commands per standards. * The arrangement is related to esp_mail_imap_command_types enum. * Do not modify or remove. */ const struct esp_mail_imap_command_t imap_commands[esp_mail_imap_command_maxType] PROGMEM = { "STARTTLS", "APPEND", "CAPABILITY", "AUTHENTICATE", "PLAIN", "UID", "FETCH", "FLAGS", "LOGIN", "LIST", "EXAMINE", "SEARCH", "LOGOUT", "BODY", "MIME", "CLOSE", "EXISTS", "PEEK", "TEXT", "FIELDS", "HEADER", "NEW", "ALL", "SELECT", "EXPUNGE", "CREATE", "DELETE", "IDLE", "DONE", "RECENT", "UNSEEN", "RENAME", "LSUB", "SUBSCRIBE", "UNSUBSCRIBE", "SILENT", "MOVE", "GETQUOTA", "SETQUOTA", "ROOT", "GETACL", "SETACL", "DELETEACL", "MYRIGHTS", "NAMESPACE", "ENABLE", "XOAUTH2", "STORE", "+FLAGS", "-FLAGS", "COPY", "ID", "UNSELECT", "CONDSTORE", "NOOP", "UNCHANGEDSINCE", "CHANGEDSINCE", "MODSEC"}; struct esp_mail_imap_commands_tokens { public: esp_mail_imap_commands_tokens(bool pre) { preToken = pre; } MB_String operator[](size_t index) { MB_String s = preToken ? " " : imap_commands[index].text; s += !preToken ? " " : imap_commands[index].text; return s; } private: bool preToken = false; }; // The imap commands with leading space. static esp_mail_imap_commands_tokens imap_cmd_pre_tokens(true); // The imap commands with trailing space. static esp_mail_imap_commands_tokens imap_cmd_post_tokens(false); struct esp_mail_imap_response_t { char text[18]; }; /** The IMAP response. * The arrangement is related to esp_mail_imap_response_types enum. * Do not modify or remove. */ const struct esp_mail_imap_response_t imap_responses[esp_mail_imap_response_maxType] PROGMEM = { // Tagged "OK ", "NO ", "BAD ", // Untagged "* LIST ", "* FLAGS ", "* SEARCH ", " FETCH ", " NIL ", " UID ", "* CAPABILITY ", "CAPABILITY ", "* LSUB ", "* QUOTA ", "* QUOTAROOT ", "* ACL ", "* MYRIGHTS ", "* NAMESPACE ", "* ", " EXISTS", " EXPUNGE", " RECENT", " [UIDNEXT ", " [UNSEEN ", "* ID ", " [HIGHESTMODSEQ ", " [NOMODSEQ]", " [PERMANENTFLAGS ", " [UIDVALIDITY "}; #endif struct esp_mail_char_decoding_t { char text[12]; }; /** Supported charactor encodings. * The arrangement is related to esp_mail_char_decoding_types enum. * Do not modify or remove. */ const struct esp_mail_char_decoding_t char_decodings[esp_mail_char_decoding_maxType] PROGMEM = { "utf-8", "iso-8859-1", "iso-8859-11", "tis-620", "windows-874"}; struct esp_mail_multipart_t { char text[22]; }; /** MultiPart MIME. * The arrangement is related to esp_mail_multipart_types enum. * Do not modify or remove. */ const struct esp_mail_multipart_t multipart_types[esp_mail_multipart_maxType] PROGMEM = { "multipart/mixed", "multipart/related", "multipart/parallel", "multipart/alternative"}; struct esp_mail_rfc822_header_field_t { char text[20]; bool isNum; bool trim; }; /** The rfc822 message header fields. * The arrangement is related to esp_mail_rfc822_header_field_types enum. * Do not modify or remove. */ const struct esp_mail_rfc822_header_field_t rfc822_headers[esp_mail_rfc822_header_field_maxType] PROGMEM = { {"From", false, true}, {"Sender", false, true}, {"To", false, true}, {"Cc", false, true}, {"Subject", false, false}, {"Date", false, false}, {"Message-ID", false, false}, {"Return-Path", false, true}, {"Reply-To", false, true}, {"In-Reply-To", false, true}, {"References", false, true}, {"Comments", false, false}, {"Keywords", false, false}, {"Bcc", false, true}, {"Flags", false, false}}; struct esp_mail_message_header_field_t { char text[26]; }; /** Additional fields and props. * The arrangement is related to esp_mail_message_header_field_types enum. * Do not modify or remove. */ const struct esp_mail_message_header_field_t message_headers[esp_mail_message_header_field_maxType] PROGMEM = { "Number", "UID", "Accept-Language", "Content-Language", "Filename", "Name", "Size", "MIME", "Type", "Description", "Creation-Date", "X-Priority", "X-MSMail-Priority", "Importance", "Content-Type", "Content-transfer-encoding", "Content-Disposition", "Content-Location", "Content-ID", "Content-Description", "Mime-Version", "Charset", "format", "delsp", "Modification-Date"}; struct esp_mail_auth_capability_t { char text[20]; }; #if defined(ENABLE_SMTP) /** The server capability keywords per standard. * The arrangement is related to esp_mail_auth_capability_types enum. * Do not modify or remove. */ const struct esp_mail_auth_capability_t smtp_auth_capabilities[esp_mail_auth_capability_maxType] PROGMEM = { "PLAIN", "XOAUTH2", "CRAM-MD5", "DIGEST-MD5", "LOGIN", "STARTTLS", "DUMMY_AUTH" /* SASL-IR */}; struct esp_mail_smtp_auth_tokens { public: esp_mail_smtp_auth_tokens(bool pre) { preToken = pre; } MB_String operator[](size_t index) { MB_String s = preToken ? " " : smtp_auth_capabilities[index].text; s += !preToken ? " " : smtp_auth_capabilities[index].text; return s; } private: bool preToken = false; }; // The smtp auth capability with leading space. static esp_mail_smtp_auth_tokens smtp_auth_cap_pre_tokens(true); // The smtp auth capability with trailing space. static esp_mail_smtp_auth_tokens smtp_auth_cap_post_tokens(false); struct esp_mail_smtp_send_capability_t { char text[15]; }; /** The server capability keywords per standard. * The arrangement is related esp_mail_smtp_send_capability_types enum. * Do not modify or remove. */ const struct esp_mail_smtp_send_capability_t smtp_send_capabilities[esp_mail_smtp_send_capability_maxType] PROGMEM = { "BINARYMIME", "8BITMIME", "CHUNKING", "SMTPUTF8", "PIPELINING", "DSN", "" /* ESMTP */}; struct esp_mail_smtp_send_tokens { public: esp_mail_smtp_send_tokens(bool pre) { preToken = pre; } MB_String operator[](size_t index) { MB_String s = preToken ? " " : smtp_send_capabilities[index].text; s += !preToken ? " " : smtp_send_capabilities[index].text; return s; } private: bool preToken = false; }; static esp_mail_smtp_send_tokens smtp_send_cap_pre_tokens(true); #endif #if defined(ENABLE_IMAP) /** The server capability keywords per standard. * The arrangement is related esp_mail_auth_capability_types enum. * Do not modify or remove. */ const struct esp_mail_auth_capability_t imap_auth_capabilities[esp_mail_auth_capability_maxType] PROGMEM = { "AUTH=PLAIN", "AUTH=XOAUTH2", "CRAM-MD5", "DIGEST-MD5", "DUMMY_AUTH", /* Log in */ "STARTTLS", "SASL-IR"}; struct esp_mail_imap_auth_tokens { public: esp_mail_imap_auth_tokens(bool pre) { preToken = pre; } MB_String operator[](size_t index) { MB_String s = preToken ? " " : imap_auth_capabilities[index].text; s += !preToken ? " " : imap_auth_capabilities[index].text; return s; } private: bool preToken = false; }; // The imap auth capability with leading space. static esp_mail_imap_auth_tokens imap_auth_cap_pre_tokens(true); struct esp_mail_imap_read_capability_t { char text[15]; }; /** The server capability keywords per standard. * The arrangement is related esp_mail_imap_read_capability_types enum. * Do not modify or remove. */ const struct esp_mail_imap_read_capability_t imap_read_capabilities[esp_mail_imap_read_capability_maxType] PROGMEM = { "IMAP4", "IMAP4rev1", "IDLE", "LITERAL+", "LITERAL-", "MULTIAPPEND", "UIDPLUS", "ACL", "BINARY", "LOGINDISABLED", "MOVE", "QUOTA", "NAMESPACE", "ENABLE", "ID", "UNSELECT", "CHILDREN", "CONDSTORE" "" /* Auto cap */}; struct esp_mail_imap_read_tokens { public: esp_mail_imap_read_tokens(bool pre) { preToken = pre; } MB_String operator[](size_t index) { MB_String s = preToken ? " " : imap_read_capabilities[index].text; s += !preToken ? " " : imap_read_capabilities[index].text; return s; } private: bool preToken = false; }; // The imap auth capability with leading space. static esp_mail_imap_read_tokens imap_read_cap_pre_tokens(true); // The imap auth capability with trailing space. static esp_mail_imap_read_tokens imap_read_cap_post_tokens(false); struct esp_mail_imap_identification_key_t { char text[15]; }; /** The identification keys per standard. * The arrangement is related esp_mail_imap_identification_key_types enum. * Do not modify or remove. */ const struct esp_mail_imap_identification_key_t imap_identification_keys[esp_mail_imap_identification_key_maxType] PROGMEM = { "name", "version", "os", "os-version", "vendor", "support-url", "address", "date", "command", "arguments", "environment"}; /* The IMAP ID data struct */ typedef struct esp_mail_imap_identity_t { MB_String name; MB_String version; MB_String os; MB_String os_version; MB_String vendor; MB_String support_url; MB_String address; MB_String date; MB_String command; MB_String arguments; MB_String environment; } IMAP_Identification; #endif #endif #if defined(ENABLE_SMTP) || defined(ENABLE_IMAP) /* The email address info [SMTP_Message]*/ struct esp_mail_address_info_t { /* The name of Email author/sender */ MB_String name; /* The Email address */ MB_String email; }; #endif #if defined(ENABLE_SMTP) /* The SMTP message notification types enum */ enum esp_mail_smtp_notify { esp_mail_smtp_notify_never = 0, esp_mail_smtp_notify_success = 1, esp_mail_smtp_notify_failure = 2, esp_mail_smtp_notify_delay = 4 }; /* The SMTP status codes enum */ enum esp_mail_smtp_status_code { esp_mail_smtp_status_code_0, // default /* Positive Completion */ esp_mail_smtp_status_code_211 = 221, // System status, or system help reply esp_mail_smtp_status_code_214 = 214, // Help message(A response to the HELP command) esp_mail_smtp_status_code_220 = 220, // Service ready esp_mail_smtp_status_code_221 = 221, // Service closing transmission channel [RFC 2034] esp_mail_smtp_status_code_235 = 235, // 2.7.0 Authentication succeeded[RFC 4954] esp_mail_smtp_status_code_250 = 250, // Requested mail action okay, completed esp_mail_smtp_status_code_251 = 251, // User not local; will forward esp_mail_smtp_status_code_252 = 252, // Cannot verify the user, but it will // try to deliver the message anyway /* Positive Intermediate */ esp_mail_smtp_status_code_334 = 334, //(Server challenge - the text part // contains the Base64 - encoded // challenge)[RFC 4954] esp_mail_smtp_status_code_354 = 354, // Start mail input /* Transient Negative Completion */ /* "Transient Negative" means the error condition is temporary, and the action may be requested again.*/ esp_mail_smtp_status_code_421 = 421, // Service is unavailable because the server is shutting down. esp_mail_smtp_status_code_432 = 432, // 4.7.12 A password transition is needed [RFC 4954] esp_mail_smtp_status_code_450 = 450, // Requested mail action not taken: mailbox unavailable (e.g., // mailbox busy or temporarily blocked for policy reasons) esp_mail_smtp_status_code_451 = 451, // Requested action aborted : local error in processing // e.g.IMAP server unavailable[RFC 4468] esp_mail_smtp_status_code_452 = 452, // Requested action not taken : insufficient system storage esp_mail_smtp_status_code_454 = 454, // 4.7.0 Temporary authentication failure[RFC 4954] esp_mail_smtp_status_code_455 = 455, // Server unable to accommodate parameters /* Permanent Negative Completion */ esp_mail_smtp_status_code_500 = 500, // Syntax error, command unrecognized // (This may include errors such as // command line too long) // e.g. Authentication Exchange line is too long [RFC 4954] esp_mail_smtp_status_code_501 = 501, // Syntax error in parameters or arguments // e.g. 5.5.2 Cannot Base64-decode Client responses [RFC 4954] // 5.7.0 Client initiated Authentication Exchange (only when the SASL // mechanism specified that client does not begin the authentication exchange) // [RFC 4954] esp_mail_smtp_status_code_502 = 502, // Command not implemented esp_mail_smtp_status_code_503 = 503, // Bad sequence of commands esp_mail_smtp_status_code_504 = 504, // Command parameter is not implemented // e.g. 5.5.4 Unrecognized authentication type [RFC 4954] esp_mail_smtp_status_code_521 = 521, // Server does not accept mail [RFC 7504] esp_mail_smtp_status_code_523 = 523, // Encryption Needed [RFC 5248] esp_mail_smtp_status_code_530 = 530, // 5.7.0 Authentication required [RFC 4954] esp_mail_smtp_status_code_534 = 534, // 5.7.9 Authentication mechanism is too weak [RFC 4954] esp_mail_smtp_status_code_535 = 535, // 5.7.8 Authentication credentials invalid [RFC 4954] esp_mail_smtp_status_code_538 = 538, // 5.7.11 Encryption required for // requested authentication mechanism[RFC // 4954] esp_mail_smtp_status_code_550 = 550, // Requested action not taken: mailbox unavailable (e.g., mailbox not // found, no access, or command rejected for policy reasons) esp_mail_smtp_status_code_551 = 551, // User not local; please try esp_mail_smtp_status_code_552 = 552, // Requested mail action aborted: exceeded storage allocation esp_mail_smtp_status_code_553 = 553, // Requested action not taken: mailbox name not allowed esp_mail_smtp_status_code_554 = 554, // Transaction has failed (Or, in the // case of a connection-opening response, // "No SMTP service here") // e.g. 5.3.4 Message too big for system [RFC 4468] esp_mail_smtp_status_code_556 = 556, // Domain does not accept mail[RFC 7504] }; /* The SMTP ports enum */ enum esp_mail_smtp_port { esp_mail_smtp_port_25 = 25, // PLAIN/TLS with STARTTLS esp_mail_smtp_port_465 = 465, // SSL esp_mail_smtp_port_587 = 587, // TLS with STARTTLS }; const struct port_function smtp_ports[3] = { {esp_mail_smtp_port_25, esp_mail_protocol_plain_text}, {esp_mail_smtp_port_465, esp_mail_protocol_ssl}, {esp_mail_smtp_port_587, esp_mail_protocol_tls}}; /* The SMTP message response [SMTP_Message] */ struct esp_mail_smtp_msg_response_t { /* The author Email address to reply */ MB_String reply_to; /* The sender Email address to return the message */ MB_String return_path; /** The Delivery Status Notifications e.g. esp_mail_smtp_notify_never, * esp_mail_smtp_notify_success, * esp_mail_smtp_notify_failure, and * esp_mail_smtp_notify_delay */ int notify = esp_mail_smtp_notify::esp_mail_smtp_notify_never; }; /* The SMTP enable option [SMTP_Message] */ struct esp_mail_smtp_enable_option_t { /* Enable chunk data sending for large message */ bool chunking = false; }; /* The SMTP blob data attachment data [Session_Config] */ struct esp_mail_attach_blob_t { /* BLOB data (flash or ram) */ const uint8_t *data = nullptr; /* BLOB data size in byte */ size_t size = 0; }; /* The SMTP file attachment data [Session_Config] */ struct esp_mail_attach_file_t { MB_String path; /** The file storage type e.g. esp_mail_file_storage_type_none, * esp_mail_file_storage_type_flash, and * esp_mail_file_storage_type_sd */ esp_mail_file_storage_type storage_type = esp_mail_file_storage_type_none; }; /* The SMTP attachment decription [Session_Config] */ struct esp_mail_attach_descr_t { /* The name of attachment */ MB_String name; /* The attachment file name */ MB_String filename; /* The MIME type of attachment */ MB_String mime; /* The transfer encoding of attachment e.g. base64 */ MB_String transfer_encoding = "base64"; /* The content encoding of attachment e.g. base64 */ MB_String content_encoding; /* The content id of attachment file */ MB_String content_id; /* The description of attachment file */ MB_String description; }; /* Used internally in esp_mail_attachment_t */ struct esp_mail_attach_internal_t { esp_mail_attach_type att_type = esp_mail_att_type_attachment; int index = 0; int msg_uid = 0; bool flash_blob = false; esp_mail_msg_xencoding xencoding = esp_mail_msg_xencoding_none; bool parallel = false; MB_String cid; }; /* The struct used as SMTP_Attachment for SMTP and ESP_Mail_Attachment for IMAP */ struct esp_mail_attachment_t { /* The attachment description */ struct esp_mail_attach_descr_t descr; /* The BLOB data config */ struct esp_mail_attach_blob_t blob; /* The file data config */ struct esp_mail_attach_file_t file; /* reserved for internal usage */ struct esp_mail_attach_internal_t _int; }; /* The struct used as SMTP_Result */ struct esp_mail_smtp_send_status_t { /* The status of the message */ bool completed = false; /* The primary recipient mailbox of the message */ MB_String recipients; /* The topic of the message */ MB_String subject; /* The timestamp of the message */ uint32_t timestamp = 0; }; /* Used internally for SMTPSession */ struct esp_mail_smtp_msg_type_t { bool rfc822 = false; int rfc822Idx = 0; }; /* Used internally for holding base64 data sources */ struct esp_mail_smtp_send_base64_data_info_t { esp_mail_file_storage_type storageType = esp_mail_file_storage_type_none; const char *filename = ""; const uint8_t *rawPtr = nullptr; bool flashMem = false; size_t size = 0; size_t dataIndex = 0; }; /* SMTP commands types enum */ enum esp_mail_smtp_command { esp_mail_smtp_cmd_undefined, esp_mail_smtp_cmd_initial_state, esp_mail_smtp_cmd_greeting, esp_mail_smtp_cmd_start_tls, esp_mail_smtp_cmd_login_user, esp_mail_smtp_cmd_auth_plain, esp_mail_smtp_cmd_auth_login, esp_mail_smtp_cmd_auth_xoauth2, esp_mail_smtp_cmd_login_psw, esp_mail_smtp_cmd_send_header_sender, esp_mail_smtp_cmd_send_header_recipient, esp_mail_smtp_cmd_send_body, esp_mail_smtp_cmd_chunk_termination, esp_mail_smtp_cmd_logout, esp_mail_smtp_cmd_custom }; /* SMTP message priority level enum */ enum esp_mail_smtp_priority { esp_mail_smtp_priority_high = 1, esp_mail_smtp_priority_normal = 3, esp_mail_smtp_priority_low = 5, }; /* SMTP response data */ typedef struct esp_mail_smtp_response_status_t { /* The SMTP server response status code */ int statusCode = 0; /* error code */ int errorCode = 0; int id = -1; MB_String text; } SMTP_Response; #endif #if defined(ENABLE_IMAP) enum esp_mail_imap_msg_num_type { esp_mail_imap_msg_num_type_undefined, esp_mail_imap_msg_num_type_uid, esp_mail_imap_msg_num_type_number }; enum esp_mail_imap_store_flag_type { esp_mail_imap_store_flag_type_set, esp_mail_imap_store_flag_type_add, esp_mail_imap_store_flag_type_remove }; enum esp_mail_char_decoding_scheme { esp_mail_char_decoding_scheme_default = -1, esp_mail_char_decoding_scheme_utf_8, esp_mail_char_decoding_scheme_iso8859_1, esp_mail_char_decoding_scheme_iso8859_11, esp_mail_char_decoding_scheme_tis_620, esp_mail_char_decoding_scheme_windows_874 }; enum esp_mail_imap_rights_type_t { /* a - administer (perform SETACL/DELETEACL/GETACL/LISTRIGHTS) */ esp_mail_imap_rights_administer = 'a' - 'a', /* c - RFC2086 (obsoleted) create (CREATE new sub-mailboxes in any implementation-defined hierarchy) */ esp_mail_imap_rights_create_c = 'c' - 'a', /* d - RFC2086 (obsoleted) delete (STORE DELETED flag, perform EXPUNGE) */ esp_mail_imap_rights_delete_d = 'd' - 'a', /* e - perform EXPUNGE and expunge as a part of CLOSE */ esp_mail_imap_rights_expunge = 'e' - 'a', /* i - insert (perform APPEND, COPY into mailbox) */ esp_mail_imap_rights_insert = 'i' - 'a', /* k - RFC4314 create mailboxes (CREATE new sub-mailboxes in any implementation-defined hierarchy, parent mailbox for the new mailbox name in RENAME)*/ esp_mail_imap_rights_create = 'k' - 'a', /* l - lookup (mailbox is visible to LIST/LSUB commands, SUBSCRIBE mailbox) */ esp_mail_imap_rights_lookup = 'l' - 'a', /* p - post (send mail to submission address for mailbox, not enforced by IMAP4 itself) */ esp_mail_imap_rights_post = 'p' - 'a', /* r - read (SELECT the mailbox, perform STATUS) */ esp_mail_imap_rights_read = 'r' - 'a', /* s - keep seen/unseen information across sessions (set or clear \SEEN flag via STORE, also set \SEEN during APPEND/COPY/ FETCH BODY[...]) */ esp_mail_imap_rights_seen = 's' - 'a', /* t - RFC4314 delete messages (set or clear \DELETED flag via STORE, set \DELETED flag during APPEND/COPY) */ esp_mail_imap_rights_delete_message = 't' - 'a', /* w - write (set or clear flags other than \SEEN and \DELETED via STORE, also set them during APPEND/COPY) */ esp_mail_imap_rights_write = 'w' - 'a', /* x - RFC4314 delete mailbox (DELETE mailbox, old mailbox name in RENAME) */ esp_mail_imap_rights_delete_mailbox = 'x' - 'a', esp_mail_imap_rights_maxType = esp_mail_imap_rights_delete_mailbox + 1 }; enum esp_mail_imap_port { esp_mail_imap_port_143 = 143, // PLAIN/TLS with STARTTLS esp_mail_imap_port_993 = 993, // SSL }; const struct port_function imap_ports[2] = { {esp_mail_imap_port_143, esp_mail_protocol_plain_text}, {esp_mail_imap_port_993, esp_mail_protocol_ssl}}; enum esp_mail_imap_auth_mode { esp_mail_imap_mode_examine, esp_mail_imap_mode_select }; enum esp_mail_imap_response_status { esp_mail_imap_resp_unknown, esp_mail_imap_resp_ok, esp_mail_imap_resp_no, esp_mail_imap_resp_bad }; enum esp_mail_imap_polling_status_type { imap_polling_status_type_undefined, imap_polling_status_type_new_message, imap_polling_status_type_remove_message, imap_polling_status_type_fetch_message }; enum esp_mail_imap_header_state { esp_mail_imap_state_content_type = esp_mail_rfc822_header_field_maxType, esp_mail_imap_state_content_transfer_encoding, esp_mail_imap_state_accept_language, esp_mail_imap_state_content_language, esp_mail_imap_state_char_set, esp_mail_imap_state_boundary }; enum esp_mail_imap_command { esp_mail_imap_cmd_capability, esp_mail_imap_cmd_starttls, esp_mail_imap_cmd_sasl_login, esp_mail_imap_cmd_sasl_auth_plain, esp_mail_imap_cmd_sasl_auth_oauth, esp_mail_imap_cmd_list, esp_mail_imap_cmd_lsub, esp_mail_imap_cmd_subscribe, esp_mail_imap_cmd_unsubscribe, esp_mail_imap_cmd_select, esp_mail_imap_cmd_examine, esp_mail_imap_cmd_close, esp_mail_imap_cmd_status, esp_mail_imap_cmd_search, esp_mail_imap_cmd_fetch_body_header, esp_mail_imap_cmd_fetch_body_mime, esp_mail_imap_cmd_fetch_body_text, esp_mail_imap_cmd_fetch_body_attachment, esp_mail_imap_cmd_fetch_body_inline, esp_mail_imap_cmd_fetch_sequence_set, esp_mail_imap_cmd_logout, esp_mail_imap_cmd_store, esp_mail_imap_cmd_move, esp_mail_imap_cmd_get_quota, esp_mail_imap_cmd_set_quota, esp_mail_imap_cmd_get_quota_root, esp_mail_imap_cmd_get_acl, esp_mail_imap_cmd_set_acl, esp_mail_imap_cmd_delete_acl, esp_mail_imap_cmd_my_rights, esp_mail_imap_cmd_namespace, esp_mail_imap_cmd_expunge, esp_mail_imap_cmd_create, esp_mail_imap_cmd_rename, esp_mail_imap_cmd_delete, esp_mail_imap_cmd_idle, esp_mail_imap_cmd_done, esp_mail_imap_cmd_get_uid, esp_mail_imap_cmd_get_flags, esp_mail_imap_cmd_append, esp_mail_imap_cmd_append_last, esp_mail_imap_cmd_enable, esp_mail_imap_cmd_id, esp_mail_imap_cmd_unselect, esp_mail_imap_cmd_noop, esp_mail_imap_cmd_copy, esp_mail_imap_cmd_custom }; enum esp_mail_imap_mime_fetch_type { esp_mail_imap_mime_fetch_type_part, esp_mail_imap_mime_fetch_type_sub_part1, esp_mail_imap_mime_fetch_type_sub_part2 }; enum esp_mail_imap_header_type { esp_mail_imap_header_from, esp_mail_imap_header_to, esp_mail_imap_header_cc, esp_mail_imap_header_subject, esp_mail_imap_header_date, esp_mail_imap_header_msg_id, esp_mail_imap_header_cont_lang, esp_mail_imap_header_accept_lang }; enum esp_mail_imap_multipart_sub_type { esp_mail_imap_multipart_sub_type_none = 0, esp_mail_imap_multipart_sub_type_mixed, esp_mail_imap_multipart_sub_type_alternative, esp_mail_imap_multipart_sub_type_parallel, esp_mail_imap_multipart_sub_type_digest, esp_mail_imap_multipart_sub_type_related, esp_mail_imap_multipart_sub_type_report, }; enum esp_mail_imap_message_sub_type { esp_mail_imap_message_sub_type_none = 0, esp_mail_imap_message_sub_type_rfc822, esp_mail_imap_message_sub_type_delivery_status, esp_mail_imap_message_sub_type_partial, esp_mail_imap_message_sub_type_external_body, }; typedef struct esp_mail_imap_response_status_t { // No IMAP server response status code (statusCode), server returns OK, NO and BAD response instead /* error code */ int errorCode = 0; MB_String tag; MB_String text; MB_String status; bool completed = false; public: void clear(bool clearTag = true) { if (clearTag) tag.clear(); status.clear(); text.clear(); completed = false; } } IMAP_Response; struct esp_mail_imap_msg_num_t { esp_mail_imap_msg_num_type type = esp_mail_imap_msg_num_type_undefined; uint32_t value = 0; }; __attribute__((used)) struct { bool operator()(struct esp_mail_imap_msg_num_t a, struct esp_mail_imap_msg_num_t b) const { return a.value > b.value; } } compareMore; struct esp_mail_imap_rfc822_msg_header_item_t { MB_String header_items[esp_mail_rfc822_header_field_maxType]; }; /* IMAP quota root info */ typedef struct esp_mail_imap_quota_root_info_t { /* The quota root */ MB_String quota_root; /* The resource name e.g. STORAGE and MESSAGE */ MB_String name; /* The resource usage in kilo octets */ size_t usage = 0; /* The resource limit in kilo octets */ size_t limit = 0; } IMAP_Quota_Root_Info; /* IMAP namespace info */ typedef struct esp_mail_imap_namespace_info_t { /* The leading prefix */ MB_String prefix; /* The hierarchy delimiter */ MB_String delimiter; } IMAP_Namespace_Info; typedef struct esp_mail_imap_rights_info_t { MB_String identifier; bool rights[esp_mail_imap_rights_maxType]; } IMAP_Rights_Info; /* descrete media types (rfc 2046) */ struct esp_mail_imap_descrete_media_type_t { /** textual information with subtypes * "plain" * "enriched" (rfc 1896 revised from richtext in rfc 1341) * * unrecognized subtypes and charset should be interpreted as * application/octet-stream * * parameters: * "charset" (rfc 2045) default is us-ascii * for character set includes 8-bit characters * and such characters are used in the body, Content-Transfer-Encoding * header field and a corresponding encoding on the data are required * * ISO-8859-X where "X" is to be replaced, as * necessary, for the parts of ISO-8859 [ISO-8859]. */ static constexpr const char *text = "text"; /** image data with subtypes (rfc 2048) * "jpeg" * "gif" * * unrecognized subtypes should be interpreted as application/octet-stream */ static constexpr const char *image = "image"; /** audio data with initial subtype * "baic" -- for single channel audio encoded using 8bit ISDN mu-law [PCM] * at a sample rate of 8000 Hz. * * Unrecognized subtypes of "audio" should at a miniumum be treated as * "application/octet-stream" */ static constexpr const char *audio = "audio"; /** video data with initial subtype * "mpeg" * * Unrecognized subtypes of "video" should at a minumum be treated as * "application/octet-stream" */ static constexpr const char *video = "video"; /** some other kind of data, typically either * uninterpreted binary data or information to be * processed by an application with subtypes * * "octet-stream" -- uninterpreted binary data * "PostScript" -- for the transport of PostScript material * * Other expected uses include spreadsheets, data for mail-based * scheduling systems, and languages for "active" (computational) * messaging, and word processing formats that are not directly readable. * * The octet-stream subtype parameters: * TYPE, PADDING, NAME */ static constexpr const char *application = "application"; }; /** composite media types (rfc 2046) * * As stated in the definition of the Content-Transfer-Encoding field * [RFC 2045], no encoding other than "7bit", "8bit", or "binary" is * permitted for entities of type "multipart". The "multipart" boundary * delimiters and header fields are always represented as 7bit US-ASCII * in any case (though the header fields may encode non-US-ASCII header * text as per RFC 2047) and data within the body parts can be encoded * on a part-by-part basis, with Content-Transfer-Encoding fields for * each appropriate body part. */ struct esp_mail_imap_composite_media_type_t { /** data consisting of multiple entities of independent data types * The Content-Type field for multipart entities requires one parameter, * "boundary". * The boundary delimiter line is then defined as a line * consisting entirely of two hyphen characters ("-", decimal value 45) * followed by the boundary parameter value from the Content-Type header * field, optional linear whitespace, and a terminating CRLF. * * NOTE: The CRLF preceding the boundary delimiter line is conceptually * attached to the boundary so that it is possible to have a part that * does not end with a CRLF (line break). Body parts that must be * considered to end with line breaks, therefore, must have two CRLFs * preceding the boundary delimiter line, the first of which is part of * the preceding body part, and the second of which is part of the * encapsulation boundary. * * Boundary delimiters must not appear within the encapsulated material, * and must be no longer than 70 characters, not counting the two * leading hyphens. * * The boundary delimiter line following the last body part is a * distinguished delimiter that indicates that no further body parts * will follow. Such a delimiter line is identical to the previous * delimiter lines, with the addition of two more hyphens after the * boundary parameter value. * * See rfc2049 Appendix A for a Complex Multipart Example */ static constexpr const char *multipart = "multipart"; /* an encapsulated message */ static constexpr const char *message = "message"; }; typedef struct esp_mail_imap_mime_data_stream_info_t { /* message UID */ uint32_t uid = 0; /* content type */ const char *type = ""; /* disposition */ const char *disposition = ""; /* content character set */ const char *charSet = ""; /* text content flowed format parameter */ bool flowed = false; /* text content format DelSp parameter */ bool delsp = false; /* content transfer encoding */ const char *transfer_encoding = ""; /* content ID */ const char *cid = ""; /* content description */ const char *description = ""; /* content file name */ const char *filename = ""; /* content name */ const char *name = ""; /* creation date */ const char *date = ""; /* content size */ size_t size = 0; /* octet size */ size_t octet_size = 0; /* current octet count */ int octet_count = 0; /* data size */ size_t data_size = 0; /* data buffer */ void *data = NULL; bool isFirstData = false; bool isLastData = false; } MIME_Data_Stream_Info; typedef struct esp_mail_imap_decoding_info { enum message_part_type { message_part_type_header, message_part_type_text }; /* The character set of the string to decode */ const char *charset = ""; /* The string to decode */ const char *data = ""; /* The decoded string to be processed */ MB_String decodedString; /** The type of data that currently processed * 0 or IMAP_Decoding_Info::message_part_type_header * 1 or IMAP_Decoding_Info::message_part_type_text */ message_part_type type = message_part_type_header; } IMAP_Decoding_Info; struct esp_mail_imap_media_text_sub_type_t { static constexpr const char *plain = "plain"; static constexpr const char *enriched = "enriched"; static constexpr const char *html = "html"; }; /* multipart sub types */ struct esp_mail_imap_multipart_sub_type_t { /* a generic mixed set of parts */ static constexpr const char *mixed = "mixed"; /* the same data in multiple formats */ static constexpr const char *alternative = "alternative"; /* parts intended to be viewed simultaneously */ static constexpr const char *parallel = "parallel"; /* multipart entities in which each part has a default type of * "message/rfc822" */ static constexpr const char *digest = "digest"; /* for compound objects consisting of several inter-related body parts (rfc * 2387) */ static constexpr const char *related = "related"; /* rfc 3462 */ static constexpr const char *report = "report"; }; /* message body sub types */ struct esp_mail_imap_message_sub_type_t { /* body contains an encapsulated message, with the syntax of an RFC 822 * message. */ static constexpr const char *rfc822 = "rfc822"; /* to allow large objects to be delivered as several separate pieces of mail */ static constexpr const char *Partial = "Partial"; /* the actual body data are not included, but merely referenced */ static constexpr const char *External_Body = "External-Body"; static constexpr const char *delivery_status = "delivery-status"; }; /* IMAP polling status */ typedef struct esp_mail_imap_polling_status_t { /** The type of status e.g. imap_polling_status_type_undefined, imap_polling_status_type_new_message, * imap_polling_status_type_fetch_message and imap_polling_status_type_remove_message. */ esp_mail_imap_polling_status_type type = imap_polling_status_type_undefined; /** Message number or order from the total number of message that added, fetched or deleted. */ size_t messageNum = 0; /** Argument of commands e.g. FETCH */ MB_String argument; } IMAP_Polling_Status; struct esp_mail_message_part_info_t { enum content_header_field { content_header_field_none, content_header_field_type, content_header_field_description, content_header_field_id, content_header_field_disposition, content_header_field_transfer_enc, content_header_field_ext }; int octetLen = 0; int octetCount = 0; int attach_data_size = 0; int textLen = 0; bool sizeProp = false; int nestedLevel = 0; // pointer to the MB_String for storing multi-line header field content. uint32_t stringPtr = 0; esp_mail_char_decoding_scheme stringEnc = esp_mail_char_decoding_scheme_default; content_header_field cur_content_hdr = content_header_field_none; MB_String partNumStr; MB_String partNumFetchStr; MB_String text; MB_String filename; MB_String CID; MB_String type; MB_String save_path; MB_String name; MB_String content_disposition; MB_String content_description; MB_String content_type; MB_String descr; MB_String content_transfer_encoding; MB_String creation_date; MB_String modification_date; MB_String charset; MB_String download_error; esp_mail_attach_type attach_type = esp_mail_att_type_none; esp_mail_message_type msg_type = esp_mail_msg_type_none; bool file_open_write = false; bool multipart = false; bool is_firmware_file = false; bool save_to_file = true; size_t firmware_downloaded_byte = 0; esp_mail_imap_multipart_sub_type multipart_sub_type = esp_mail_imap_multipart_sub_type_none; esp_mail_imap_message_sub_type message_sub_type = esp_mail_imap_message_sub_type_none; bool rfc822_part = false; int rfc822_msg_Idx = 0; struct esp_mail_imap_rfc822_msg_header_item_t rfc822_header; bool error = false; bool plain_flowed = false; bool plain_delsp = false; esp_mail_msg_xencoding xencoding = esp_mail_msg_xencoding_none; }; struct esp_mail_message_header_t { int header_data_len = 0; struct esp_mail_imap_rfc822_msg_header_item_t header_fields; MB_String content_type; MB_String content_transfer_encoding; uint32_t message_uid = 0; uint32_t message_no = 0; MB_String boundary; MB_String accept_language; MB_String content_language; MB_String char_set; bool multipart = false; bool rfc822_part = false; bool hasAttachment = false; int rfc822Idx = 0; MB_String partNumStr; esp_mail_imap_multipart_sub_type multipart_sub_type = esp_mail_imap_multipart_sub_type_none; esp_mail_imap_message_sub_type message_sub_type = esp_mail_imap_message_sub_type_none; MB_String msgID; MB_String flags; MB_String error_msg; bool error = false; _vectorImpl part_headers; int attachment_count = 0; int sd_alias_file_count = 0; int total_download_size = 0; int downloaded_size = 0; int total_attach_data_size = 0; int downloaded_bytes = 0; int message_data_count = 0; }; /* Internal use */ struct esp_mail_folder_info_t { MB_String name; MB_String attributes; MB_String delimiter; }; struct esp_mail_folder_info_item_t { /* The name of folder */ const char *name = ""; /* The attributes of folder */ const char *attributes = ""; /* The delimeter of folder */ const char *delimiter = ""; }; struct esp_mail_imap_download_config_t { /* To download the PLAIN text content of the message */ bool text = false; /* To download the HTML content of the message */ bool html = false; /* To download the attachments of the message */ bool attachment = false; /* To download the inline image of the message */ bool inlineImg = false; /* To download the rfc822 mesages in the message */ bool rfc822 = false; /* To download the message header */ bool header = false; }; struct esp_mail_imap_enable_config_t { /* To store the PLAIN text of the message in the IMAPSession */ bool text = false; /* To store the HTML of the message in the IMAPSession */ bool html = false; /* To store the rfc822 messages in the IMAPSession */ bool rfc822 = false; /* To enable the download status via the serial port */ bool download_status = false; /* To sort the message UID of the search result in descending order */ bool recent_sort = false; /* To allow case sesitive in header parsing */ bool header_case_sensitive = false; }; struct esp_mail_imap_limit_config_t { /* The maximum messages from the search result */ size_t search = 10; /* The maximum messages from the sequence set fetching result */ size_t fetch = 30; /** The maximum size of the memory buffer to store the message content. * This is only limit for data to be stored in the IMAPSession. */ size_t msg_size = 1024; /* The maximum size of each attachment to download */ size_t attachment_size = 1024 * 1024 * 5; /* The IMAP idle timeout in ms (1 min to 29 min). Default is 8 min */ size_t imap_idle_timeout = 8 * 60 * 1000; /** The IMAP idle host check interval in ms (30 sec to imap_idle_timeout) * for internet availability checking to ensure the connection is active. * Default is 1 min. */ size_t imap_idle_host_check_interval = 60 * 1000; }; struct esp_mail_imap_storage_config_t { /* The path to save the downloaded file */ MB_String saved_path; /** The type of file storages e.g. * esp_mail_file_storage_type_none, * esp_mail_file_storage_type_flash, and * esp_mail_file_storage_type_sd */ esp_mail_file_storage_type type = esp_mail_file_storage_type_flash; }; struct esp_mail_imap_search_config_t { /* The search criteria */ MB_String criteria; /* The option to search the unseen message */ bool unseen_msg = false; }; struct esp_mail_imap_sequence_set_t { /* The sequence set string i.g., unique identifier (UID) or message sequence number or ranges of UID or sequence number */ MB_String string; /* The option for sequenceSet whether it is UID or message sequence number */ bool UID = false; /* The option for header only fetching */ bool headerOnly = false; }; struct esp_mail_imap_fetch_config_t { /* The UID of message to fetch */ MB_String uid; /* The message sequence number to fetch */ MB_String number; /* The sequence set options */ esp_mail_imap_sequence_set_t sequence_set; /* Set the message flag as seen */ bool set_seen = false; /* The int32_t option for CHANGESINCE conditional test. */ int32_t modsequence = 0; /* The config to fetch only the header */ bool headerOnly = false; }; struct esp_mail_imap_firmware_config_t { /* Update firmware using message attachments if one of its filename matches. */ MB_String attach_filename; /* Save firmware file */ bool save_to_file = false; }; struct esp_mail_imap_data_config_t { /* The config for fetching */ struct esp_mail_imap_fetch_config_t fetch; /* The config for search */ struct esp_mail_imap_search_config_t search; /* The config about the limits */ struct esp_mail_imap_limit_config_t limit; /* The config to enable the features */ struct esp_mail_imap_enable_config_t enable; /* The config about downloads */ struct esp_mail_imap_download_config_t download; /* The config about the storage and path to save the downloaded file */ struct esp_mail_imap_storage_config_t storage; /* The config about firmware updates and downloads for ESP32, ESP8266 and Raspberry Pi Pico */ struct esp_mail_imap_firmware_config_t firmware_update; IMAP_Identification identification; }; /* Mail and MIME Header Fields */ struct esp_mail_imap_msg_item_t { friend class IMAPSession; public: esp_mail_imap_msg_item_t() { text.content_type = mimeinfo[esp_mail_file_extension_txt].mimeType; html.content_type = mimeinfo[esp_mail_file_extension_html].mimeType; }; /* The message number */ int msgNo = 0; /* The message UID */ int UID = 0; /* The message identifier (RFC 4021) */ const char *ID = ""; /* The language(s) for auto-responses (RFC 4021) */ const char *acceptLang = ""; /* The language of message content (RFC 4021) */ const char *contentLang = ""; /* The mailbox of message author (RFC 4021) */ const char *from = ""; /* The charset of the mailbox of message author */ // deprecated const char *fromCharset = ""; /* The primary recipient mailbox (RFC 4021) */ const char *to = ""; /* The charset of the primary recipient mailbox */ // deprecated const char *toCharset = ""; /* The Carbon-copy recipient mailboxes (RFC 4021) */ const char *cc = ""; /* The charset of the Carbon-copy recipient mailbox header */ // deprecated const char *ccCharset = ""; /* The Blind-carbon-copy recipient mailboxes (RFC 4021) */ const char *bcc = ""; /* The charset of the Blind-carbon-copy recipient mailbox header */ // deprecated const char *bccCharset = ""; /* The message date and time (RFC 4021) */ const char *date = ""; /* The topic of message (RFC 4021) */ const char *subject = ""; /* The topic of message charset */ // deprecated const char *subjectCharset = ""; /* The message flags */ const char *flags = ""; /* The PLAIN text content of the message */ esp_mail_imap_plain_body_t text; /* The HTML content of the message */ esp_mail_imap_html_body_t html; /* rfc822 related */ /* The sender Email */ const char *sender; /* The charset of the sender Email */ // deprecated const char *senderCharset = ""; /* The keywords or phrases, separated by commas */ const char *keywords = ""; /* The comments about message */ const char *comments = ""; /* The field that contains the parent's message ID of the message to which this one is a reply */ const char *in_reply_to = ""; /* The field that contains the parent's references (if any) and followed by the parent's message ID (if any) of the message to which this one is a reply */ const char *references = ""; /* The return recipient of the message */ const char *return_path = ""; /* The Email address to reply */ const char *reply_to; /* The error description from fetching the message */ const char *fetchError = ""; /* The info about the attachments in the message */ _vectorImpl attachments; /* The info about the rfc822 messages included in the message */ _vectorImpl rfc822; /* The status for message that contains attachment */ bool hasAttachment = false; private: void setRFC822Headers(struct esp_mail_imap_rfc822_msg_header_item_t *rfc822_header) { from = rfc822_header->header_items[esp_mail_rfc822_header_field_from].c_str(); sender = rfc822_header->header_items[esp_mail_rfc822_header_field_sender].c_str(); to = rfc822_header->header_items[esp_mail_rfc822_header_field_to].c_str(); cc = rfc822_header->header_items[esp_mail_rfc822_header_field_cc].c_str(); subject = rfc822_header->header_items[esp_mail_rfc822_header_field_subject].c_str(); date = rfc822_header->header_items[esp_mail_rfc822_header_field_date].c_str(); ID = rfc822_header->header_items[esp_mail_rfc822_header_field_msg_id].c_str(); return_path = rfc822_header->header_items[esp_mail_rfc822_header_field_return_path].c_str(); reply_to = rfc822_header->header_items[esp_mail_rfc822_header_field_reply_to].c_str(); in_reply_to = rfc822_header->header_items[esp_mail_rfc822_header_field_in_reply_to].c_str(); references = rfc822_header->header_items[esp_mail_rfc822_header_field_references].c_str(); comments = rfc822_header->header_items[esp_mail_rfc822_header_field_comments].c_str(); keywords = rfc822_header->header_items[esp_mail_rfc822_header_field_keywords].c_str(); bcc = rfc822_header->header_items[esp_mail_rfc822_header_field_bcc].c_str(); flags = rfc822_header->header_items[esp_mail_rfc822_header_field_flags].c_str(); text.charSet = ""; text.content_type = ""; text.transfer_encoding = ""; html.charSet = ""; html.content_type = ""; html.transfer_encoding = ""; } }; struct esp_mail_imap_msg_list_t { /* The info of a message */ _vectorImpl msgItems; }; struct esp_mail_imap_multipart_level_t { uint8_t level = 0; bool fetch_rfc822_header = false; bool append_body_text = false; }; struct esp_mail_imap_response_data { public: esp_mail_imap_response_status imapResp = esp_mail_imap_resp_unknown; char *response = nullptr; int readLen = 0; long dataTime = millis(); int chunkBufSize = 512; int chunkIdx = 0; bool isUntaggedResponse = false; bool untaggedRespCompleted = false; bool completedResponse = false; bool endSearch = false; struct esp_mail_message_header_t header; struct esp_mail_message_part_info_t part; MB_String filePath; bool downloadRequest = false; int octetCount = 0; int octetLength = 0; bool tmo = false; int headerState = 0; int searchCount = 0; char *lastBuf = nullptr; char *buf = nullptr; esp_mail_imap_response_data(int bufLen) { chunkBufSize = bufLen; }; ~esp_mail_imap_response_data() { clear(); } void clear() { if (response) free(response); if (lastBuf) free(lastBuf); if (buf) free(buf); response = nullptr; lastBuf = nullptr; buf = nullptr; } }; #endif #if defined(ENABLE_SMTP) || defined(ENABLE_IMAP) struct esp_mail_link_internal_t { MB_String cid; }; struct esp_mail_sesson_cert_config_t { /* The certificate data (base64 data) */ const char *cert_data = NULL; /* The certificate file (DER format) */ MB_String cert_file; /* The storage type */ esp_mail_file_storage_type cert_file_storage_type; /* The cerificate verification option */ bool verify = false; }; struct esp_mail_smtp_logs_config_t { /* The log file path */ MB_String filename; /* The storage type */ esp_mail_file_storage_type storage_type; }; struct esp_mail_sesson_sever_config_t { /* The hostName of the server */ MB_String host_name; /* The port on the server to connect to */ uint16_t port = 0; }; /* The log in credentials */ struct esp_mail_sesson_login_config_t { /* The user Email address to log in */ MB_String email; /* The user password to log in */ MB_String password; /* The OAuth2.0 access token to log in */ MB_String accessToken; /* The host name or public IP of client system */ MB_String user_domain; }; /* The device time config */ struct esp_mail_sesson_time_config_t { /* set the NTP servers (use comma to separate the servers) to let the library to set the time from NTP server */ MB_String ntp_server; /* the GMT offset or time zone */ float gmt_offset = 0; /* the day light saving offset */ float day_light_offset = 0; /** TZ environment variable for local time setting * See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv */ MB_String timezone_env_string; /* the file path to store TZ environment variable */ MB_String timezone_file = "/tze.txt"; }; struct esp_mail_sesson_secure_config_t { /** The option (obsoleted) to send the SMTP and IMAP commands to start the TLS connection rfc2595 section 3 and rfc3207 */ bool startTLS = false; /* The secure connection mode preference */ esp_mail_secure_mode mode = esp_mail_secure_mode_undefined; }; struct esp_mail_spi_ethernet_module_t { #if defined(ESP8266) && defined(ESP8266_CORE_SDK_V3_X_X) #ifdef INC_ENC28J60_LWIP ENC28J60lwIP *enc28j60 = nullptr; #endif #ifdef INC_W5100_LWIP Wiznet5100lwIP *w5100 = nullptr; #endif #ifdef INC_W5500_LWIP Wiznet5500lwIP *w5500 = nullptr; #endif #elif defined(MB_ARDUINO_PICO) #endif }; struct esp_mail_session_config_t { friend class IMAPSession; friend class SMTPSession; friend class ESP_Mail_Client; /* The server config */ struct esp_mail_sesson_sever_config_t server; /* The log in config */ struct esp_mail_sesson_login_config_t login; /* The device time config */ struct esp_mail_sesson_time_config_t time; /* The secure config */ struct esp_mail_sesson_secure_config_t secure; /* The certificate config */ struct esp_mail_sesson_cert_config_t certificate; /* SPI Ethernet Module config for ESP8266 */ struct esp_mail_spi_ethernet_module_t spi_ethernet_module; /* The callback function for WiFi connection */ NetworkConnectionHandler network_connection_handler = NULL; /* specific ports and its protocols */ struct esp_mail_ports_functions ports_functions; /* The mail sending logs config */ struct esp_mail_smtp_logs_config_t sentLogs; public: esp_mail_session_config_t(){}; ~esp_mail_session_config_t() { clear(); aremovePtr(); } void addPtr(_vectorImpl *listPtr, int ptr) { if (listPtr) { this->listPtr = listPtr; bool existed = false; for (size_t i = 0; i < this->listPtr->size(); i++) { if ((*this->listPtr)[i] == ptr) existed = true; } if (!existed) this->listPtr->push_back(ptr); } } void aremovePtr() { if (listPtr) { int ptr = toAddr(*this); for (size_t i = 0; i < listPtr->size(); i++) { if ((*listPtr)[i] == ptr) { listPtr->erase(listPtr->begin() + i, listPtr->begin() + i + 1); break; } } } } void clear() { server.host_name.clear(); server.port = 0; secure.startTLS = false; secure.mode = esp_mail_secure_mode_undefined; login.email.clear(); login.password.clear(); login.user_domain.clear(); login.accessToken.clear(); time.day_light_offset = 0; time.gmt_offset = 0; time.ntp_server.clear(); time.timezone_env_string.clear(); certificate.cert_data = ""; certificate.cert_file = ""; certificate.cert_file_storage_type = esp_mail_file_storage_type_none; certificate.verify = false; clearPorts(); } private: int cert_ptr = 0; bool cert_updated = false; _vectorImpl *listPtr = nullptr; // Internal flags use to keep user sercure.startTLS and secure.mode. bool int_start_tls = false; esp_mail_secure_mode int_mode = esp_mail_secure_mode_undefined; void clearPorts() { if (ports_functions.list) { if (ports_functions.use_internal_list) { ports_functions.size = 0; ports_functions.use_internal_list = false; delete[] ports_functions.list; ports_functions.list = nullptr; } } } }; /** The content transfer encoding * enc_7bit or "7bit" * enc_qp or "quoted-printable" * enc_base64 or "base64" * enc_binary or "binary" * enc_8bit or "8bit" */ typedef struct esp_mail_transfer_encoding_t Content_Transfer_Encoding; /* The session configuations */ typedef struct esp_mail_session_config_t ESP_Mail_Session; // obsoleted typedef struct esp_mail_session_config_t Session_Config; #endif #if defined(ENABLE_SMTP) /* The result from sending the Email */ typedef struct esp_mail_smtp_send_status_t SMTP_Result; /* The attachment details for sending the Email */ typedef struct esp_mail_attachment_t SMTP_Attachment; #endif #if defined(ENABLE_SMTP) && defined(ENABLE_IMAP) typedef struct esp_mail_attachment_t ESP_Mail_Attachment; #endif #if defined(ENABLE_IMAP) /* The info of the selected or open mailbox folder e.g. name, attributes and * delimiter */ typedef struct esp_mail_folder_info_item_t FolderInfo; /* The attachment item details for a message which returned from fetching the * Email */ typedef struct esp_mail_attachment_info_t IMAP_Attach_Item; /** The IMAP operation configuations */ typedef struct esp_mail_imap_data_config_t IMAP_Config; // obsoleted typedef struct esp_mail_imap_data_config_t IMAP_Data; /* The message item data of the IMAP_MSG_List which contains header, body and * attachments info for eacch message*/ typedef struct esp_mail_imap_msg_item_t IMAP_MSG_Item; /* The list that contains the message items from searching or fetching the Email */ typedef struct esp_mail_imap_msg_list_t IMAP_MSG_List; #endif struct esp_mail_wifi_credential_t { MB_String ssid; MB_String password; }; struct esp_mail_wifi_credentials_t { friend class ESP_Mail_Client; friend class ESP_Mail_TCPClient; public: esp_mail_wifi_credentials_t(){}; ~esp_mail_wifi_credentials_t() { clearAP(); clearMulti(); }; void addAP(const String &ssid, const String &password) { esp_mail_wifi_credential_t cred; cred.ssid = ssid; cred.password = password; credentials.push_back(cred); } void clearAP() { credentials.clear(); } private: _vectorImpl credentials; #if defined(ESP_MAIL_HAS_WIFIMULTI) WiFiMulti *multi = nullptr; #endif void reconnect() { if (credentials.size()) { disconnect(); connect(); } } void connect() { #if defined(ESP_MAIL_HAS_WIFIMULTI) clearMulti(); multi = new WiFiMulti(); for (size_t i = 0; i < credentials.size(); i++) multi->addAP(credentials[i].ssid.c_str(), credentials[i].password.c_str()); if (credentials.size() > 0) multi->run(); #elif defined(ESP_MAIL_WIFI_IS_AVAILABLE) WiFi.begin((CONST_STRING_CAST)credentials[0].ssid.c_str(), credentials[0].password.c_str()); #endif } void disconnect() { #if defined(ESP_MAIL_WIFI_IS_AVAILABLE) WiFi.disconnect(); #endif } void clearMulti() { #if defined(ESP_MAIL_HAS_WIFIMULTI) if (multi) delete multi; multi = nullptr; #endif } }; static const char esp_mail_imap_tag_str[] PROGMEM = "xmail"; #if !defined(SILENT_MODE) static const char esp_mail_version_str[] PROGMEM = "ESP Mail Client v"; ///////////////////////// // SMTP debug string static const char esp_mail_dbg_str_1[] PROGMEM = "send command, STARTTLS"; static const char esp_mail_dbg_str_2[] PROGMEM = "connecting to SMTP server"; #if defined(ENABLE_SMTP) static const char esp_mail_dbg_str_3[] PROGMEM = "send Email"; static const char esp_mail_dbg_str_4[] PROGMEM = "SMTP server connected"; static const char esp_mail_dbg_str_5[] PROGMEM = "send SMTP command, EHLO"; static const char esp_mail_dbg_str_6[] PROGMEM = "send SMTP command, AUTH LOGIN"; static const char esp_mail_dbg_str_7[] PROGMEM = "send SMTP command, AUTH PLAIN"; static const char esp_mail_dbg_str_8[] PROGMEM = "send message header"; static const char esp_mail_dbg_str_9[] PROGMEM = "send message body"; static const char esp_mail_dbg_str_10[] PROGMEM = "send attachments"; static const char esp_mail_dbg_str_11[] PROGMEM = "terminate the SMTP session"; static const char esp_mail_dbg_str_12[] PROGMEM = "message sent successfully"; static const char esp_mail_dbg_str_13[] PROGMEM = "send next Email"; static const char esp_mail_dbg_str_14[] PROGMEM = "send inline data"; static const char esp_mail_dbg_str_15[] PROGMEM = "send smtp command, AUTH XOAUTH2"; static const char esp_mail_dbg_str_16[] PROGMEM = "finishing the message sending"; static const char esp_mail_dbg_str_17[] PROGMEM = "No ESMTP supported, send SMTP command, HELO"; #endif ///////////////////////// // IMAP debug string static const char esp_mail_dbg_str_18[] PROGMEM = "connecting to IMAP server"; static const char esp_mail_dbg_str_19[] PROGMEM = "Host > "; static const char esp_mail_dbg_str_20[] PROGMEM = "Port > "; static const char esp_mail_dbg_str_21[] PROGMEM = "Reading time from NTP server"; static const char esp_mail_dbg_str_22[] PROGMEM = "perform SSL/TLS handshake"; #if defined(ENABLE_IMAP) static const char esp_mail_dbg_str_23[] PROGMEM = "get my ACL"; static const char esp_mail_dbg_str_24[] PROGMEM = "checking the capability"; static const char esp_mail_dbg_str_25[] PROGMEM = "fetching message "; static const char esp_mail_dbg_str_26[] PROGMEM = "fetch message header"; static const char esp_mail_dbg_str_27[] PROGMEM = "fetch body part header, "; static const char esp_mail_dbg_str_28[] PROGMEM = "fetch body sub part header, "; static const char esp_mail_dbg_str_29[] PROGMEM = "finished reading Email"; static const char esp_mail_dbg_str_30[] PROGMEM = "UID is "; static const char esp_mail_dbg_str_31[] PROGMEM = "log out completed"; static const char esp_mail_dbg_str_32[] PROGMEM = "closing the "; static const char esp_mail_dbg_str_33[] PROGMEM = "IMAP server connected"; static const char esp_mail_dbg_str_34[] PROGMEM = "send IMAP command, LOGIN"; static const char esp_mail_dbg_str_35[] PROGMEM = "send IMAP command, LIST"; static const char esp_mail_dbg_str_36[] PROGMEM = "searching messages"; static const char esp_mail_dbg_str_37[] PROGMEM = "send IMAP command, FETCH"; static const char esp_mail_dbg_str_38[] PROGMEM = "send IMAP command, LOGOUT"; static const char esp_mail_dbg_str_39[] PROGMEM = "message fetching completed"; static const char esp_mail_dbg_str_40[] PROGMEM = "opening the mailbox folder"; static const char esp_mail_dbg_str_41[] PROGMEM = "setting FLAG"; static const char esp_mail_dbg_str_42[] PROGMEM = "adding FLAG"; static const char esp_mail_dbg_str_43[] PROGMEM = "removing FLAG"; static const char esp_mail_dbg_str_44[] PROGMEM = "send IMAP command, AUTHENTICATE PLAIN"; static const char esp_mail_dbg_str_45[] PROGMEM = "send IMAP command, AUTH XOAUTH2"; static const char esp_mail_dbg_str_46[] PROGMEM = "reading plain TEXT message"; static const char esp_mail_dbg_str_47[] PROGMEM = "reading HTML message"; static const char esp_mail_dbg_str_48[] PROGMEM = "copying message(s) to "; static const char esp_mail_dbg_str_49[] PROGMEM = "creating folder"; static const char esp_mail_dbg_str_50[] PROGMEM = "deleting folder"; static const char esp_mail_dbg_str_51[] PROGMEM = "listening to "; static const char esp_mail_dbg_str_52[] PROGMEM = " folder changes"; static const char esp_mail_dbg_str_53[] PROGMEM = "polling established"; static const char esp_mail_dbg_str_54[] PROGMEM = "Mailbox listening stopped"; static const char esp_mail_dbg_str_55[] PROGMEM = "renaming folder"; static const char esp_mail_dbg_str_56[] PROGMEM = "send IMAP command, LSUB"; static const char esp_mail_dbg_str_57[] PROGMEM = "send IMAP command, SUBSCRIBE"; static const char esp_mail_dbg_str_58[] PROGMEM = "send IMAP command, UNSUBSCRIBE"; static const char esp_mail_dbg_str_59[] PROGMEM = "moving message(s) to "; static const char esp_mail_dbg_str_60[] PROGMEM = "send IMAP command, GETQUOTA"; static const char esp_mail_dbg_str_61[] PROGMEM = "send IMAP command, SETQUOTA"; static const char esp_mail_dbg_str_62[] PROGMEM = "send IMAP command, GETQUOTAROOT"; static const char esp_mail_dbg_str_63[] PROGMEM = "send IMAP command, GETACL"; static const char esp_mail_dbg_str_64[] PROGMEM = "send IMAP command, SETACL"; static const char esp_mail_dbg_str_65[] PROGMEM = "send IMAP command, DELETEACL"; static const char esp_mail_dbg_str_66[] PROGMEM = "send IMAP command, MYRIGHTS"; static const char esp_mail_dbg_str_67[] PROGMEM = "send IMAP command, NAMESPACE"; static const char esp_mail_dbg_str_68[] PROGMEM = "selecting the "; static const char esp_mail_dbg_str_69[] PROGMEM = "appending message"; static const char esp_mail_dbg_str_70[] PROGMEM = "download attachment %d of %d"; static const char esp_mail_dbg_str_71[] PROGMEM = "download HTML message"; static const char esp_mail_dbg_str_72[] PROGMEM = "deleting the ACL"; static const char esp_mail_dbg_str_73[] PROGMEM = "message append successfully"; static const char esp_mail_dbg_str_74[] PROGMEM = "download plain TEXT message"; static const char esp_mail_dbg_str_75[] PROGMEM = "deleting message(s)"; static const char esp_mail_dbg_str_76[] PROGMEM = "check the capability"; static const char esp_mail_dbg_str_77[] PROGMEM = "get the ACL"; static const char esp_mail_dbg_str_78[] PROGMEM = "set the ACL"; static const char esp_mail_dbg_str_79[] PROGMEM = "get UID"; static const char esp_mail_dbg_str_80[] PROGMEM = "get Flags"; static const char esp_mail_dbg_str_81[] PROGMEM = "delete folder"; static const char esp_mail_dbg_str_82[] PROGMEM = "send IMAP command, ID"; static const char esp_mail_dbg_str_83[] PROGMEM = "send IMAP command, NOOP"; #endif ///////////////////////// // SMTP callback string static const char esp_mail_cb_str_1[] PROGMEM = "Connecting to SMTP server..."; static const char esp_mail_cb_str_2[] PROGMEM = "Sending STARTTLS command..."; #if defined(ENABLE_SMTP) static const char esp_mail_cb_str_3[] PROGMEM = "Sending greeting response..."; static const char esp_mail_cb_str_4[] PROGMEM = "Sending message header..."; static const char esp_mail_cb_str_5[] PROGMEM = "Sending message body..."; static const char esp_mail_cb_str_6[] PROGMEM = "Sending attachments..."; static const char esp_mail_cb_str_7[] PROGMEM = "Closing the session..."; static const char esp_mail_cb_str_8[] PROGMEM = "Sending inline data..."; static const char esp_mail_cb_str_9[] PROGMEM = "Sending Email..."; static const char esp_mail_cb_str_10[] PROGMEM = "Sending next Email..."; static const char esp_mail_cb_str_11[] PROGMEM = "Finishing the message sending..."; static const char esp_mail_cb_str_12[] PROGMEM = "SMTP server connected, wait for greeting..."; static const char esp_mail_cb_str_13[] PROGMEM = "Message sent successfully"; #endif ///////////////////////// // IMAP callback string static const char esp_mail_cb_str_14[] PROGMEM = "Logging in..."; // shared with SMTP static const char esp_mail_cb_str_15[] PROGMEM = "Connecting to IMAP server..."; #if defined(ENABLE_IMAP) static const char esp_mail_cb_str_16[] PROGMEM = "Reading the list of mailboxes..."; static const char esp_mail_cb_str_17[] PROGMEM = "Checking the capability..."; static const char esp_mail_cb_str_18[] PROGMEM = "Searching messages..."; static const char esp_mail_cb_str_19[] PROGMEM = "Downloading attachments..."; static const char esp_mail_cb_str_20[] PROGMEM = "Logging out..."; static const char esp_mail_cb_str_21[] PROGMEM = "Saving message header to file..."; static const char esp_mail_cb_str_22[] PROGMEM = "Get FLAG..."; static const char esp_mail_cb_str_23[] PROGMEM = "Removing FLAG..."; static const char esp_mail_cb_str_24[] PROGMEM = "Adding FLAG..."; static const char esp_mail_cb_str_25[] PROGMEM = "Get UID..."; static const char esp_mail_cb_str_26[] PROGMEM = "Setting FLAG..."; static const char esp_mail_cb_str_27[] PROGMEM = "Closing the mailbox folder..."; static const char esp_mail_cb_str_28[] PROGMEM = "Reading messages..."; static const char esp_mail_cb_str_29[] PROGMEM = "Listening to mailbox changes..."; static const char esp_mail_cb_str_30[] PROGMEM = "Listing the subscribed mailboxes..."; static const char esp_mail_cb_str_31[] PROGMEM = "Subscribe mailbox..."; static const char esp_mail_cb_str_32[] PROGMEM = "Unsubscribe mailbox..."; static const char esp_mail_cb_str_33[] PROGMEM = "Get quota root resource usage and limit..."; static const char esp_mail_cb_str_34[] PROGMEM = "Set quota root resource usage and limit..."; static const char esp_mail_cb_str_35[] PROGMEM = "Get the list of quota roots..."; static const char esp_mail_cb_str_36[] PROGMEM = "Get the ACL..."; static const char esp_mail_cb_str_37[] PROGMEM = "Setting the ACL..."; static const char esp_mail_cb_str_38[] PROGMEM = "Deleting the ACL..."; static const char esp_mail_cb_str_39[] PROGMEM = "Get my ACL..."; static const char esp_mail_cb_str_40[] PROGMEM = "Get namespace..."; static const char esp_mail_cb_str_41[] PROGMEM = "Enable capability..."; static const char esp_mail_cb_str_42[] PROGMEM = "Updating firmware..."; static const char esp_mail_cb_str_43[] PROGMEM = "Downloading messages..."; static const char esp_mail_cb_str_44[] PROGMEM = "Appending message..."; static const char esp_mail_cb_str_45[] PROGMEM = "Message append successfully"; static const char esp_mail_cb_str_46[] PROGMEM = "Finished reading Email"; static const char esp_mail_cb_str_47[] PROGMEM = "Log out completed"; static const char esp_mail_cb_str_48[] PROGMEM = "IMAP server connected"; static const char esp_mail_cb_str_49[] PROGMEM = "Polling established"; static const char esp_mail_cb_str_50[] PROGMEM = "Mailbox listening stopped"; static const char esp_mail_cb_str_51[] PROGMEM = "Open the mailbox folder..."; static const char esp_mail_cb_str_52[] PROGMEM = "Checking the capability..."; static const char esp_mail_cb_str_53[] PROGMEM = "Renaming folder..."; static const char esp_mail_cb_str_54[] PROGMEM = "UID is "; static const char esp_mail_cb_str_55[] PROGMEM = "Get Flags..."; static const char esp_mail_cb_str_56[] PROGMEM = "Deleting folder..."; static const char esp_mail_cb_str_57[] PROGMEM = "Deleting message(s)..."; static const char esp_mail_cb_str_58[] PROGMEM = "Copying message(s)..."; static const char esp_mail_cb_str_59[] PROGMEM = "Creating folder..."; static const char esp_mail_cb_str_60[] PROGMEM = "Moving message(s)..."; static const char esp_mail_cb_str_61[] PROGMEM = "Send client identification..."; static const char esp_mail_cb_str_62[] PROGMEM = "Send noop..."; #endif #endif ///////////////////////// // Mem error string #if defined(ENABLE_ERROR_STRING) || !defined(SILENT_MODE) #if defined(MBFS_FLASH_FS) || defined(MBFS_SD_FS) static const char esp_mail_error_mem_str_1[] PROGMEM = "flash Storage is not ready."; static const char esp_mail_error_mem_str_2[] PROGMEM = "SD Storage is not ready."; static const char esp_mail_error_mem_str_3[] PROGMEM = "file does not exist or can't access"; #endif static const char esp_mail_error_mem_str_4[] PROGMEM = "PSRAM was enabled but not detected."; #endif #if defined(ENABLE_ERROR_STRING) #if defined(MBFS_FLASH_FS) || defined(MBFS_SD_FS) static const char esp_mail_error_mem_str_5[] PROGMEM = "file is still opened."; static const char esp_mail_error_mem_str_6[] PROGMEM = "file not found."; static const char esp_mail_error_mem_str_7[] PROGMEM = "file I/O error"; #endif static const char esp_mail_error_mem_str_8[] PROGMEM = "out of memory"; static const char esp_mail_error_mem_str_9[] PROGMEM = "buffer overflow"; #endif #if defined(MB_ARDUINO_PICO) #if defined(ENABLE_ERROR_STRING) || !defined(SILENT_MODE) static const char esp_mail_error_mem_str_10[] PROGMEM = "please make sure that the size of flash filesystem is not 0 in Pico."; #endif #endif ///////////////////////// // Client error string #if !defined(SILENT_MODE) static const char esp_mail_error_client_str_1[] PROGMEM = "client and/or necessary callback functions are not yet assigned"; static const char esp_mail_error_client_str_2[] PROGMEM = "network connection callback is required"; static const char esp_mail_error_client_str_3[] PROGMEM = "network connection status callback is required"; static const char esp_mail_error_client_str_4[] PROGMEM = "NTP server time reading cannot begin when valid time is required because of no WiFi capability/activity detected."; static const char esp_mail_error_client_str_5[] PROGMEM = "Please set the library reference time manually using smtp.setSystemTime or imap.setSystemTime."; #endif ///////////////////////// // Network error string #if !defined(SILENT_MODE) static const char esp_mail_error_network_str_1[] PROGMEM = "unable to connect to server"; #if defined(ENABLE_ERROR_STRING) static const char esp_mail_error_network_str_2[] PROGMEM = "NTP server time reading timed out"; static const char esp_mail_error_network_str_3[] PROGMEM = "response read timed out"; static const char esp_mail_error_network_str_4[] PROGMEM = "not connected"; static const char esp_mail_error_network_str_5[] PROGMEM = "connection timeout"; static const char esp_mail_error_network_str_6[] PROGMEM = "connection closed"; static const char esp_mail_error_network_str_7[] PROGMEM = "connection refused"; static const char esp_mail_error_network_str_8[] PROGMEM = "data sending failed"; #endif #endif #if defined(ENABLE_ERROR_STRING) || !defined(SILENT_MODE) static const char esp_mail_error_network_str_9[] PROGMEM = "response read timed out"; #endif ///////////////////////// // SSL error string #if defined(ENABLE_ERROR_STRING) static const char esp_mail_error_ssl_str_1[] PROGMEM = "fail to set up the SSL/TLS structure"; #endif #if defined(ENABLE_ERROR_STRING) || !defined(SILENT_MODE) static const char esp_mail_error_ssl_str_2[] PROGMEM = "the alert SSL record received"; static const char esp_mail_error_ssl_str_3[] PROGMEM = "make sure the SSL/TLS handshake was done before sending the data"; #endif ///////////////////////// // Auth error string #if defined(ENABLE_ERROR_STRING) static const char esp_mail_error_auth_str_1[] PROGMEM = "the provided SASL authentication mechanism is not support"; static const char esp_mail_error_auth_str_2[] PROGMEM = "OAuth2.0 log in was disabled for this server"; static const char esp_mail_error_auth_str_3[] PROGMEM = "not yet log in"; #endif ///////////////////////// // Session error string #if defined(ENABLE_ERROR_STRING) static const char esp_mail_error_session_str_1[] PROGMEM = "the Session_Config object was not assigned"; #endif ///////////////////////// // Time error string #if defined(ENABLE_ERROR_STRING) static const char esp_mail_error_time_str_1[] PROGMEM = "library or device time was not set, see examples/SMTP/Set_Time.ino for manually time setting"; #endif ///////////////////////// // SMTP error string #if defined(ENABLE_SMTP) #if defined(ENABLE_ERROR_STRING) static const char esp_mail_error_smtp_str_1[] PROGMEM = "SMTP server greeting failed"; static const char esp_mail_error_smtp_str_2[] PROGMEM = "authentication failed"; static const char esp_mail_error_smtp_str_3[] PROGMEM = "login password is not valid"; static const char esp_mail_error_smtp_str_4[] PROGMEM = "send header failed"; static const char esp_mail_error_smtp_str_5[] PROGMEM = "send body failed"; static const char esp_mail_error_smtp_str_7[] PROGMEM = "sender Email address is not valid"; static const char esp_mail_error_smtp_str_8[] PROGMEM = "some of the recipient Email address is not valid"; static const char esp_mail_error_smtp_str_9[] PROGMEM = "set recipient failed"; static const char esp_mail_error_smtp_str_10[] PROGMEM = "send custom command failed"; static const char esp_mail_error_smtp_str_11[] PROGMEM = "XOAuth2 authenticate failed"; static const char esp_mail_error_smtp_str_12[] PROGMEM = "undefined error"; #endif #endif ///////////////////////// // IMAP error string #if defined(ENABLE_IMAP) #if defined(ENABLE_ERROR_STRING) static const char esp_mail_error_imap_str_1[] PROGMEM = "fail to list the mailboxes"; static const char esp_mail_error_imap_str_2[] PROGMEM = "fail to check the capabilities"; static const char esp_mail_error_imap_str_3[] PROGMEM = "fail to close the mailbox"; static const char esp_mail_error_imap_str_4[] PROGMEM = "fail to open the mailbox"; static const char esp_mail_error_imap_str_5[] PROGMEM = "some of the requested messages no longer exist"; static const char esp_mail_error_imap_str_6[] PROGMEM = "firmware update initialization failed"; static const char esp_mail_error_imap_str_7[] PROGMEM = "firmware update write failed"; static const char esp_mail_error_imap_str_8[] PROGMEM = "firmware update finalize failed"; #endif #if defined(ENABLE_ERROR_STRING) || !defined(SILENT_MODE) static const char esp_mail_error_imap_str_9[] PROGMEM = "no messages found for the specified search criteria"; static const char esp_mail_error_imap_str_10[] PROGMEM = "no search criteria provided, then fetching the latest message"; static const char esp_mail_error_imap_str_11[] PROGMEM = "no mailbox opened"; static const char esp_mail_error_imap_str_12[] PROGMEM = "no content"; static const char esp_mail_error_imap_str_13[] PROGMEM = "this feature was not supported"; static const char esp_mail_error_imap_str_14[] PROGMEM = "no message changed since (assigned) modsec"; static const char esp_mail_error_imap_str_15[] PROGMEM = "CONDSTORE was not supported or modsec was not supported for selected mailbox"; static const char esp_mail_error_imap_str_17[] PROGMEM = "could not parse command"; static const char esp_mail_error_imap_str_18[] PROGMEM = "server disconnected or returned error"; static const char esp_mail_error_imap_str_19[] PROGMEM = "authenticate failed"; static const char esp_mail_error_imap_str_20[] PROGMEM = "flags or keywords store failed"; static const char esp_mail_error_imap_str_21[] PROGMEM = "server is not support OAuth2 login"; #endif #endif ///////////////////////// // General use string static const char esp_mail_str_1[] PROGMEM = "127.0.0.1"; static const char esp_mail_str_2[] PROGMEM = " "; static const char esp_mail_str_3[] PROGMEM = "*"; static const char esp_mail_str_4[] PROGMEM = "High"; static const char esp_mail_str_5[] PROGMEM = "Normal"; static const char esp_mail_str_6[] PROGMEM = "Low"; static const char esp_mail_str_7[] PROGMEM = "="; static const char esp_mail_str_8[] PROGMEM = ","; static const char esp_mail_str_9[] PROGMEM = "--"; static const char esp_mail_str_10[] PROGMEM = "/"; static const char esp_mail_str_11[] PROGMEM = "\""; static const char esp_mail_str_12[] PROGMEM = "Error, "; static const char esp_mail_str_13[] PROGMEM = "msg.txt"; static const char esp_mail_str_14[] PROGMEM = "msg.html"; static const char esp_mail_str_15[] PROGMEM = "flash content message"; static const char esp_mail_str_16[] PROGMEM = "file content message"; static const char esp_mail_str_17[] PROGMEM = "cid:"; static const char esp_mail_str_18[] PROGMEM = "\r\n"; static const char esp_mail_str_19[] PROGMEM = "<"; static const char esp_mail_str_20[] PROGMEM = ">"; static const char esp_mail_str_21[] PROGMEM = "(\"name\" \"ESP Mail Client\" \"version\" \"%s\")"; static const char esp_mail_str_22[] PROGMEM = "message/rfc822"; static const char esp_mail_str_23[] PROGMEM = "upload"; static const char esp_mail_str_24[] PROGMEM = "%"; static const char esp_mail_str_25[] PROGMEM = "status code: "; static const char esp_mail_str_26[] PROGMEM = ", text: "; static const char esp_mail_str_27[] PROGMEM = "."; static const char esp_mail_str_28[] PROGMEM = "> C: "; static const char esp_mail_str_29[] PROGMEM = "< S: "; static const char esp_mail_str_30[] PROGMEM = "! E: "; static const char esp_mail_str_31[] PROGMEM = "! I: "; static const char esp_mail_str_32[] PROGMEM = "! W: "; static const char esp_mail_str_33[] PROGMEM = "#### "; static const char esp_mail_str_34[] PROGMEM = ":"; static const char esp_mail_str_35[] PROGMEM = ";"; static const char esp_mail_str_36[] PROGMEM = "{"; static const char esp_mail_str_37[] PROGMEM = "}"; static const char esp_mail_str_38[] PROGMEM = "("; static const char esp_mail_str_39[] PROGMEM = ")"; static const char esp_mail_str_40[] PROGMEM = "["; static const char esp_mail_str_41[] PROGMEM = "]"; static const char esp_mail_str_42[] PROGMEM = "\r\n"; static const char esp_mail_str_43[] PROGMEM = "\1\1"; static const char esp_mail_str_44[] PROGMEM = "{\"status\":"; static const char esp_mail_str_45[] PROGMEM = "user="; static const char esp_mail_str_46[] PROGMEM = "\1auth=Bearer "; static const char esp_mail_str_47[] PROGMEM = "0123456789ABCDEF"; static const char esp_mail_str_48[] PROGMEM = "<0.0>"; static const char esp_mail_str_49[] PROGMEM = "<0."; static const char esp_mail_str_50[] PROGMEM = "Search limit: %d\nFound %d messages\nShow %d messages"; static const char esp_mail_str_51[] PROGMEM = "1.0"; static const char esp_mail_str_52[] PROGMEM = "Fetch message %d, UID: %d"; static const char esp_mail_str_53[] PROGMEM = "Fetch message %d, Number: %d"; static const char esp_mail_str_54[] PROGMEM = "Attachments (%d)"; static const char esp_mail_str_55[] PROGMEM = "Free Heap: "; static const char esp_mail_str_56[] PROGMEM = "content-"; static const char esp_mail_str_58[] PROGMEM = "format=\"flowed\""; static const char esp_mail_str_59[] PROGMEM = "format=flowed"; static const char esp_mail_str_60[] PROGMEM = "delsp=\"yes\""; static const char esp_mail_str_61[] PROGMEM = "delsp=yes"; static const char esp_mail_str_62[] PROGMEM = "name"; static const char esp_mail_str_63[] PROGMEM = "+ "; static const char esp_mail_str_64[] PROGMEM = "boundary=\""; static const char esp_mail_str_65[] PROGMEM = "/header.json"; static const char esp_mail_str_66[] PROGMEM = "/header.txt"; static const char esp_mail_str_67[] PROGMEM = "{\"Filename\":\""; static const char esp_mail_str_68[] PROGMEM = "Index: "; static const char esp_mail_str_69[] PROGMEM = ",\"RFC822\":"; static const char esp_mail_str_70[] PROGMEM = "\r\n\r\nRFC822:\r\n"; static const char esp_mail_str_71[] PROGMEM = ",\"Attachments\":{\"Count\":"; static const char esp_mail_str_72[] PROGMEM = ",\"Files\":["; static const char esp_mail_str_73[] PROGMEM = "\r\n\r\nAttachments ("; static const char esp_mail_str_74[] PROGMEM = ")\r\n"; static const char esp_mail_str_75[] PROGMEM = "]}"; static const char esp_mail_str_76[] PROGMEM = "{\"Messages\":["; static const char esp_mail_str_77[] PROGMEM = ",\""; static const char esp_mail_str_78[] PROGMEM = "{\""; static const char esp_mail_str_79[] PROGMEM = "\":\""; static const char esp_mail_str_80[] PROGMEM = "{\"Renamed\":\""; static const char esp_mail_str_81[] PROGMEM = "\",\"Original\":\""; static const char esp_mail_str_82[] PROGMEM = "\"}]"; static const char esp_mail_str_83[] PROGMEM = "_"; static const char esp_mail_str_84[] PROGMEM = "message"; static const char esp_mail_str_85[] PROGMEM = "rfc822"; static const char esp_mail_str_86[] PROGMEM = "/msg"; static const char esp_mail_str_87[] PROGMEM = "/rfc822_msg"; static const char esp_mail_str_88[] PROGMEM = "polling established on "; static const char esp_mail_str_89[] PROGMEM = " folder..."; static const char esp_mail_str_90[] PROGMEM = "boundary"; static const char esp_mail_str_91[] PROGMEM = "\\Deleted"; static const char esp_mail_str_92[] PROGMEM = "Subject: %s"; static const char esp_mail_str_93[] PROGMEM = "Message sent success: %d"; static const char esp_mail_str_94[] PROGMEM = "Message sent failed: %d"; static const char esp_mail_str_95[] PROGMEM = "Status: %s"; static const char esp_mail_str_96[] PROGMEM = "Date/Time: %s"; static const char esp_mail_str_97[] PROGMEM = "Recipient: %s"; static const char esp_mail_str_98[] PROGMEM = "success"; static const char esp_mail_str_99[] PROGMEM = "failed"; #if defined(ENABLE_SMTP) static const char boundary_table[] PROGMEM = "=_abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; #endif #if defined(ENABLE_SMTP) || defined(ENABLE_IMAP) static const unsigned char b64_index_table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static void __attribute__((used)) appendDebugTag(MB_String &buf, esp_mail_debug_tag_type type, bool clear, PGM_P text = NULL) { if (clear) buf.clear(); switch (type) { case esp_mail_debug_tag_type_client: buf += esp_mail_str_28; /* "> C: "*/ break; case esp_mail_debug_tag_type_server: buf += esp_mail_str_29; /* "< S: " */ break; case esp_mail_debug_tag_type_error: buf += esp_mail_str_30; /* "! E: "*/ break; case esp_mail_debug_tag_type_info: buf += esp_mail_str_31; /* "! I: "*/ break; case esp_mail_debug_tag_type_warning: buf += esp_mail_str_32; /* "! W: "*/ break; default: break; } if (text != NULL) buf += text; } static void __attribute__((used)) yield_impl() { #if defined(ARDUINO_ESP8266_MAJOR) && defined(ARDUINO_ESP8266_MINOR) && defined(ARDUINO_ESP8266_REVISION) && ((ARDUINO_ESP8266_MAJOR == 3 && ARDUINO_ESP8266_MINOR >= 1) || ARDUINO_ESP8266_MAJOR > 3) esp_yield(); #else delay(0); #endif } // Print debug message w/wo new line to debug port static void __attribute__((used)) esp_mail_debug_print(PGM_P msg = "", bool newLine = true) { yield_impl(); if (newLine) ESP_MAIL_DEFAULT_DEBUG_PORT.println(msg); else ESP_MAIL_DEFAULT_DEBUG_PORT.print(msg); } static void __attribute__((used)) esp_mail_debug_print_tag(PGM_P msg, esp_mail_debug_tag_type type, bool newLine = true, bool showTag = true) { yield_impl(); MB_String s; if (showTag) appendDebugTag(s, type, false, msg); else s = msg; if (newLine) ESP_MAIL_DEFAULT_DEBUG_PORT.println(s.c_str()); else ESP_MAIL_DEFAULT_DEBUG_PORT.print(s.c_str()); } #endif typedef void (*ConnectionUpgradeRequestCallback)(void); typedef void (*NetworkConnectionRequestCallback)(void); typedef void (*NetworkDisconnectionRequestCallback)(void); typedef void (*NetworkStatusRequestCallback)(void); // Optional typedef void (*ConnectionRequestCallback)(const char *, int); #endif