Bladeren bron

改名smtp为mail,添加libcurl接口,准备测试

guohui 1 jaar geleden
bovenliggende
commit
567bcf128c

+ 2 - 2
pro/CMakeLists.txt

@@ -82,7 +82,7 @@ set(PDU_SRC_LIST
 	${PROJECT_SOURCE_DIR}/src/upg.c
 	${PROJECT_SOURCE_DIR}/src/file.c
 	${PROJECT_SOURCE_DIR}/src/lock.c
-	${PROJECT_SOURCE_DIR}/src/smtp.c
+	${PROJECT_SOURCE_DIR}/src/mail.c
 	${PROJECT_SOURCE_DIR}/src/mqtt.c
 	${PROJECT_SOURCE_DIR}/src/netswitch.c
 	${PROJECT_SOURCE_DIR}/src/main.c
@@ -105,7 +105,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${NO_WARNNING_FLAGS} -Werror")
 
 
 add_executable(smartPDU ${PDU_SRC_LIST})
-target_link_libraries(smartPDU -lpcre -lsqlite3 -lssl -lcrypto -lmodbus -lc -ldl -lpthread -lnetsnmp -lnetsnmpagent -lrt)
+target_link_libraries(smartPDU -lpcre -lsqlite3 -lssl -lcrypto -lcurl -lmodbus -lc -ldl -lpthread -lnetsnmp -lnetsnmpagent -lrt)
 
 
 set(SRC_DIR ${PROJECT_BINARY_DIR})

+ 2 - 2
pro/config/cfg.h

@@ -26,8 +26,8 @@
 #define PRJ_TEST_AC_I3_O1
 
 
-#define USE_SMTP
-#define SMTP_SEND_BUILTIN
+#define USE_MAIL
+#define MAIL_SEND_BUILTIN
 
 #define USE_MQTT
 #define MQTT_SERVER_BUILTIN

+ 4 - 3
pro/src/app.c

@@ -17,7 +17,7 @@
 #include "sys.h"
 #include "cfg.h"
 #include "lock.h"
-#include "smtp.h"
+#include "mail.h"
 #include "mqtt.h"
 #include "netswitch.h"
 #include "breaker_detection.h"
@@ -236,7 +236,7 @@ void* power_thread(void* arg)
         }
         //usleep(300000);
     }
