uIP 1.0
|
00001 /** 00002 * \addtogroup apps 00003 * @{ 00004 */ 00005 00006 /** 00007 * \defgroup smtp Отправитель E-mail через SMTP 00008 * @{ 00009 * 00010 * Simple Mail Transfer Protocol (SMTP) определен в RFC821 как 00011 * стандартный способ отправки и передачи e-mail через Интернет. 00012 * Это простой пример реализации, показывающий, как создавать 00013 * работу протоколов в uIP. Пример может посылать e-mail, 00014 * но он не был тщатель но протестирован. 00015 */ 00016 00017 /** 00018 * \file 00019 * Пример реализации SMTP 00020 * \author Adam Dunkels <adam@dunkels.com> 00021 */ 00022 00023 /* 00024 * Copyright (c) 2004, Adam Dunkels. 00025 * Все права зарезервированы. * 00026 * Повторное распространение, использование в исходном и двоичном виде, 00027 * с модификацией или без - разрешается, если выполняются следующие 00028 * условия: 00029 * 1. Распространение исходного кода должно сохранить вышеуказанную пометку 00030 * копирайта, этот список условий и следующую правовую оговорку. 00031 * 2. Распространение исходного кода должно сохранить вышеуказанную пометку 00032 * копирайта, этот список условий и следующую правовую оговорку в 00033 * документации и/или других материалах, которые будут предоставлены 00034 * вместе с распространяемыми материалами. 00035 * 3. Имя автора не может использоваться, чтобы подтвердить или продвинуть 00036 * продукты, написанные с использованием этого программного обеспечения 00037 * без специального на то разрешения. 00038 * 00039 * ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ АВТОРОМ ``КАК ЕСТЬ'', БЕЗ 00040 * КАКОЙ-ЛИБО ЛЮБОЙ РАСШИРЕННОЙ ИЛИ ПОДРАЗУМЕВАЕМОЙ ГАРАНТИИ, ВКЛЮЧАЯ, 00041 * НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ГАРАНТИИ ВЫСОКОГО СПРОСА И ПРИГОДНОСТИ 00042 * ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. АВТОР НИ ПРИ КАКИХ УСЛОВИЯХ НЕ ОТВЕТСТВЕНЕН 00043 * ЗА ЛЮБЫЕ УБЫТКИ - ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ОБРАЗЦОВЫЕ 00044 * ИЛИ ПОСЛЕДОВАТЕЛЬНЫЕ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ТРЕБОВАНИЯ 00045 * ЗАМЕНЫ ТОВАРА ИЛИ СЕРВИСА; ПОТЕРИ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ВЫГОДЫ; 00046 * ИЛИ ПРЕКРАЩЕНИЕ БИЗНЕСА), ОДНАКО ВЫЗВАННЫЕ ПО ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, 00047 * ЛИБО В КОНТРАКТЕ, ПРЯМОЙ ОТВЕТСТВЕННОСТИ, ЛИБО В НАРУШЕНИИ ЗАКОННЫХ ПРАВ 00048 * (ВКЛЮЧАЯ ТАК ИЛИ ИНАЧЕ НЕБРЕЖНОСТЬ), ВОЗНИКАЮЩИЕ ВСЕГДА ИЗ ИСПОЛЬЗОВАНИЯ 00049 * ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫЛО ПРЕДУПРЕЖДЕНИЕ О ВОЗМОЖНОСТИ 00050 * ТАКОГО ПОВРЕЖДЕНИЯ. 00051 * 00052 * Этот файл является частью стека uIP TCP/IP.. 00053 * 00054 * Author: Adam Dunkels <adam@sics.se> 00055 * 00056 * $Id: smtp.c,v 1.4 2006/06/11 21:46:37 adam Exp $ 00057 */ 00058 #include "smtp.h" 00059 00060 #include "smtp-strings.h" 00061 #include "psock.h" 00062 #include "uip.h" 00063 00064 #include <string.h> 00065 00066 static struct smtp_state s; 00067 00068 static char *localhostname; 00069 static uip_ipaddr_t smtpserver; 00070 00071 #define ISO_nl 0x0a 00072 #define ISO_cr 0x0d 00073 00074 #define ISO_period 0x2e 00075 00076 #define ISO_2 0x32 00077 #define ISO_3 0x33 00078 #define ISO_4 0x34 00079 #define ISO_5 0x35 00080 00081 00082 /*---------------------------------------------------------------------------*/ 00083 static 00084 PT_THREAD(smtp_thread(void)) 00085 { 00086 PSOCK_BEGIN(&s.psock); 00087 00088 PSOCK_READTO(&s.psock, ISO_nl); 00089 00090 if(strncmp(s.inputbuffer, smtp_220, 3) != 0) { 00091 PSOCK_CLOSE(&s.psock); 00092 smtp_done(2); 00093 PSOCK_EXIT(&s.psock); 00094 } 00095 00096 PSOCK_SEND_STR(&s.psock, (char *)smtp_helo); 00097 PSOCK_SEND_STR(&s.psock, localhostname); 00098 PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); 00099 00100 PSOCK_READTO(&s.psock, ISO_nl); 00101 00102 if(s.inputbuffer[0] != ISO_2) { 00103 PSOCK_CLOSE(&s.psock); 00104 smtp_done(3); 00105 PSOCK_EXIT(&s.psock); 00106 } 00107 00108 PSOCK_SEND_STR(&s.psock, (char *)smtp_mail_from); 00109 PSOCK_SEND_STR(&s.psock, s.from); 00110 PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); 00111 00112 PSOCK_READTO(&s.psock, ISO_nl); 00113 00114 if(s.inputbuffer[0] != ISO_2) { 00115 PSOCK_CLOSE(&s.psock); 00116 smtp_done(4); 00117 PSOCK_EXIT(&s.psock); 00118 } 00119 00120 PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to); 00121 PSOCK_SEND_STR(&s.psock, s.to); 00122 PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); 00123 00124 PSOCK_READTO(&s.psock, ISO_nl); 00125 00126 if(s.inputbuffer[0] != ISO_2) { 00127 PSOCK_CLOSE(&s.psock); 00128 smtp_done(5); 00129 PSOCK_EXIT(&s.psock); 00130 } 00131 00132 if(s.cc != 0) { 00133 PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to); 00134 PSOCK_SEND_STR(&s.psock, s.cc); 00135 PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); 00136 00137 PSOCK_READTO(&s.psock, ISO_nl); 00138 00139 if(s.inputbuffer[0] != ISO_2) { 00140 PSOCK_CLOSE(&s.psock); 00141 smtp_done(6); 00142 PSOCK_EXIT(&s.psock); 00143 } 00144 } 00145 00146 PSOCK_SEND_STR(&s.psock, (char *)smtp_data); 00147 00148 PSOCK_READTO(&s.psock, ISO_nl); 00149 00150 if(s.inputbuffer[0] != ISO_3) { 00151 PSOCK_CLOSE(&s.psock); 00152 smtp_done(7); 00153 PSOCK_EXIT(&s.psock); 00154 } 00155 00156 PSOCK_SEND_STR(&s.psock, (char *)smtp_to); 00157 PSOCK_SEND_STR(&s.psock, s.to); 00158 PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); 00159 00160 if(s.cc != 0) { 00161 PSOCK_SEND_STR(&s.psock, (char *)smtp_cc); 00162 PSOCK_SEND_STR(&s.psock, s.cc); 00163 PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); 00164 } 00165 00166 PSOCK_SEND_STR(&s.psock, (char *)smtp_from); 00167 PSOCK_SEND_STR(&s.psock, s.from); 00168 PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); 00169 00170 PSOCK_SEND_STR(&s.psock, (char *)smtp_subject); 00171 PSOCK_SEND_STR(&s.psock, s.subject); 00172 PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); 00173 00174 PSOCK_SEND(&s.psock, s.msg, s.msglen); 00175 00176 PSOCK_SEND_STR(&s.psock, (char *)smtp_crnlperiodcrnl); 00177 00178 PSOCK_READTO(&s.psock, ISO_nl); 00179 if(s.inputbuffer[0] != ISO_2) { 00180 PSOCK_CLOSE(&s.psock); 00181 smtp_done(8); 00182 PSOCK_EXIT(&s.psock); 00183 } 00184 00185 PSOCK_SEND_STR(&s.psock, (char *)smtp_quit); 00186 smtp_done(SMTP_ERR_OK); 00187 PSOCK_END(&s.psock); 00188 } 00189 /*---------------------------------------------------------------------------*/ 00190 void 00191 smtp_appcall(void) 00192 { 00193 if(uip_closed()) { 00194 s.connected = 0; 00195 return; 00196 } 00197 if(uip_aborted() || uip_timedout()) { 00198 s.connected = 0; 00199 smtp_done(1); 00200 return; 00201 } 00202 smtp_thread(); 00203 } 00204 /*---------------------------------------------------------------------------*/ 00205 /** 00206 * Указывает сервер SMTP и имя хоста. 00207 * 00208 * Эта функция используется для конфигурирования модуля SMTP, при этом 00209 * задается сервер SMTP и имя хоста. 00210 * 00211 * \param lhostname Имя для хоста uIP. 00212 * 00213 * \param server Указатель на 4-байтный массив, представляющий адрес IP 00214 * конфигурируемого сервера SMTP. 00215 */ 00216 void 00217 smtp_configure(char *lhostname, void *server) 00218 { 00219 localhostname = lhostname; 00220 uip_ipaddr_copy(smtpserver, server); 00221 } 00222 /*---------------------------------------------------------------------------*/ 00223 /** 00224 * Отправляет e-mail. 00225 * 00226 * \param to Адрес получателя e-mail. 00227 * \param cc Адрес CC (отправка копии): получателей e-mail. 00228 * \param from Адрес e-mail отправителя. 00229 * \param subject Тема e-mail. 00230 * \param msg Само сообщение e-mail. 00231 * \param msglen The Длина сообщения e-mail. 00232 */ 00233 unsigned char 00234 smtp_send(char *to, char *cc, char *from, 00235 char *subject, char *msg, u16_t msglen) 00236 { 00237 struct uip_conn *conn; 00238 00239 conn = uip_connect(smtpserver, HTONS(25)); 00240 if(conn == NULL) { 00241 return 0; 00242 } 00243 s.connected = 1; 00244 s.to = to; 00245 s.cc = cc; 00246 s.from = from; 00247 s.subject = subject; 00248 s.msg = msg; 00249 s.msglen = msglen; 00250 00251 PSOCK_INIT(&s.psock, s.inputbuffer, sizeof(s.inputbuffer)); 00252 00253 return 1; 00254 } 00255 /*---------------------------------------------------------------------------*/ 00256 void 00257 smtp_init(void) 00258 { 00259 s.connected = 0; 00260 } 00261 /*---------------------------------------------------------------------------*/ 00262 /** @} */ 00263 /** @} */