xref: /nrf52832-nimble/rt-thread/components/net/uip/apps/smtp/smtp.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /**
2*10465441SEvalZero  * \addtogroup apps
3*10465441SEvalZero  * @{
4*10465441SEvalZero  */
5*10465441SEvalZero 
6*10465441SEvalZero /**
7*10465441SEvalZero  * \defgroup smtp SMTP E-mail sender
8*10465441SEvalZero  * @{
9*10465441SEvalZero  *
10*10465441SEvalZero  * The Simple Mail Transfer Protocol (SMTP) as defined by RFC821 is
11*10465441SEvalZero  * the standard way of sending and transfering e-mail on the
12*10465441SEvalZero  * Internet. This simple example implementation is intended as an
13*10465441SEvalZero  * example of how to implement protocols in uIP, and is able to send
14*10465441SEvalZero  * out e-mail but has not been extensively tested.
15*10465441SEvalZero  */
16*10465441SEvalZero 
17*10465441SEvalZero /**
18*10465441SEvalZero  * \file
19*10465441SEvalZero  * SMTP example implementation
20*10465441SEvalZero  * \author Adam Dunkels <[email protected]>
21*10465441SEvalZero  */
22*10465441SEvalZero 
23*10465441SEvalZero /*
24*10465441SEvalZero  * Copyright (c) 2004, Adam Dunkels.
25*10465441SEvalZero  * All rights reserved.
26*10465441SEvalZero  *
27*10465441SEvalZero  * Redistribution and use in source and binary forms, with or without
28*10465441SEvalZero  * modification, are permitted provided that the following conditions
29*10465441SEvalZero  * are met:
30*10465441SEvalZero  * 1. Redistributions of source code must retain the above copyright
31*10465441SEvalZero  *    notice, this list of conditions and the following disclaimer.
32*10465441SEvalZero  * 2. Redistributions in binary form must reproduce the above copyright
33*10465441SEvalZero  *    notice, this list of conditions and the following disclaimer in the
34*10465441SEvalZero  *    documentation and/or other materials provided with the distribution.
35*10465441SEvalZero  * 3. Neither the name of the Institute nor the names of its contributors
36*10465441SEvalZero  *    may be used to endorse or promote products derived from this software
37*10465441SEvalZero  *    without specific prior written permission.
38*10465441SEvalZero  *
39*10465441SEvalZero  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
40*10465441SEvalZero  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41*10465441SEvalZero  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
42*10465441SEvalZero  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
43*10465441SEvalZero  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
44*10465441SEvalZero  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
45*10465441SEvalZero  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46*10465441SEvalZero  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
47*10465441SEvalZero  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
48*10465441SEvalZero  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
49*10465441SEvalZero  * SUCH DAMAGE.
50*10465441SEvalZero  *
51*10465441SEvalZero  * This file is part of the uIP TCP/IP stack.
52*10465441SEvalZero  *
53*10465441SEvalZero  * Author: Adam Dunkels <[email protected]>
54*10465441SEvalZero  *
55*10465441SEvalZero  * $Id: smtp.c,v 1.4 2006/06/11 21:46:37 adam Exp $
56*10465441SEvalZero  */
57*10465441SEvalZero #include "smtp.h"
58*10465441SEvalZero 
59*10465441SEvalZero #include "smtp-strings.h"
60*10465441SEvalZero #include "psock.h"
61*10465441SEvalZero #include "uip.h"
62*10465441SEvalZero 
63*10465441SEvalZero #include <string.h>
64*10465441SEvalZero 
65*10465441SEvalZero static struct smtp_state s;
66*10465441SEvalZero 
67*10465441SEvalZero static char *localhostname;
68*10465441SEvalZero static uip_ipaddr_t smtpserver;
69*10465441SEvalZero 
70*10465441SEvalZero #define ISO_nl 0x0a
71*10465441SEvalZero #define ISO_cr 0x0d
72*10465441SEvalZero 
73*10465441SEvalZero #define ISO_period 0x2e
74*10465441SEvalZero 
75*10465441SEvalZero #define ISO_2  0x32
76*10465441SEvalZero #define ISO_3  0x33
77*10465441SEvalZero #define ISO_4  0x34
78*10465441SEvalZero #define ISO_5  0x35
79*10465441SEvalZero 
80*10465441SEvalZero 
81*10465441SEvalZero /*---------------------------------------------------------------------------*/
82*10465441SEvalZero static
PT_THREAD(smtp_thread (void))83*10465441SEvalZero PT_THREAD(smtp_thread(void))
84*10465441SEvalZero {
85*10465441SEvalZero   PSOCK_BEGIN(&s.psock);
86*10465441SEvalZero 
87*10465441SEvalZero   PSOCK_READTO(&s.psock, ISO_nl);
88*10465441SEvalZero 
89*10465441SEvalZero   if(strncmp(s.inputbuffer, smtp_220, 3) != 0) {
90*10465441SEvalZero     PSOCK_CLOSE(&s.psock);
91*10465441SEvalZero     smtp_done(2);
92*10465441SEvalZero     PSOCK_EXIT(&s.psock);
93*10465441SEvalZero   }
94*10465441SEvalZero 
95*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_helo);
96*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, localhostname);
97*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
98*10465441SEvalZero 
99*10465441SEvalZero   PSOCK_READTO(&s.psock, ISO_nl);
100*10465441SEvalZero 
101*10465441SEvalZero   if(s.inputbuffer[0] != ISO_2) {
102*10465441SEvalZero     PSOCK_CLOSE(&s.psock);
103*10465441SEvalZero     smtp_done(3);
104*10465441SEvalZero     PSOCK_EXIT(&s.psock);
105*10465441SEvalZero   }
106*10465441SEvalZero 
107*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_mail_from);
108*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, s.from);
109*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
110*10465441SEvalZero 
111*10465441SEvalZero   PSOCK_READTO(&s.psock, ISO_nl);
112*10465441SEvalZero 
113*10465441SEvalZero   if(s.inputbuffer[0] != ISO_2) {
114*10465441SEvalZero     PSOCK_CLOSE(&s.psock);
115*10465441SEvalZero     smtp_done(4);
116*10465441SEvalZero     PSOCK_EXIT(&s.psock);
117*10465441SEvalZero   }
118*10465441SEvalZero 
119*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
120*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, s.to);
121*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
122*10465441SEvalZero 
123*10465441SEvalZero   PSOCK_READTO(&s.psock, ISO_nl);
124*10465441SEvalZero 
125*10465441SEvalZero   if(s.inputbuffer[0] != ISO_2) {
126*10465441SEvalZero     PSOCK_CLOSE(&s.psock);
127*10465441SEvalZero     smtp_done(5);
128*10465441SEvalZero     PSOCK_EXIT(&s.psock);
129*10465441SEvalZero   }
130*10465441SEvalZero 
131*10465441SEvalZero   if(s.cc != 0) {
132*10465441SEvalZero     PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
133*10465441SEvalZero     PSOCK_SEND_STR(&s.psock, s.cc);
134*10465441SEvalZero     PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
135*10465441SEvalZero 
136*10465441SEvalZero     PSOCK_READTO(&s.psock, ISO_nl);
137*10465441SEvalZero 
138*10465441SEvalZero     if(s.inputbuffer[0] != ISO_2) {
139*10465441SEvalZero       PSOCK_CLOSE(&s.psock);
140*10465441SEvalZero       smtp_done(6);
141*10465441SEvalZero       PSOCK_EXIT(&s.psock);
142*10465441SEvalZero     }
143*10465441SEvalZero   }
144*10465441SEvalZero 
145*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_data);
146*10465441SEvalZero 
147*10465441SEvalZero   PSOCK_READTO(&s.psock, ISO_nl);
148*10465441SEvalZero 
149*10465441SEvalZero   if(s.inputbuffer[0] != ISO_3) {
150*10465441SEvalZero     PSOCK_CLOSE(&s.psock);
151*10465441SEvalZero     smtp_done(7);
152*10465441SEvalZero     PSOCK_EXIT(&s.psock);
153*10465441SEvalZero   }
154*10465441SEvalZero 
155*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_to);
156*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, s.to);
157*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
158*10465441SEvalZero 
159*10465441SEvalZero   if(s.cc != 0) {
160*10465441SEvalZero     PSOCK_SEND_STR(&s.psock, (char *)smtp_cc);
161*10465441SEvalZero     PSOCK_SEND_STR(&s.psock, s.cc);
162*10465441SEvalZero     PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
163*10465441SEvalZero   }
164*10465441SEvalZero 
165*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_from);
166*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, s.from);
167*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
168*10465441SEvalZero 
169*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_subject);
170*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, s.subject);
171*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
172*10465441SEvalZero 
173*10465441SEvalZero   PSOCK_SEND(&s.psock, s.msg, s.msglen);
174*10465441SEvalZero 
175*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnlperiodcrnl);
176*10465441SEvalZero 
177*10465441SEvalZero   PSOCK_READTO(&s.psock, ISO_nl);
178*10465441SEvalZero   if(s.inputbuffer[0] != ISO_2) {
179*10465441SEvalZero     PSOCK_CLOSE(&s.psock);
180*10465441SEvalZero     smtp_done(8);
181*10465441SEvalZero     PSOCK_EXIT(&s.psock);
182*10465441SEvalZero   }
183*10465441SEvalZero 
184*10465441SEvalZero   PSOCK_SEND_STR(&s.psock, (char *)smtp_quit);
185*10465441SEvalZero   smtp_done(SMTP_ERR_OK);
186*10465441SEvalZero   PSOCK_END(&s.psock);
187*10465441SEvalZero }
188*10465441SEvalZero /*---------------------------------------------------------------------------*/
189*10465441SEvalZero void
smtp_appcall(void)190*10465441SEvalZero smtp_appcall(void)
191*10465441SEvalZero {
192*10465441SEvalZero   if(uip_closed()) {
193*10465441SEvalZero     s.connected = 0;
194*10465441SEvalZero     return;
195*10465441SEvalZero   }
196*10465441SEvalZero   if(uip_aborted() || uip_timedout()) {
197*10465441SEvalZero     s.connected = 0;
198*10465441SEvalZero     smtp_done(1);
199*10465441SEvalZero     return;
200*10465441SEvalZero   }
201*10465441SEvalZero   smtp_thread();
202*10465441SEvalZero }
203*10465441SEvalZero /*---------------------------------------------------------------------------*/
204*10465441SEvalZero /**
205*10465441SEvalZero  * Specificy an SMTP server and hostname.
206*10465441SEvalZero  *
207*10465441SEvalZero  * This function is used to configure the SMTP module with an SMTP
208*10465441SEvalZero  * server and the hostname of the host.
209*10465441SEvalZero  *
210*10465441SEvalZero  * \param lhostname The hostname of the uIP host.
211*10465441SEvalZero  *
212*10465441SEvalZero  * \param server A pointer to a 4-byte array representing the IP
213*10465441SEvalZero  * address of the SMTP server to be configured.
214*10465441SEvalZero  */
215*10465441SEvalZero void
smtp_configure(char * lhostname,void * server)216*10465441SEvalZero smtp_configure(char *lhostname, void *server)
217*10465441SEvalZero {
218*10465441SEvalZero   localhostname = lhostname;
219*10465441SEvalZero   uip_ipaddr_copy(smtpserver, server);
220*10465441SEvalZero }
221*10465441SEvalZero /*---------------------------------------------------------------------------*/
222*10465441SEvalZero /**
223*10465441SEvalZero  * Send an e-mail.
224*10465441SEvalZero  *
225*10465441SEvalZero  * \param to The e-mail address of the receiver of the e-mail.
226*10465441SEvalZero  * \param cc The e-mail address of the CC: receivers of the e-mail.
227*10465441SEvalZero  * \param from The e-mail address of the sender of the e-mail.
228*10465441SEvalZero  * \param subject The subject of the e-mail.
229*10465441SEvalZero  * \param msg The actual e-mail message.
230*10465441SEvalZero  * \param msglen The length of the e-mail message.
231*10465441SEvalZero  */
232*10465441SEvalZero unsigned char
smtp_send(char * to,char * cc,char * from,char * subject,char * msg,u16_t msglen)233*10465441SEvalZero smtp_send(char *to, char *cc, char *from,
234*10465441SEvalZero 	  char *subject, char *msg, u16_t msglen)
235*10465441SEvalZero {
236*10465441SEvalZero   struct uip_conn *conn;
237*10465441SEvalZero 
238*10465441SEvalZero   conn = uip_connect(smtpserver, HTONS(25));
239*10465441SEvalZero   if(conn == NULL) {
240*10465441SEvalZero     return 0;
241*10465441SEvalZero   }
242*10465441SEvalZero   s.connected = 1;
243*10465441SEvalZero   s.to = to;
244*10465441SEvalZero   s.cc = cc;
245*10465441SEvalZero   s.from = from;
246*10465441SEvalZero   s.subject = subject;
247*10465441SEvalZero   s.msg = msg;
248*10465441SEvalZero   s.msglen = msglen;
249*10465441SEvalZero 
250*10465441SEvalZero   PSOCK_INIT(&s.psock, s.inputbuffer, sizeof(s.inputbuffer));
251*10465441SEvalZero 
252*10465441SEvalZero   return 1;
253*10465441SEvalZero }
254*10465441SEvalZero /*---------------------------------------------------------------------------*/
255*10465441SEvalZero void
smtp_init(void)256*10465441SEvalZero smtp_init(void)
257*10465441SEvalZero {
258*10465441SEvalZero   s.connected = 0;
259*10465441SEvalZero }
260*10465441SEvalZero /*---------------------------------------------------------------------------*/
261*10465441SEvalZero /** @} */
262*10465441SEvalZero /** @} */
263