-    
+
     //采集线程
     while (h->quit==0)
     {
@@ -2164,6 +2164,7 @@ int app_init(void)
         log_d("get breaker info ok.");
 
     _globalDeviceManager->dev_samp_flag = true;
+
     thread_start(THREAD_ID_POWER, _globalDeviceManager);
     thread_start(THREAD_ID_SENSOR, _globalDeviceManager);
     thread_start(THREAD_ID_SHMW, _globalDeviceManager);
@@ -2213,7 +2214,7 @@ int app_init(void)
 
     cascade_init();
     netswitch_init();
-    smtp_init();
+    mail_init();
     mqtt_init();
 #endif
 

+ 15 - 37
pro/src/appweb_handle.c

@@ -248,10 +248,7 @@ static int file_io(void *conn, int ftype, int io)
 
         case FILE_ALARM_CFG:
         {
-            if(io==FILE_IMPORT) {
-                //upload_file(path);
-            }
-            else {
+            if(io==FILE_EXPORT) {
                 //download_file(path);
             }
         }
@@ -259,10 +256,7 @@ static int file_io(void *conn, int ftype, int io)
 
         case FILE_SENSOR_CFG:
         {
-            if(io==FILE_IMPORT) {
-                //upload_file(path);
-            }
-            else {
+            if(io==FILE_EXPORT) {
                 //download_file(path);
             }
         }
@@ -270,10 +264,7 @@ static int file_io(void *conn, int ftype, int io)
 
         case FILE_POWER_ALL:
         {
-            if(io==FILE_IMPORT) {
-                //upload_file(path);
-            }
-            else {
+            if(io==FILE_EXPORT) {
                 char *ftmp="overall.csv";
                 r = power_to_csv(ftmp, &wh->stt, ftype);
                 if(r==0) {
@@ -286,10 +277,7 @@ static int file_io(void *conn, int ftype, int io)
 
         case FILE_POWER_CHN:
         {
-            if(io==FILE_IMPORT) {
-                //upload_file(path);
-            }
-            else {
+            if(io==FILE_EXPORT) {
                 char *ftmp="channel.csv";
                 r = power_to_csv(ftmp, &wh->stt, ftype);
                 if(r==0) {
@@ -302,10 +290,7 @@ static int file_io(void *conn, int ftype, int io)
         
         case FILE_LOG_RUN:
         {
-            if(io==FILE_IMPORT) {
-                //upload_file(path);
-            }
-            else {
+            if(io==FILE_EXPORT) {
                 //download_file(path);
             }
         }
@@ -313,10 +298,7 @@ static int file_io(void *conn, int ftype, int io)
 
         case FILE_LOG_OPERA:
         {
-            if(io==FILE_IMPORT) {
-                //upload_file(path);
-            }
-            else {
+            if(io==FILE_EXPORT) {
                 //download_file(path);
             }
         }
@@ -324,10 +306,7 @@ static int file_io(void *conn, int ftype, int io)
 
         case FILE_LOG_ALARM:
         {
-            if(io==FILE_IMPORT) {
-                //upload_file(path);
-            }
-            else {
+            if(io==FILE_EXPORT) {
                 //download_file(path);
             }
         }
@@ -3803,14 +3782,13 @@ static void serviceManagement(void *conn)
     
     if(strcmp(_serviceManageRequestInfo.type,"listSmtpQuery")==0)
     {
-         ack_str = service_smtp_ack_to_json(&gdm->smtpInfo);
+         ack_str = service_mail_ack_to_json(&gdm->mailInfo);
     }   
     else if(strcmp(_serviceManageRequestInfo.type,"SmtpSave")==0)
     {
-        //_SMTP_ServerRequestInfo
-        smtp_send_t *send=&gdm->smtpInfo.send;
-        smtp_recv_t *recv=gdm->smtpInfo.recv;
-        _SMTP_ServerRequestInfo *info=&_serviceManageRequestInfo._smtp_info;
+        mail_send_t *send=&gdm->mailInfo.send;
+        mail_recv_t *recv=gdm->mailInfo.recv;
+        _MAIL_ServerRequestInfo *info=&_serviceManageRequestInfo._smtp_info;
 
         if(info->mode) {
             int save_flag=0;
@@ -3839,15 +3817,15 @@ static void serviceManagement(void *conn)
                 }
             }
             else {
-                memset(send, 0, sizeof(smtp_send_t));  save_flag = 1;
+                memset(send, 0, sizeof(mail_send_t));  save_flag = 1;
             }
             
             if(save_flag) {
-                dev_smtp_update_send(gdm->db, send);
+                dev_mail_update_send(gdm->db, send);
             }
         }
 
-        for(int i=0; i<SMTP_RECV_MAX; i++) {
+        for(int i=0; i<MAIL_RECV_MAX; i++) {
             recv[i].idx = i;
            if(info->recvAccount[i]) {
                 recv[i].use = 1;
@@ -3857,7 +3835,7 @@ static void serviceManagement(void *conn)
                 recv[i].use = 0;
                 strcpy(recv[i].account,"");
             }
-            dev_smtp_update_recv(gdm->db, &recv[i]);
+            dev_mail_update_recv(gdm->db, &recv[i]);
         }
     }
 #ifdef USE_MQTT

+ 29 - 20
pro/src/common.c

@@ -278,75 +278,84 @@ int set_local_timeandzone(struct tm* t, int zone)
 
     switch(zone)
     {
-        case -11:   //Midway
+        case -11:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/Pacific/Midway /etc/localtime");
             break;
-        case -10:   //夏威夷
+        case -10:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/HST /etc/localtime");
             break;
-        case -9:    //Adak
+        case -9:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/America/Adak /etc/localtime");
             break;
-        case -8:    //Los Angeles
+        case -8:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/America/Boise /etc/localtime");
             break;
-        case -7:    //MST
+        case -7:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/MST /etc/localtime");
             break;
-        case -6:    //Chicago
+        case -6:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime");
             break;
-        case -5:    //Detroit
+        case -5:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/America/Detroit /etc/localtime");
             break;
-        case -4:    //Halifax
+        case -4:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/America/Halifax /etc/localtime");
             break;
-        case -3:    //Maceio
+        case -3:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/America/Maceio /etc/localtime");
             break;
-        case -2:    //Noronha
+        case -2:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/America/Noronha /etc/localtime");
             break;
-        case -1:    //Scoresbysund
+        case -1:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/America/Scoresbysund /etc/localtime");
             break;
-        case 0:     //Mexico_City
-            sprintf(buf, "ln -sf /usr/share/zoneinfo/America/Mexico_City /etc/localtime");
+        case 0:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Europe/London /etc/localtime");
             break;
-        case 1:     //Belgrade
-            sprintf(buf, "ln -sf /usr/share/zoneinfo/Europe/Belgrade /etc/localtime");
+        case 1:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime");
             break;
         case 2:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Europe/Athens /etc/localtime");
             break;
         case 3:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime");
             break;
         case 4:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Asia/Amman /etc/localtime");
             break;
         case 5:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime");
             break;
         case 6:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Asia/Dhaka /etc/localtime");
             break;
         case 7:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime");
             break;
         case 8:
-            sprintf(buf, "ln -sf /usr/share/zoneinfo/Asia/Chongqing /etc/localtime");
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Asia/Beijing /etc/localtime");
             break;
         case 9:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime");
             break;
         case 10:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/Australia/Sydney /etc/localtime");
             break;
         case 11:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/XXX /etc/localtime");
             break;
         case 12:
+            sprintf(buf, "ln -sf /usr/share/zoneinfo/XXX /etc/localtime");
             break;
     }
-    system("ln -sf /usr/share/zoneinfo/UTC /etc/localtime");
+    //system("ln -sf /usr/share/zoneinfo/UTC /etc/localtime");
 
-    //t += zone * 3600;
+    //time_t now=time(NULL)+zone*3600;
     //struct tm* ptm = localtime(&t);
-    memset(buf, 0, sizeof(buf));
-    //sprintf(buf, "echo \"Hello\"");
+    //memset(buf, 0, sizeof(buf));
     sprintf(buf, "date -s \"%04d-%02d-%02d %02d:%02d:%02d\" && hwclock -w -f /dev/rtc0 ", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
     log_i("%s",buf);
     system(buf);

+ 9 - 9
pro/src/common.h

@@ -631,7 +631,7 @@ typedef struct
     char                sensor_port_name[32]                       ;//传感器端口号
     int                 sensor_baud                                ;//波特率
     char                sensor_addr                                ;//modbus地址
-    int                sensor_status                              ;//传感器状态
+    int                 sensor_status                              ;//传感器状态
     char                sensor_val_count                           ;//传感器值个数
     int                 sensor_node_number                         ;//节点号
     GlobalSensorInfo Cur_sensor_info ;
@@ -665,13 +665,13 @@ typedef struct
 ///////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////
 
-//SMTP管理
+//MAIL管理
 typedef struct
 {
     int                 idx;
     int                 use;
     char                account[64];
-}smtp_recv_t;
+}mail_recv_t;
 typedef struct 
 {
     int                 id;
@@ -681,14 +681,14 @@ typedef struct
     char                server[64]; 			        //服务器
     char                port[10];    		            //端口
     char                auth[16];    			        //认证方式  
-}smtp_send_t;
+}mail_send_t;
 typedef struct
 {
-    smtp_send_t         send;
+    mail_send_t         send;
 
-    #define SMTP_RECV_MAX  10
-    smtp_recv_t         recv[SMTP_RECV_MAX];      //接收账号列表
-}smtp_info_t;
+    #define MAIL_RECV_MAX  10
+    mail_recv_t         recv[MAIL_RECV_MAX];      //接收账号列表
+}mail_info_t;
 
 enum {
     MQTT_EMQX=0,
@@ -1041,7 +1041,7 @@ typedef struct
     cascade_triphasic_mmap_t *triphasic_mmap;	
 	GlobalBreakerManager g_new_global_breaker;
 
-    smtp_info_t          smtpInfo;
+    mail_info_t          mailInfo;
     mqtt_info_t          mqttInfo;
     Modbus_Manger_Tcp *md_tcp;
 }GlobalDeviceManager;

+ 1 - 1
pro/src/dflt.c

@@ -47,7 +47,7 @@ GlobalDeviceInfo DFLT_PARAS={
 };
 
 
-smtp_send_t DFLT_SMTP_SEND={
+mail_send_t DFLT_MAIL_SEND={
 
     .mode = 1,
     .server = "smtp.163.com",

+ 5 - 5
pro/src/json_handle.c

@@ -4506,7 +4506,7 @@ cJSON* json_to_service_manage(const char* str,_ServiceManageRequestInfo* _servic
     ///SMTP上传参数
     if(strcmp(_serviceManageRequestInfo->type,"SmtpSave")==0)
     {
-        _SMTP_ServerRequestInfo *info=&_serviceManageRequestInfo->_smtp_info;
+        _MAIL_ServerRequestInfo *info=&_serviceManageRequestInfo->_smtp_info;
 
         cJSON* cjson_mode = cJSON_GetObjectItem(cjson,"mode");
         cJSON* cjson_account = cJSON_GetObjectItem(cjson,"zh");  
@@ -5148,12 +5148,12 @@ char* service_snmp_ack_to_json(SNMPManager* sm)
     return str;
 }
 
-char* service_smtp_ack_to_json(smtp_info_t* info)
+char* service_mail_ack_to_json(mail_info_t* info)
 {
     int idx=0;
     char* str = NULL;
-    smtp_send_t *send=&info->send;
-    smtp_recv_t *recv=info->recv;
+    mail_send_t *send=&info->send;
+    mail_recv_t *recv=info->recv;
     
     // 创建 JSON 对象
     cJSON* root = cJSON_CreateObject();   
@@ -5172,7 +5172,7 @@ char* service_smtp_ack_to_json(smtp_info_t* info)
     cJSON_AddStringToObject(data_filed,"rzfs", send->auth);
     
     cJSON* array=NULL;
-    for(int i=0; i<SMTP_RECV_MAX; i++) {
+    for(int i=0; i<MAIL_RECV_MAX; i++) {
         if(recv[i].use) {
             cJSON* tmp = cJSON_CreateObject();
             if(tmp) {

+ 4 - 4
pro/src/json_handle.h

@@ -352,8 +352,8 @@ typedef struct
     char* server;
     char* port;
     char* auth;
-    char* recvAccount[SMTP_RECV_MAX];
-}_SMTP_ServerRequestInfo;
+    char* recvAccount[MAIL_RECV_MAX];
+}_MAIL_ServerRequestInfo;
 
 typedef struct 
 {
@@ -448,7 +448,7 @@ typedef struct
     char* user_token;
     char* type;
     _MQTT_ServerRequestInfo _mqtt_info;
-    _SMTP_ServerRequestInfo _smtp_info ;
+    _MAIL_ServerRequestInfo _smtp_info ;
     _SNMP_ServerRequestInfo _snmp_info ;
     _SNMPTRAP_ServerRequestInfo _snmp_trap_info;
     _NTP_ServiceRequestInfo _ntp_info ;
@@ -619,7 +619,7 @@ char* service_ds_all_ack_to_json(char* pDate,char* Name,char* nchID,GlobalPowerM
 char* service_sx_ack_to_json(int product_id, GlobalPowerManger * __PowerManage_t);
 char* service_ntp_ack_to_json(NTPManager* __NTPManager_t);
 char* service_snmp_ack_to_json(SNMPManager* sm);
-char* service_smtp_ack_to_json(smtp_info_t* info);
+char* service_mail_ack_to_json(mail_info_t* info);
 char* service_mqtt_ack_to_json(mqtt_info_t* info);
 char* mqtt_status_to_json(int mode);
 

+ 217 - 112
pro/src/smtp.c

@@ -1,31 +1,162 @@
-/**
- * @file
- * @brief SMTP client library.
- * @author James Humphrey (mail@somnisoft.com)
- * @version 1.00
- *
- * This SMTP client library allows the user to send emails to an SMTP server.
- * The user can include custom headers and MIME attachments.
- *
- * This software has been placed into the public domain using CC0.
- */
+#include <stdint.h>
+#include <pthread.h>
+#include "cfg.h"
+#include "common.h"
+#include "thread.h"
+#include "xlist.h"
+#include "elog.h"
+#include "lock.h"
+#include "sqlite_handle.h"
 
-/**
- * @mainpage smtp-client
- *
- * This section contains documentation generated directly from the source
- * code.
- *
- * To view the repository details, visit the main smtp-client page at
- * <a href='https://www.somnisoft.com/smtp-client'>
- * www.somnisoft.com/smtp-client
- * </a>.
- */
 
-#include "cfg.h"
-#include <pthread.h>
+//#define USE_LIBCURL
+
+#if 1
+    #define LOGD            log_d
+    #define LOGE            log_e
+    #define LOGW            log_w
+#else
+    #define LOGD            printf
+    #define LOGE            printf
+    #define LOGW            printf
+#endif
+
+
+#ifdef USE_LIBCURL
+#include <curl/curl.h>
+#endif
+
+typedef struct {
+    char sub[128];
+    char body[2048];
+    char attach[128];
+}mail_pkt_t;
+typedef struct {
+    handle_t      list;
+    mail_info_t   *info;
+
+#ifdef USE_LIBCURL
+    CURL          *curl;
+#endif
+
+    GlobalDeviceManager *dm;
+    int           inited;
+}mail_handle_t;
+static mail_handle_t maHandle;
+
+
+#ifdef USE_LIBCURL
+
+static char send_buff[1024] = {0};
+struct upload_status 
+{
+    size_t bytes_read;
+};
+
+static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
+{
+  struct upload_status *upload_ctx = (struct upload_status *)userp;
+  const char *data;
+  size_t room = size * nmemb;
+ 
+  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
+    return 0;
+  }
+ 
+  data = &send_buff[upload_ctx->bytes_read];
+ 
+  if(data) {
+    size_t len = strlen(data);
+    if(room < len)
+      len = room;
+    memcpy(ptr, data, len);
+    upload_ctx->bytes_read += len;
+    return len;
+  }
+ 
+  return 0;
+}
+static void fill_send_buff(const char *to,const char *from,const char *subject,const char *body)
+{
+  time_t timer;//time_t就是long int 类型
+  struct tm *tblock;
+  timer = time(NULL);
+  tblock = localtime(&timer);
+  memset(send_buff,0,1024);
+  sprintf(send_buff,"Subject: %s\r\n"
+                    "From: %s\r\n"
+                    "To: %s\r\n"
+                    "Date: %s\r\n"
+                    "\r\n"
+                    "%s\r\n"
+                    "\r\n",subject,from,to,asctime(tblock),body);
+}
+static int send_mail(mail_send_t *send, void *addr, char *sub, char *body, char *attach, int multi)
+{
+    CURLcode res = CURLE_OK;
+    char url_buff[256]={0};
+    char to_buff[256]={0};
+    mail_handle_t *h=&maHandle;
+    struct upload_status upload_ctx = { 0 };
+    struct curl_slist *recipients = NULL;
+    mail_recv_t *recv=(mail_recv_t*)addr;
+    
+    sprintf(url_buff,"%s:%s",send->server,send->port);
+    
+    res = curl_easy_setopt(h->curl, CURLOPT_URL,url_buff);
+    LOGD("url------%s %d\n",url_buff,res);
+    
+    res = curl_easy_setopt(h->curl, CURLOPT_USERNAME,send->account);        //setting user
+    LOGD("usrname------%s %d\n",send->account,res);
+    
+    res = curl_easy_setopt(h->curl, CURLOPT_PASSWORD, send->password);      //setting password
+    LOGD("passworld------%s %d\n",send->password,res);
+    
+    //res = curl_easy_setopt(h->curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);    //setting openssl/tls
+    LOGD("SSL------ %d\n",res);
+    
+    //curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem");
+    res = curl_easy_setopt(h->curl, CURLOPT_MAIL_FROM,send->account);
+    LOGD("From------%s %d\n",send->account,res);
+    
+    curl_easy_setopt(h->curl, CURLOPT_READFUNCTION, payload_source);
+    curl_easy_setopt(h->curl, CURLOPT_READDATA, &upload_ctx);
+    
+    if(multi) {
+        for(int i=0; i<MAIL_RECV_MAX; i++) {
+            if(recv[i].use && strlen(recv[i].account)>0) {
+                recipients = curl_slist_append(recipients, recv[i].account);
+                //recipients = curl_slist_append(recipients, CC_MAIL);
+                strcat(to_buff,recv[i].account);
+                strcat(to_buff,";");
+            }
+        }
+    }
+    else {
+        char *sendto=(char*)addr;
+        recipients = curl_slist_append(recipients,sendto);
+        strcat(to_buff,sendto);
+        strcat(to_buff,";");
+    }
+    fill_send_buff(to_buff,send->account,sub,body);
+
+    curl_easy_setopt(h->curl, CURLOPT_UPLOAD, 1L);
+    res = curl_easy_setopt(h->curl, CURLOPT_MAIL_RCPT, recipients);
+    LOGD("rcpt------ %d\n",res);
+    res = curl_easy_setopt(h->curl, CURLOPT_VERBOSE, 1L);
+    LOGD("verbose------ %d\n",res);
+    res = curl_easy_perform(h->curl);
+    LOGD("send------ %d\n",res);
+    if(res != CURLE_OK) {
+        LOGE("send failed!!!!\n");
+    }
+    curl_slist_free_all(recipients);
+    //curl_easy_cleanup(h->curl);
+    
+    return res;
+}
 
-#ifdef USE_SMTP
+#else
 
 #include <sys/types.h>
 #include <stddef.h>
@@ -503,8 +634,6 @@ void smtp_attachment_clear_all(struct smtp *const smtp);
  */
 #define SMTP_INTERNAL_DEFINE
 
-#include "smtp.h"
-
 /*
  * The SMTP_TEST converts some library routines into special test seams which
  * allows the test program to control whether they fail. For example, we can
@@ -3971,36 +4100,11 @@ smtp_attachment_clear_all(struct smtp *const smtp){
   smtp->num_attachment = 0;
 }
 
-/////////////////////////////////////////////////////
-#include <stdint.h>
-#include "common.h"
-#include "thread.h"
-#include "xlist.h"
-#include "elog.h"
-#include "lock.h"
-#include "sqlite_handle.h"
-
-
-//https://bgithub.xyz/embeddedmz/mailclient-cpp/tree/master/MAIL
-
-
-
-
-#if 1
-    #define LOGD            log_d
-    #define LOGE            log_e
-    #define LOGW            log_w
-#else
-    #define LOGD            printf
-    #define LOGE            printf
-    #define LOGW            printf
-#endif
-
 #define MAIL_CONNECTION_SECURITY SMTP_SECURITY_STARTTLS
 #define MAIL_FLAGS               (SMTP_DEBUG|SMTP_NO_CERT_VERIFY) /* Do not verify cert. */
 #define MAIL_CAFILE              NULL
 #define MAIL_AUTH                SMTP_AUTH_PLAIN
-static int send_mail(smtp_send_t *send, void *addr, char *sub, char *body, int multi)
+static int send_mail(mail_send_t *send, void *addr, char *sub, char *body, char *attach, int multi)
 {
     int i,r=-1,flag=0;
     struct smtp *smtp=NULL;
@@ -4043,8 +4147,8 @@ static int send_mail(smtp_send_t *send, void *addr, char *sub, char *body, int m
     }
     
     if(multi) {
-      smtp_recv_t *recv=(smtp_recv_t*)addr;
-      for(i=0; i<SMTP_RECV_MAX; i++) {
+      mail_recv_t *recv=(mail_recv_t*)addr;
+      for(i=0; i<MAIL_RECV_MAX; i++) {
           if(recv[i].use && strlen(recv[i].account)>0) {
               r = smtp_address_add(smtp, SMTP_ADDRESS_TO, recv[i].account, recv[i].account);
               if(r != SMTP_STATUS_OK) {
@@ -4074,7 +4178,7 @@ static int send_mail(smtp_send_t *send, void *addr, char *sub, char *body, int m
             goto quit;
         }
     
-        //r = smtp_attachment_add_mem(smtp, "test.txt", "Test email attachment.", -1);
+        r = smtp_attachment_add_mem(smtp, attach, "attachment", -1);
         smtp_mail(smtp, body);
     }
     
@@ -4088,43 +4192,29 @@ out:
     lock_s_release(LOCK_ID_SMTP);
     return r;
 }
-
-
-typedef struct {
-    char sub[128];
-    char body[2048];
-}smtp_pkt_t;
-typedef struct {
-    handle_t      list;
-    smtp_info_t   *info;
-
-    GlobalDeviceManager *dm;
-    int           inited;
-}smtp_handle_t;
-static smtp_handle_t smHandle;
-
+#endif
+////////////////////////////////////////////////////////////////////////////
 static void sleep_ms(int ms)
 {
     usleep(ms*1000);
 }
-#endif
 
-void* smtp_thread(void *arg)
+void* mail_thread(void *arg)
 {
-#ifdef USE_SMTP
+#ifdef USE_MAIL
     int r;
     thread_handle_t *th=(thread_handle_t*)arg;
-    smtp_handle_t   *h=(smtp_handle_t*)th->arg;
+    mail_handle_t   *h=(mail_handle_t*)th->arg;
     list_node_t     *ln=NULL;
-    smtp_pkt_t      *pkt=NULL;
-    smtp_send_t     *send=&h->info->send;
-    smtp_recv_t     *recv=h->info->recv;
+    mail_pkt_t      *pkt=NULL;
+    mail_send_t     *send=&h->info->send;
+    mail_recv_t     *recv=h->info->recv;
 
     while(th->quit==0) {
         r = xlist_take_node(h->list, &ln, 0);
         if(r==0) {
-            pkt = (smtp_pkt_t*)ln->data.buf;
-            send_mail(send, recv, pkt->sub, pkt->body, 1);
+            pkt = (mail_pkt_t*)ln->data.buf;
+            send_mail(send, recv, pkt->sub, pkt->body, pkt->attach, 1);
             xlist_back_node(h->list, ln);
         }
         sleep_ms(100);
@@ -4135,11 +4225,11 @@ void* smtp_thread(void *arg)
 }
 
 
-int smtp_init(void)
+int mail_init(void)
 {
-#ifdef USE_SMTP
+#ifdef USE_MAIL
     list_cfg_t lc;
-    smtp_handle_t *h=&smHandle;
+    mail_handle_t *h=&maHandle;
     GlobalDeviceManager *dm=&__globalDeviceManage;
 
     lc.mode = LIST_FULL_FIFO;
@@ -4148,25 +4238,39 @@ int smtp_init(void)
     h->list = xlist_init(&lc);
 
     h->dm = dm;
-    h->info = &h->dm->smtpInfo;
+    h->info = &h->dm->mailInfo;
 
-    dev_smtp_init(dm->db, h->info);
-    thread_start(THREAD_ID_SMTP, h);
+#ifdef USE_LIBCURL
+    if(!h->curl){
+        h->curl = curl_easy_init();
+        if(!h->curl) {
+          return -1;
+        }
+    }
+#endif
+
+    dev_mail_init(dm->db, h->info);
+    thread_start(THREAD_ID_MAIL, h);
     h->inited = 1;
 
-    //smtp_test();
+    //mail_test();
 #endif
 
     return 0;
 }
 
 
-int smtp_deinit(void)
+int mail_deinit(void)
 {
-#ifdef USE_SMTP
-    smtp_handle_t *h=&smHandle;
+#ifdef USE_MAIL
+    mail_handle_t *h=&maHandle;
 
-    thread_stop(THREAD_ID_SMTP);
+#ifdef USE_LIBCURL
+    free(h->curl);
+    h->curl = 0;
+#endif
+
+    thread_stop(THREAD_ID_MAIL);
     xlist_free(h->list);
     h->inited = 0;
 #endif
@@ -4175,16 +4279,17 @@ int smtp_deinit(void)
 }
 
 
-static int post_data(char *sub, char *body)
+static int post_data(char *sub, char *body, char *attach)
 {
     int r=0;
 
-#ifdef USE_SMTP
-    smtp_pkt_t pkt;
-    smtp_handle_t *h=&smHandle;
+#ifdef USE_MAIL
+    mail_pkt_t pkt;
+    mail_handle_t *h=&maHandle;
 
     snprintf(pkt.sub, sizeof(pkt.sub), "%s", sub);
     snprintf(pkt.body, sizeof(pkt.body), "%s", body);
+    snprintf(pkt.body, sizeof(pkt.body), "%s", body);
     r = xlist_append(h->list, 0, &pkt, sizeof(pkt));
 #endif
 
@@ -4192,47 +4297,47 @@ static int post_data(char *sub, char *body)
 }
 
 
-int smtp_send(char *sub, char *body)
+int mail_send(char *sub, char *body, char *attachment)
 {
     int r=-1;
 
-#ifdef USE_SMTP
-    smtp_handle_t *h=&smHandle;
+#ifdef USE_MAIL
+    mail_handle_t *h=&maHandle;
 
     if(!h->inited) {
         return -1;
     }
-    r = send_mail(&h->info->send, h->info->recv, sub, body, 1);
+    r = send_mail(&h->info->send, h->info->recv, sub, body, attachment, 1);
 #endif
 
     return r;
 }
 
-int smtp_post(char *sub, char *body)
+int mail_post(char *sub, char *body, char *attachment)
 {
     int r=-1;
 
-#ifdef USE_SMTP
-    smtp_handle_t *h=&smHandle;
+#ifdef USE_MAIL
+    mail_handle_t *h=&maHandle;
 
     if(!h->inited) {
         return -1;
     }
-    r = post_data(sub, body);
+    r = post_data(sub, body, attachment);
 #endif
 
     return r;
 }
 
 
-int smtp_post_alarm(int type, int subtype, int alarm_type, char *content)
+int mail_post_alarm(int type, int subtype, int alarm_type, char *content)
 {
     int r=0;
 
-#ifdef USE_SMTP
-    smtp_pkt_t pkt;
+#ifdef USE_MAIL
+    mail_pkt_t pkt;
     char temp[128];
-    smtp_handle_t *h=&smHandle;
+    mail_handle_t *h=&maHandle;
 
     if(!h->inited) {
         return -1;
@@ -4347,7 +4452,7 @@ int smtp_post_alarm(int type, int subtype, int alarm_type, char *content)
     }
 
     replace_sequences(content, h->dm->alarmTab);
-    r = post_data(temp, content);
+    r = post_data(temp, content, NULL);
 #endif
 
     return r;
@@ -4359,11 +4464,11 @@ int smtp_test(void)
 {
     int r=0,cnt=0;
     
-#ifdef USE_SMTP
+#ifdef USE_MAIL
     char temp[200];
-    smtp_handle_t *h=&smHandle;
+    mail_handle_t *h=&maHandle;
 
-    smtp_info_t info={
+    mail_info_t info={
     .send = {
       .id = 0,
       .mode = 1,
@@ -4396,7 +4501,7 @@ int smtp_test(void)
   char *body="hello everyone";
   while(cnt++<5) {
       sprintf(temp, "%s %d", body, cnt);
-      r = smtp_send(sub, temp);
+      r = mail_send(sub, temp, NULL);
       sleep(2);
   }
 #endif

+ 13 - 0
pro/src/mail.h

@@ -0,0 +1,13 @@
+#ifndef __MAIL_Hx__
+#define __MAIL_Hx__
+
+int mail_init(void);
+int mail_deinit(void);
+
+int mail_test(void);
+int mail_send(char *sub, char *body, char *attachment);
+int mail_post(char *sub, char *body, char *attachment);
+int mail_post_alarm(int type, int subtype, int alarm_type, char *content);
+
+#endif /* __SMTP_Hx__ */
+

+ 5 - 5
pro/src/mqtt.c

@@ -995,7 +995,7 @@ static int get_serv(char *json)
             BSET(flag, SERV_NTP);
         }
 
-        if(thread_is_running(THREAD_ID_SMTP)) {
+        if(thread_is_running(THREAD_ID_MAIL)) {
             BSET(flag, SERV_SMTP);
         }
 
@@ -1043,13 +1043,13 @@ static int set_serv(int flag)
     }
 
     if(BGET(flag,SERV_SMTP)) {
-        if(!thread_is_running(THREAD_ID_SMTP)) {
-            //thread_stop(THREAD_ID_SMTP);
+        if(!thread_is_running(THREAD_ID_MAIL)) {
+            //thread_stop(THREAD_ID_MAIL);
         }
     }
     else {
-        if(thread_is_running(THREAD_ID_SMTP)) {
-            thread_stop(THREAD_ID_SMTP);
+        if(thread_is_running(THREAD_ID_MAIL)) {
+            thread_stop(THREAD_ID_MAIL);
         }
     }
 

+ 1 - 2
pro/src/netswitch.c

@@ -8,9 +8,8 @@
 #include "thread.h"
 #include "cfg.h"
 #include "lock.h"
-#include "smtp.h"
+#include "mail.h"
 #include "sqlite_handle.h"
-#include "smtp.h"
 #include "mqtt.h"
 
 

+ 0 - 13
pro/src/smtp.h

@@ -1,13 +0,0 @@
-#ifndef __SMTP_Hx__
-#define __SMTP_Hx__
-
-int smtp_init(void);
-int smtp_deinit(void);
-
-int smtp_test(void);
-int smtp_send(char *sub, char *body);
-int smtp_post(char *sub, char *body);
-int smtp_post_alarm(int type, int subtype, int alarm_type, char *content);
-
-#endif /* __SMTP_Hx__ */
-

+ 27 - 27
pro/src/sqlite_handle.c

@@ -5,7 +5,7 @@
 #include "time.h"
 #include "paras.h"
 #include "cfg.h"
-#include "smtp.h"
+#include "mail.h"
 #include "mqtt.h"
 #include "sys.h"
 #include "switch_ctrl.h"
@@ -2626,7 +2626,7 @@ int dev_insert_alarm_info(sqlite3* db,int product_id,int alarm_type,time_data_t
     }
     sqlite3_free_table(pResult);
 
-    //smtp_send();
+    //mail_send();
 
     return alarmNumber;
 }
@@ -3695,7 +3695,7 @@ int dev_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,GlobalPowerMa
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
     int nAlarmID=dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
 
-    smtp_post_alarm(ALARM_TYPE_POWER, 0, _AlarmType, AlarmText);
+    mail_post_alarm(ALARM_TYPE_POWER, 0, _AlarmType, AlarmText);
 
     alarm_para_t para;
     //dev_search_last_Index(globalDeviceManger->db, );
@@ -3870,7 +3870,7 @@ int dev_Alarm_T_AC_message(GlobalDeviceManager* globalDeviceManger, GlobalTreeAC
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
     int nAlarmID=dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
 
-    smtp_post_alarm(ALARM_TYPE_POWER, 1, _AlarmType, AlarmText);
+    mail_post_alarm(ALARM_TYPE_POWER, 1, _AlarmType, AlarmText);
 
     alarm_para_t para;
     para.id = __globalPowerTemp->product_ch_id;
@@ -3986,7 +3986,7 @@ int dev_sensor_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,Global
     int nAlarmID=dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,1,buffer,AlarmText);
 
     int subtype=__globalPowerTemp->sensor_type;
-    smtp_post_alarm(ALARM_TYPE_SENSOR, subtype, _AlarmType, AlarmText);
+    mail_post_alarm(ALARM_TYPE_SENSOR, subtype, _AlarmType, AlarmText);
 
     alarm_para_t para;
     para.id = __globalPowerTemp->sensor_id;
@@ -4223,21 +4223,21 @@ int dev_switch_update_all(sqlite3 *db, netswitch_info_t *sw)
 }
 
 
-////////////////smtp/////////////////////////////////////////////
-#define SMTP_MANAGER_TABLE   "Table_SMTPManage"
-#define SMTP_RECVEIVE_TABLE  "Table_SMTPReceive"
-int dev_smtp_init(sqlite3 *db, smtp_info_t *info)
+////////////////MAIL/////////////////////////////////////////////
+#define MAIL_MANAGER_TABLE   "Table_MAILManage"
+#define MAIL_RECVEIVE_TABLE  "Table_MAILReceive"
+int dev_mail_init(sqlite3 *db, mail_info_t *info)
 {
     int i,r=-1;
 
-#ifdef USE_SMTP
+#ifdef USE_MAIL
     char temp[1024];
     char *err_msg=NULL;
     char *table=NULL;
     int nrow,ncol;
     char** pResult = NULL;
     
-    table = SMTP_MANAGER_TABLE;
+    table = MAIL_MANAGER_TABLE;
     if(!tab_exists(db, table)) {
         sprintf(temp, "CREATE TABLE IF NOT EXISTS %s("
                             "id INTEGER PRIMARY KEY,"
@@ -4253,14 +4253,14 @@ int dev_smtp_init(sqlite3 *db, smtp_info_t *info)
             return -1;
         }
 
-#ifdef SMTP_SEND_BUILTIN
-        extern smtp_send_t DFLT_SMTP_SEND;
-        dev_smtp_update_send(db, &DFLT_SMTP_SEND);
+#ifdef MAIL_SEND_BUILTIN
+        extern mail_send_t DFLT_MAIL_SEND;
+        dev_mail_update_send(db, &DFLT_MAIL_SEND);
 #endif
     }
 
     if(info) {
-        memset(info, 0, sizeof(smtp_info_t));
+        memset(info, 0, sizeof(mail_info_t));
     }
 
     nrow = ncol = 0;
@@ -4272,8 +4272,8 @@ int dev_smtp_init(sqlite3 *db, smtp_info_t *info)
     }
 
     if(info && ncol>0) {
-        smtp_send_t *send=&info->send; 
-        memset(send, 0, sizeof(smtp_send_t));
+        mail_send_t *send=&info->send; 
+        memset(send, 0, sizeof(mail_send_t));
         send->id = atoi(pResult[ncol+0]);
         send->mode = atoi(pResult[ncol+1]);
         strcpy(send->account, pResult[ncol+2]);
@@ -4284,7 +4284,7 @@ int dev_smtp_init(sqlite3 *db, smtp_info_t *info)
     }
     ////////////////////////////////////////////////////////////////////////
 
-    table = SMTP_RECVEIVE_TABLE;
+    table = MAIL_RECVEIVE_TABLE;
     if(!tab_exists(db, table)) {
         sprintf(temp, "CREATE TABLE IF NOT EXISTS %s("
                             "idx INTEGER PRIMARY KEY,"
@@ -4306,7 +4306,7 @@ int dev_smtp_init(sqlite3 *db, smtp_info_t *info)
     }
     
     if(info && ncol>0) {
-        smtp_recv_t *recv=info->recv;
+        mail_recv_t *recv=info->recv;
         for(i=1; i<=nrow; i++) {
             recv[i-1].idx = atoi(pResult[i*ncol+0]);
             recv[i-1].use = atoi(pResult[i*ncol+1]);
@@ -4320,15 +4320,15 @@ int dev_smtp_init(sqlite3 *db, smtp_info_t *info)
 }
 
 
-int dev_smtp_update_send(sqlite3 *db, smtp_send_t *send)
+int dev_mail_update_send(sqlite3 *db, mail_send_t *send)
 {
     int i,r=-1,exist=0,cnt=0;
 
-#ifdef USE_SMTP
+#ifdef USE_MAIL
     char temp[1024];
     sqlite3_stmt *stmt;
     char *err_msg=NULL;
-    char *table=SMTP_MANAGER_TABLE;
+    char *table=MAIL_MANAGER_TABLE;
 
     cnt = get_count(db, table);
     if(cnt>0) {
@@ -4348,7 +4348,7 @@ int dev_smtp_update_send(sqlite3 *db, smtp_send_t *send)
         sprintf(temp, "INSERT INTO %s (id,mode,account,password,server,port,auth) VALUES (?,?,?,?,?,?,?);", table);
         r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
         if (r != SQLITE_OK) {
-            log_e("___dev_smtp_update_man, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
+            log_e("___dev_mail_update_man, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
             r = -1; goto quit;
         }
 
@@ -4377,15 +4377,15 @@ quit:
     return r;
 }
 
-int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *recv)
+int dev_mail_update_recv(sqlite3 *db, mail_recv_t *recv)
 {
     int i,r=-1,exist=0,cnt=0;
 
-#ifdef USE_SMTP
+#ifdef USE_MAIL
     char temp[1024];
     sqlite3_stmt *stmt;
     char *err_msg=NULL;
-    char *table=SMTP_RECVEIVE_TABLE;
+    char *table=MAIL_RECVEIVE_TABLE;
     
     cnt = get_count(db, table);
     if(cnt>0) {
@@ -4405,7 +4405,7 @@ int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *recv)
         sprintf(temp, "INSERT INTO %s (idx,use,account) VALUES (?,?,?);", table);
         r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
         if (r != SQLITE_OK) {
-            log_e("___dev_smtp_update_recv, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
+            log_e("___dev_mail_update_recv, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
             r = -1;
             goto quit;
         }

+ 3 - 3
pro/src/sqlite_handle.h

@@ -154,9 +154,9 @@ int dev_switch_init(sqlite3 *db, netswitch_info_t *sw);
 int dev_switch_update_port(sqlite3 *db, port_info_t *pt);
 int dev_switch_update_all(sqlite3 *db, netswitch_info_t *sw);
 
-int dev_smtp_init(sqlite3 *db, smtp_info_t *info);
-int dev_smtp_update_send(sqlite3 *db, smtp_send_t *send);
-int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *recv);
+int dev_mail_init(sqlite3 *db, mail_info_t *info);
+int dev_mail_update_send(sqlite3 *db, mail_send_t *send);
+int dev_mail_update_recv(sqlite3 *db, mail_recv_t *recv);
 
 int dev_mqtt_init(sqlite3 *db, mqtt_info_t *info);
 int dev_mqtt_update_ser(sqlite3 *db, mqtt_server_t *ser);

+ 1 - 1
pro/src/thread.c

@@ -17,7 +17,7 @@ static thread_attr_t thdAttrs[THREAD_ID_MAX]={
     {"switch",      netswitch_thread,           NULL,           8*MB,           1},
     {"brkscan",     breaker_scanner_thread,     NULL,           8*MB,           1},
     {"mqtt",        mqtt_thread,                NULL,           8*MB,           1},
-    {"smtp",        smtp_thread,                NULL,           8*MB,           1},
+    {"mail",        mail_thread,                NULL,           8*MB,           1},
     {"modbus_tcp",  tcp_modbus_thread,          NULL,           8*MB,           1},
 };
 static thread_handle_t thdHandles[THREAD_ID_MAX]={0};

+ 2 - 2
pro/src/thread.h

@@ -28,7 +28,7 @@ enum {
     THREAD_ID_SWITCH,
     THREAD_ID_BREAKER_SCANNER,
     THREAD_ID_MQTT,
-    THREAD_ID_SMTP,
+    THREAD_ID_MAIL,
     THREAD_ID_TCP,
     
     THREAD_ID_MAX=30
@@ -70,7 +70,7 @@ void* breaker_thread(void *arg);
 void* netswitch_thread(void *arg);
 void* breaker_scanner_thread(void *arg);
 void* mqtt_thread(void *arg);
-void* smtp_thread(void *arg);
+void* mail_thread(void *arg);
 void* tcp_modbus_thread(void *arg);