xref: /nrf52832-nimble/rt-thread/components/net/lwip-2.1.0/src/include/lwip/apps/smtp.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero #ifndef LWIP_HDR_APPS_SMTP_H
2*10465441SEvalZero #define LWIP_HDR_APPS_SMTP_H
3*10465441SEvalZero 
4*10465441SEvalZero #ifdef __cplusplus
5*10465441SEvalZero extern "C" {
6*10465441SEvalZero #endif
7*10465441SEvalZero 
8*10465441SEvalZero #include "lwip/apps/smtp_opts.h"
9*10465441SEvalZero #include "lwip/err.h"
10*10465441SEvalZero #include "lwip/prot/iana.h"
11*10465441SEvalZero 
12*10465441SEvalZero /** The default TCP port used for SMTP */
13*10465441SEvalZero #define SMTP_DEFAULT_PORT         LWIP_IANA_PORT_SMTP
14*10465441SEvalZero /** The default TCP port used for SMTPS */
15*10465441SEvalZero #define SMTPS_DEFAULT_PORT        LWIP_IANA_PORT_SMTPS
16*10465441SEvalZero 
17*10465441SEvalZero /** Email successfully sent */
18*10465441SEvalZero #define SMTP_RESULT_OK            0
19*10465441SEvalZero /** Unknown error */
20*10465441SEvalZero #define SMTP_RESULT_ERR_UNKNOWN   1
21*10465441SEvalZero /** Connection to server failed */
22*10465441SEvalZero #define SMTP_RESULT_ERR_CONNECT   2
23*10465441SEvalZero /** Failed to resolve server hostname */
24*10465441SEvalZero #define SMTP_RESULT_ERR_HOSTNAME  3
25*10465441SEvalZero /** Connection unexpectedly closed by remote server */
26*10465441SEvalZero #define SMTP_RESULT_ERR_CLOSED    4
27*10465441SEvalZero /** Connection timed out (server didn't respond in time) */
28*10465441SEvalZero #define SMTP_RESULT_ERR_TIMEOUT   5
29*10465441SEvalZero /** Server responded with an unknown response code */
30*10465441SEvalZero #define SMTP_RESULT_ERR_SVR_RESP  6
31*10465441SEvalZero /** Out of resources locally */
32*10465441SEvalZero #define SMTP_RESULT_ERR_MEM       7
33*10465441SEvalZero 
34*10465441SEvalZero /** Prototype of an smtp callback function
35*10465441SEvalZero  *
36*10465441SEvalZero  * @param arg argument specified when initiating the email
37*10465441SEvalZero  * @param smtp_result result of the mail transfer (see defines SMTP_RESULT_*)
38*10465441SEvalZero  * @param srv_err if aborted by the server, this contains the error code received
39*10465441SEvalZero  * @param err an error returned by internal lwip functions, can help to specify
40*10465441SEvalZero  *            the source of the error but must not necessarily be != ERR_OK
41*10465441SEvalZero  */
42*10465441SEvalZero typedef void (*smtp_result_fn)(void *arg, u8_t smtp_result, u16_t srv_err, err_t err);
43*10465441SEvalZero 
44*10465441SEvalZero /** This structure is used as argument for smtp_send_mail_int(),
45*10465441SEvalZero  * which in turn can be used with tcpip_callback() to send mail
46*10465441SEvalZero  * from interrupt context, e.g. like this:
47*10465441SEvalZero  *    struct smtp_send_request *req; (to be filled)
48*10465441SEvalZero  *    tcpip_try_callback(smtp_send_mail_int, (void*)req);
49*10465441SEvalZero  *
50*10465441SEvalZero  * For member description, see parameter description of smtp_send_mail().
51*10465441SEvalZero  * When using with tcpip_callback, this structure has to stay allocated
52*10465441SEvalZero  * (e.g. using mem_malloc/mem_free) until its 'callback_fn' is called.
53*10465441SEvalZero  */
54*10465441SEvalZero struct smtp_send_request {
55*10465441SEvalZero   const char *from;
56*10465441SEvalZero   const char* to;
57*10465441SEvalZero   const char* subject;
58*10465441SEvalZero   const char* body;
59*10465441SEvalZero   smtp_result_fn callback_fn;
60*10465441SEvalZero   void* callback_arg;
61*10465441SEvalZero   /** If this is != 0, data is *not* copied into an extra buffer
62*10465441SEvalZero    * but used from the pointers supplied in this struct.
63*10465441SEvalZero    * This means less memory usage, but data must stay untouched until
64*10465441SEvalZero    * the callback function is called. */
65*10465441SEvalZero   u8_t static_data;
66*10465441SEvalZero };
67*10465441SEvalZero 
68*10465441SEvalZero 
69*10465441SEvalZero #if SMTP_BODYDH
70*10465441SEvalZero 
71*10465441SEvalZero #ifndef SMTP_BODYDH_BUFFER_SIZE
72*10465441SEvalZero #define SMTP_BODYDH_BUFFER_SIZE 256
73*10465441SEvalZero #endif /* SMTP_BODYDH_BUFFER_SIZE */
74*10465441SEvalZero 
75*10465441SEvalZero struct smtp_bodydh {
76*10465441SEvalZero   u16_t state;
77*10465441SEvalZero   u16_t length; /* Length of content in buffer */
78*10465441SEvalZero   char buffer[SMTP_BODYDH_BUFFER_SIZE]; /* buffer for generated content */
79*10465441SEvalZero #ifdef SMTP_BODYDH_USER_SIZE
80*10465441SEvalZero   u8_t user[SMTP_BODYDH_USER_SIZE];
81*10465441SEvalZero #endif /* SMTP_BODYDH_USER_SIZE */
82*10465441SEvalZero };
83*10465441SEvalZero 
84*10465441SEvalZero enum bdh_retvals_e {
85*10465441SEvalZero   BDH_DONE = 0,
86*10465441SEvalZero   BDH_WORKING
87*10465441SEvalZero };
88*10465441SEvalZero 
89*10465441SEvalZero /** Prototype of an smtp body callback function
90*10465441SEvalZero  * It receives a struct smtp_bodydh, and a buffer to write data,
91*10465441SEvalZero  * must return BDH_WORKING to be called again and BDH_DONE when
92*10465441SEvalZero  * it has finished processing. This one tries to fill one TCP buffer with
93*10465441SEvalZero  * data, your function will be repeatedly called until that happens; so if you
94*10465441SEvalZero  * know you'll be taking too long to serve your request, pause once in a while
95*10465441SEvalZero  * by writing length=0 to avoid hogging system resources
96*10465441SEvalZero  *
97*10465441SEvalZero  * @param arg argument specified when initiating the email
98*10465441SEvalZero  * @param smtp_bodydh state handling + buffer structure
99*10465441SEvalZero  */
100*10465441SEvalZero typedef int (*smtp_bodycback_fn)(void *arg, struct smtp_bodydh *bodydh);
101*10465441SEvalZero 
102*10465441SEvalZero err_t smtp_send_mail_bodycback(const char *from, const char* to, const char* subject,
103*10465441SEvalZero                      smtp_bodycback_fn bodycback_fn, smtp_result_fn callback_fn, void* callback_arg);
104*10465441SEvalZero 
105*10465441SEvalZero #endif /* SMTP_BODYDH */
106*10465441SEvalZero 
107*10465441SEvalZero 
108*10465441SEvalZero err_t smtp_set_server_addr(const char* server);
109*10465441SEvalZero void smtp_set_server_port(u16_t port);
110*10465441SEvalZero #if LWIP_ALTCP && LWIP_ALTCP_TLS
111*10465441SEvalZero struct altcp_tls_config;
112*10465441SEvalZero void smtp_set_tls_config(struct altcp_tls_config *tls_config);
113*10465441SEvalZero #endif
114*10465441SEvalZero err_t smtp_set_auth(const char* username, const char* pass);
115*10465441SEvalZero err_t smtp_send_mail(const char *from, const char* to, const char* subject, const char* body,
116*10465441SEvalZero                      smtp_result_fn callback_fn, void* callback_arg);
117*10465441SEvalZero err_t smtp_send_mail_static(const char *from, const char* to, const char* subject, const char* body,
118*10465441SEvalZero                      smtp_result_fn callback_fn, void* callback_arg);
119*10465441SEvalZero void smtp_send_mail_int(void *arg);
120*10465441SEvalZero #ifdef LWIP_DEBUG
121*10465441SEvalZero const char* smtp_result_str(u8_t smtp_result);
122*10465441SEvalZero #endif
123*10465441SEvalZero 
124*10465441SEvalZero #ifdef __cplusplus
125*10465441SEvalZero }
126*10465441SEvalZero #endif
127*10465441SEvalZero 
128*10465441SEvalZero #endif /* LWIP_HDR_APPS_SMTP_H */
129