uIP 1.0
C:/asm/STM32-ethernet/ENC28J60prj/uip-master/apps/smtp/smtp.c
См. документацию.
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 /** @} */