WKJay 5 лет назад
Родитель
Сommit
7d6887cce6
5 измененных файлов с 232 добавлено и 98 удалено
  1. 49 17
      example/smtp_client_example.c
  2. 2 0
      inc/smtp_client.h
  3. 2 1
      inc/smtp_client_private.h
  4. 95 34
      readme.md
  5. 84 46
      src/smtp_client.c

+ 49 - 17
example/smtp_client_example.c

@@ -12,6 +12,11 @@
     Date:       2019-10-14
     Author:     wangjunjie
     Modify:     添加多收件人功能
+    
+3. Version:    V1.0.2
+    Date:       2020-06-22
+    Author:     WKJay
+    Modify:     增加附件功能
 *************************************************/
 #include "smtp_client.h"
 #include "rtthread.h"
@@ -23,6 +28,12 @@
 #define SMTP_CLIENT_THREAD_STACK_SIZE 4096
 #endif
 
+#define DBG_ENABLE
+#define DBG_LEVEL 3
+#define DBG_COLOR
+#define DBG_SECTION_NAME "SMTP_EXAMPLE"
+#include "rtdbg.h"
+
 /*
  *邮件信息相关宏定义
  */
@@ -44,34 +55,47 @@ char *content = "THIS IS SMTP TEST\r\n"
                 "based on --->   RT-Thread\r\n"
                 "based on ---> SMTP_CLIENT\r\n";
 
+uint8_t send_enable = 0;
+
 void smtp_thread(void *param)
 {
-    //手动延时等待网络初始化成功
-    rt_thread_delay(10000);
-
     //初始化smtp客户端
     smtp_client_init();
     //设置服务器地址
     smtp_set_server_addr(SMTP_SERVER_ADDR, ADDRESS_TYPE_DOMAIN, SMTP_SERVER_PORT);
     //设置服务器认证信息
     smtp_set_auth(SMTP_USERNAME, SMTP_PASSWORD);
-
     //添加收件人1
-    smtp_add_receiver("roraxef370@royandk.com");
+    smtp_add_receiver("66666@sharklasers.com");
 
-    smtp_add_attachment("/a.txt", "a.txt");
-    smtp_add_attachment("/b.txt", "b.txt");
-    //发送邮件
-    rt_kprintf("\r\n[smtp]: O > start to send mail\r\n");
-    if (smtp_send_mail(SMTP_SUBJECT, content) == 0)
-    {
-        //发送成功
-        rt_kprintf("\r\n[smtp]: O > send mail success!\r\n");
-    }
-    else
+    while (1)
     {
-        //发送失败
-        rt_kprintf("\r\n[smtp]: X > send mail fail!\r\n");
+        if (send_enable)
+        {
+            smtp_add_attachment("/a.txt", "a.txt");
+            smtp_add_attachment("/b.txt", "b.txt");
+            //发送邮件
+            LOG_D("start to send mail");
+            if (smtp_send_mail(SMTP_SUBJECT, content) == 0)
+            {
+                //发送成功
+                LOG_I("send mail success!");
+            }
+            else
+            {
+                //发送失败
+                LOG_E("send mail fail!");
+            }
+            //清除附件
+            smtp_clear_attachments();
+            //防止频繁发送
+            rt_thread_mdelay(30000);
+            send_enable = 0;
+        }
+        else
+        {
+            rt_thread_mdelay(500);
+        }
     }
 }
 
@@ -87,3 +111,11 @@ int smtp_thread_entry(void)
     return RT_EOK;
 }
 INIT_APP_EXPORT(smtp_thread_entry);
+
+int smtp_test(uint8_t argc, char *argv[])
+{
+    send_enable = 1;
+    return 0;
+}
+MSH_CMD_EXPORT(smtp_test, smtp test);
+

+ 2 - 0
inc/smtp_client.h

@@ -26,6 +26,8 @@ void smtp_clear_receiver(void);
 #ifdef SMTP_CLIENT_USING_ATTACHMENT
 //添加附件
 int smtp_add_attachment(char *file_path, char *file_name);
+//清空附件
+void smtp_clear_attachments(void);
 
 #endif
 

+ 2 - 1
inc/smtp_client_private.h

@@ -26,7 +26,7 @@
 #define SMTP_MAX_FILE_PATH_LEN 64
 #define SMTP_ATTACHMENT_MAX_NAME_LEN 32
 #define SMTP_SEND_CMD_MAX_LEN 100
-#define SMTP_SEND_DATA_HEAD_MAX_LENGTH 128
+#define SMTP_SEND_DATA_HEAD_MAX_LENGTH 256
 #define SMTP_SEND_DATA_MAX_LEN 512
 #define SMTP_RESPONSE_MAX_LEN 512
 
@@ -111,6 +111,7 @@ extern smtp_session_t smtp_session;
 #define SMTP_RESP_354 "354"
 #define SMTP_RESP_LOGIN_UNAME "VXNlcm5hbWU6"
 #define SMTP_RESP_LOGIN_PASS "UGFzc3dvcmQ6"
+#define SMTP_MAIL_BOUNDARY "smtp_client_boundary"
 
 #define SMTP_CMD_EHLO "EHLO DM11\r\n"
 #define SMTP_CMD_AUTHLOGIN "AUTH LOGIN\r\n"

+ 95 - 34
readme.md

@@ -11,11 +11,13 @@
 
 1. 支持设置多个收件人
 2. 支持删除指定收件人
+3. 支持附件发送(需要文件系统)
 
 ##### API变更
 
 1. 新版中需要调用 `smtp_add_receiver` 函数添加邮件的收件人,当使用多个收件人时只需多次调用该函数即可。
 2. 新版中 `smtp_send_mail` 函数去掉了发送者邮箱地址与接收者邮箱地址两个参数。发送者邮箱地址必须与服务器用户名相同,在设置服务器用户名后系统自动设置,接收者邮箱通过 `smtp_add_receiver` 进行设置。
+3. 新版加入 `smtp_add_attachment`与`smtp_clear_attachments`接口,用于添加与清空附件,附件可以添加多个,清空附件时会清空所有之前添加的附件。
 
 ------------------------------------------------------------------
 
@@ -47,6 +49,7 @@ RT-Thread online packages
             [ ] enable debug log information
                 smtp_client Options --->
                     [*] smtp client example
+                    [*] enable attachment
 
 ```
 
@@ -54,12 +57,13 @@ RT-Thread online packages
 - **use 465/587 port(encrypted port):** 使用加密端口,选中后会将 **mbedtls** 软件包加入编译,同时开启 465和587 两个加密端口的支持。
 - **enable debug log information:** 使能调试打印信息
 - **smtp client example:** 加入示例文件
+- **enable attachment:** 启用附件
 
 **注意:加入示例文件后不能直接下载使用,默认示例中缺少SMTP的个人参数,需要用户补全自己的用户名密码及接收方邮箱等信息!**
 
 #### 注意事项
 
- - 开启加密功能后会占用比较大的RAM空间,请根据自己使用的硬件平台决定是否选用加密。并且适当调大调用发送功能的线程的堆栈大小。(推荐大于4096
+ - 开启加密功能后会占用比较大的RAM空间,请根据自己使用的硬件平台决定是否选用加密。并且适当调大调用发送功能的线程的堆栈大小。(推荐大于8192
  - 有些邮件服务器不支持某个加密端口或者默认关闭,使用者需要确认自己选用的邮件服务器所支持的端口,并且确认已经打开邮件服务器的SMTP功能。
  - 若用户在使用的过程中出现加密有关的错误,请参照 RT-Thread **mbedtls** 软件包的说明文档。
 
@@ -71,6 +75,7 @@ RT-Thread online packages
  2. 调用 `smtp_set_server_addr` 函数设置服务器的地址及端口
  3. 调用 `smtp_set_auth` 函数设置服务器认证信息
  4. 调用 `smtp_add_receiver` 函数添加收件人地址
+ 5. 调用 `smtp_add_attachment` 函数添加附件(可选)
  5. 调用 `smtp_send_mail` 函数发送邮件
 
  #### API详解
@@ -184,6 +189,36 @@ int smtp_send_mail(char *subject, char *body);
 
 该函数为邮件发送函数,在用户设置好服务器的连接参数后,可以直接调用该函数进行邮件的发送。
 
+##### 7、添加附件
+
+```C
+
+int smtp_add_attachment(char *file_path, char *file_name)
+
+```
+
+|参数|说明|
+|---|---|
+|file_path|附件的文件路径|
+|file_name|附件名|
+
+|返回值|说明|
+|----|----|
+|0|添加成功|
+|-1|添加失败|
+
+用户可以自定义附件名,无需与文件路径中的文件名相同,在邮件中附件的名字总是为该函数中设置的附件名。
+
+##### 8、清空附件
+
+```C
+
+void smtp_clear_attachments(void)
+
+```
+
+调用该函数可以清除所有添加的附件。
+
  #### 宏配置说明
 
 若用户在使用过程中发现默认的配置无法满足自身的使用需求,用户可以进入 `smtp_client_private.h` 文件对相关宏定义参数进行配置:
@@ -201,6 +236,8 @@ int smtp_send_mail(char *subject, char *body);
 
 #### 使用例程
 
+加入例程后需要在命令行中输入 smtp_test 指令开启邮件发送,为了防止频繁发送,例程限制了最小发送间隔为30s,在发送成功后的30s内输入测试指令均无效。
+
 ```C
 
 /*************************************************
@@ -211,37 +248,47 @@ int smtp_send_mail(char *subject, char *body);
  History:
  1. Version:    V1.0.0
     Date:       2019-10-14
-    Author:     wangjunjie
+    Author:     WKJay
     Modify:     
 2. Version:     V1.0.1
     Date:       2019-10-14
-    Author:     wangjunjie
+    Author:     WKJay
     Modify:     添加多收件人功能
+    
+3. Version:    V1.0.2
+    Date:       2020-06-22
+    Author:     WKJay
+    Modify:     增加附件功能
 *************************************************/
 #include "smtp_client.h"
 #include "rtthread.h"
 
 //若使用TLS加密则需要更大的堆栈空间
 #ifdef SMTP_CLIENT_USING_TLS
-#define SMTP_CLIENT_THREAD_STACK_SIZE 4096
+#define SMTP_CLIENT_THREAD_STACK_SIZE 8192
 #else
-#define SMTP_CLIENT_THREAD_STACK_SIZE 2048
+#define SMTP_CLIENT_THREAD_STACK_SIZE 4096
 #endif
 
+#define DBG_ENABLE
+#define DBG_LEVEL 3
+#define DBG_COLOR
+#define DBG_SECTION_NAME "SMTP_EXAMPLE"
+#include "rtdbg.h"
+
 /*
  *邮件信息相关宏定义
  */
 //smtp 服务器域名
-#define SMTP_SERVER_ADDR "smtp.qq.com"
+#define SMTP_SERVER_ADDR "smtp.163.com"
 //smtp 服务器端口号
 #define SMTP_SERVER_PORT "25"
 //smtp 登录用户名
-#define SMTP_USERNAME    ""
+#define SMTP_USERNAME ""
 //smtp 登录密码(或凭证)
-#define SMTP_PASSWORD    ""
+#define SMTP_PASSWORD ""
 //邮件主题
-#define SMTP_SUBJECT     "SMTP TEST"
-
+#define SMTP_SUBJECT "SMTP TEST"
 
 //邮件内容
 char *content = "THIS IS SMTP TEST\r\n"
@@ -249,39 +296,48 @@ char *content = "THIS IS SMTP TEST\r\n"
                 "--------------------------------------\r\n"
                 "based on --->   RT-Thread\r\n"
                 "based on ---> SMTP_CLIENT\r\n";
-                
+
+uint8_t send_enable = 0;
+
 void smtp_thread(void *param)
 {
-    //手动延时等待网络初始化成功
-    rt_thread_delay(10000);
-
     //初始化smtp客户端
     smtp_client_init();
     //设置服务器地址
     smtp_set_server_addr(SMTP_SERVER_ADDR, ADDRESS_TYPE_DOMAIN, SMTP_SERVER_PORT);
     //设置服务器认证信息
     smtp_set_auth(SMTP_USERNAME, SMTP_PASSWORD);
-    
     //添加收件人1
-    smtp_add_receiver("abc@test.com");
-    //添加收件人2
-    smtp_add_receiver("def@test.com");
-    //添加收件人3
-    smtp_add_receiver("hij@test.com");
-    //删除收件人2
-    smtp_delete_receiver("def@test.com");
-
-    //发送邮件
-    rt_kprintf("\r\n[smtp]: O > start to send mail\r\n");
-    if (smtp_send_mail(SMTP_SUBJECT, content) == 0)
-    {
-        //发送成功
-        rt_kprintf("\r\n[smtp]: O > send mail success!\r\n");
-    }
-    else
+    smtp_add_receiver("66666@sharklasers.com");
+
+    while (1)
     {
-        //发送失败
-        rt_kprintf("\r\n[smtp]: X > send mail fail!\r\n");
+        if (send_enable)
+        {
+            smtp_add_attachment("/a.txt", "a.txt");
+            smtp_add_attachment("/b.txt", "b.txt");
+            //发送邮件
+            LOG_D("start to send mail");
+            if (smtp_send_mail(SMTP_SUBJECT, content) == 0)
+            {
+                //发送成功
+                LOG_I("send mail success!");
+            }
+            else
+            {
+                //发送失败
+                LOG_E("send mail fail!");
+            }
+            //清除附件
+            smtp_clear_attachments();
+            //防止频繁发送
+            rt_thread_mdelay(30000);
+            send_enable = 0;
+        }
+        else
+        {
+            rt_thread_mdelay(500);
+        }
     }
 }
 
@@ -298,7 +354,12 @@ int smtp_thread_entry(void)
 }
 INIT_APP_EXPORT(smtp_thread_entry);
 
-
+int smtp_test(uint8_t argc, char *argv[])
+{
+    send_enable = 1;
+    return 0;
+}
+MSH_CMD_EXPORT(smtp_test, smtp test);
 ```
 
 ## 联系方式&感谢

+ 84 - 46
src/smtp_client.c

@@ -6,13 +6,18 @@
  History:
  1. Version:    V1.0.0
     Date:       2019-10-10
-    Author:     wangjunjie
+    Author:     WKJay
     Modify:     新建
 
  2. Version:    V1.0.1
     Date:       2019-10-28
-    Author:     wangjunjie
+    Author:     WKJay
     Modify:     增加多个收件人功能
+    
+ 3. Version:    V1.0.2
+    Date:       2020-06-22
+    Author:     WKJay
+    Modify:     增加附件功能
 *************************************************/
 
 #include <stdint.h>
@@ -38,6 +43,7 @@ smtp_session_t smtp_session;
  */
 int smtp_add_attachment(char *file_path, char *file_name)
 {
+    FILE *fp =  NULL;
     if (strlen(file_path) > SMTP_MAX_FILE_PATH_LEN)
     {
         LOG_E("attachment's file path too large");
@@ -50,6 +56,14 @@ int smtp_add_attachment(char *file_path, char *file_name)
         return -1;
     }
 
+    fp = fopen(file_path, "r");
+    if (fp == NULL)
+    {
+        LOG_E("cannot open file %s", file_path);
+        return -1;
+    }
+    fclose(fp);
+
     if (!smtp_session.attachments)
     {
         smtp_session.attachments = rt_malloc(sizeof(smtp_attachments_t));
@@ -90,7 +104,7 @@ int smtp_add_attachment(char *file_path, char *file_name)
 }
 
 //清除所有附件
-static void smtp_clear_attachments(void)
+void smtp_clear_attachments(void)
 {
     smtp_attachments_t *cur_attr, *next_attr;
     for (cur_attr = smtp_session.attachments; cur_attr; cur_attr = next_attr)
@@ -160,7 +174,7 @@ int smtp_set_server_addr(const char *server_addr, uint8_t addr_type, const char
     }
     else
     {
-        LOG_E(">server addr is null!");
+        LOG_E("server addr is null!");
         return -1;
     }
 
@@ -176,7 +190,7 @@ int smtp_set_server_addr(const char *server_addr, uint8_t addr_type, const char
     {
         if (addr_len > 15)
         {
-            LOG_E(">server addr type error!");
+            LOG_E("server addr type error!");
             return -1;
         }
         else
@@ -191,7 +205,7 @@ int smtp_set_server_addr(const char *server_addr, uint8_t addr_type, const char
 
     if (strlen(port) <= 0)
     {
-        LOG_E(">server port is null!");
+        LOG_E("server port is null!");
         return -1;
     }
     else
@@ -220,7 +234,7 @@ int smtp_set_auth(const char *username, const char *password)
 
     if (!(username_len && password_len))
     {
-        LOG_E(">username or password invalid!");
+        LOG_E("username or password invalid!");
         return -1;
     }
 
@@ -238,13 +252,13 @@ int smtp_set_auth(const char *username, const char *password)
 
     if (smtp_base64_encode(smtp_session.username, SMTP_MAX_AUTH_LEN * 2, username, username_len) == 0)
     {
-        LOG_E(">username encode error!");
+        LOG_E("username encode error!");
         return -1;
     }
 
     if (smtp_base64_encode(smtp_session.password, SMTP_MAX_AUTH_LEN * 2, password, password_len) == 0)
     {
-        LOG_E(">password encode error!");
+        LOG_E("password encode error!");
         return -1;
     }
 
@@ -270,7 +284,7 @@ static int smtp_connect_server_by_hostname(void)
 
     if (getaddrinfo(smtp_session.server_domain, smtp_session.server_port, &hints, &addr_list) != 0)
     {
-        LOG_E(">unknow server domain!");
+        LOG_E("unknow server domain!");
         return -1;
     }
 
@@ -288,7 +302,7 @@ static int smtp_connect_server_by_hostname(void)
         {
             if (read(smtp_session.conn_fd, buf, 3) < 3)
             {
-                LOG_E(">smtp server connect fail");
+                LOG_E("smtp server connect fail");
                 smtp_close_connection();
                 result = -1;
                 break;
@@ -297,21 +311,21 @@ static int smtp_connect_server_by_hostname(void)
             {
                 if (memcmp(buf, "220", 3) == 0)
                 {
-                    LOG_I(">smtp server connect success!");
-                    LOG_I(">smtp server domain -> %s!", smtp_session.server_domain);
+                    LOG_I("smtp server connect success!");
+                    LOG_I("smtp server domain -> %s!", smtp_session.server_domain);
                     result = 0;
                     break;
                 }
                 else
                 {
-                    LOG_E(">smtp connection response check fail");
+                    LOG_E("smtp connection response check fail");
                     smtp_close_connection();
                     result = -1;
                     break;
                 }
             }
         }
-        LOG_E(">smtp server connect fail");
+        LOG_E("smtp server connect fail");
         smtp_close_connection();
         result = -1;
     }
@@ -330,7 +344,7 @@ static int smtp_connect_server_by_ip(void)
 {
     int result = -1;
 
-    LOG_E(">current version don't support ip connect,please use server domain!");
+    LOG_E("current version don't support ip connect,please use server domain!");
 
     return result;
 }
@@ -376,13 +390,13 @@ static int smtp_flush(void)
 #endif
         else
         {
-            LOG_E(">smtp flush port invalid");
+            LOG_E("smtp flush port invalid");
             return -1;
         }
 
         if (result <= 0)
         {
-            LOG_E(">smtp net connection flush fail");
+            LOG_E("smtp net connection flush fail");
             return -1;
         }
         return result;
@@ -486,7 +500,7 @@ static int smtp_connect_server(void)
         }
         else
         {
-            LOG_E(">cannot find ip and domain");
+            LOG_E("cannot find ip and domain");
             return -1;
         }
     }
@@ -502,7 +516,7 @@ static int smtp_connect_server(void)
 #endif
     else
     {
-        LOG_E(">invalid port number!");
+        LOG_E("invalid port number!");
         return -1;
     }
 }
@@ -527,7 +541,7 @@ static int smtp_send_data_with_response_check(char *buf, char *response_code)
     )
 #endif
     {
-        LOG_E(">cannot find net fd");
+        LOG_E("cannot find net fd");
         return -1;
     }
     else
@@ -535,7 +549,7 @@ static int smtp_send_data_with_response_check(char *buf, char *response_code)
         smtp_flush();
         if (smtp_write((uint8_t *)buf, strlen(buf)) != strlen(buf))
         {
-            LOG_E(">smtp send fail");
+            LOG_E("smtp send fail");
             smtp_close_connection();
             return -1;
         }
@@ -543,13 +557,13 @@ static int smtp_send_data_with_response_check(char *buf, char *response_code)
         {
             if (smtp_read(response_code_buf, 3) < 3)
             {
-                LOG_E(">smtp read  response fail");
+                LOG_E("smtp read  response fail");
                 smtp_close_connection();
                 return -1;
             }
             if (memcmp(response_code, response_code_buf, 3) != 0)
             {
-                LOG_E(">smtp check  response fail");
+                LOG_E("smtp check  response fail");
                 smtp_close_connection();
                 return -1;
             }
@@ -573,7 +587,7 @@ static int smtp_handshake(void)
     result = smtp_send_data_with_response_check(SMTP_CMD_EHLO, "250");
     if (result != 0)
     {
-        LOG_E(">smtp helo fail");
+        LOG_E("smtp helo fail");
         return -1;
     }
 
@@ -584,7 +598,7 @@ static int smtp_handshake(void)
         smtp_session.state = SMTP_START_TLS;
         if (smtp_send_data_with_response_check(SMTP_CMD_STARTTLS, "220") != 0)
         {
-            LOG_E(">smtp start tls fail");
+            LOG_E("smtp start tls fail");
             smtp_close_connection();
             return -1;
         }
@@ -593,7 +607,7 @@ static int smtp_handshake(void)
 
         if (smtp_mbedtls_starttls(smtp_session.tls_session) != 0)
         {
-            LOG_E(">smtp start tls handshake fail");
+            LOG_E("smtp start tls handshake fail");
             return -1;
         }
         return 0;
@@ -620,7 +634,7 @@ static int smtp_auth_login(void)
 #endif
     if (smtp_send_data_with_response_check(SMTP_CMD_AUTHLOGIN, "334") != 0)
     {
-        LOG_E(">smtp auth login fail");
+        LOG_E("smtp auth login fail");
         smtp_close_connection();
         return -1;
     }
@@ -634,7 +648,7 @@ static int smtp_auth_login(void)
     sprintf(auth_info_buf, "%s\r\n", smtp_session.username);
     if (smtp_send_data_with_response_check(auth_info_buf, "334") != 0)
     {
-        LOG_E(">smtp send username fail");
+        LOG_E("smtp send username fail");
         smtp_close_connection();
         return -1;
     }
@@ -642,7 +656,7 @@ static int smtp_auth_login(void)
     sprintf(auth_info_buf, "%s\r\n", smtp_session.password);
     if (smtp_send_data_with_response_check(auth_info_buf, "235") != 0)
     {
-        LOG_E(">smtp password invalid");
+        LOG_E("smtp password invalid");
         smtp_close_connection();
         return -1;
     }
@@ -669,7 +683,7 @@ static int smtp_set_sender_receiver(void)
     sprintf(addr_info_buf, "%s%s%s", SMTP_CMD_MAIL_HEAD, smtp_session.address_from, SMTP_CMD_MAIL_END);
     if (smtp_send_data_with_response_check(addr_info_buf, "250") != 0)
     {
-        LOG_E(">smtp set mail from fail");
+        LOG_E("smtp set mail from fail");
         smtp_close_connection();
         return -1;
     }
@@ -679,7 +693,7 @@ static int smtp_set_sender_receiver(void)
         sprintf(addr_info_buf, "%s%s%s", SMTP_CMD_RCPT_HEAD, smtp_address_to_temp->addr, SMTP_CMD_RCPT_END);
         if (smtp_send_data_with_response_check(addr_info_buf, "250") != 0)
         {
-            LOG_E(">smtp set rcpt to fail");
+            LOG_E("smtp set rcpt to fail");
             smtp_close_connection();
             return -1;
         }
@@ -708,7 +722,10 @@ static void smtp_send_attachment(void)
             //发送附件头
             rt_memset(attachment_buf, 0, sizeof(attachment_buf));
             sprintf((char *)attachment_buf,
-                    "--mail_boundry\r\nContent-Type: text/plain; name=\"%s\"\r\nContent-Transfer-Encoding: binary\r\nContent-Disposition: attachment; filename=\"%s\"\r\n\r\n",
+                    "--" SMTP_MAIL_BOUNDARY "\r\n"
+                    "Content-Type: text/plain; name=\"%s\"\r\n"
+                    "Content-Transfer-Encoding: binary\r\n"
+                    "Content-Disposition: attachment; filename=\"%s\"\r\n\r\n",
                     cur_attr->file_name, cur_attr->file_name);
             smtp_write(attachment_buf, strlen((char *)attachment_buf));
 
@@ -722,11 +739,16 @@ static void smtp_send_attachment(void)
                 rt_thread_mdelay(1);
             }
             smtp_write(attachment_buf, read_size);
-            smtp_write("\r\n\r\n", strlen("\r\n\r\n"));
+            smtp_write((uint8_t *)"\r\n\r\n", strlen("\r\n\r\n"));
             fclose(fp);
         }
+        else
+        {
+            LOG_E("add attachment %s failed,path: %s", cur_attr->file_name, cur_attr->file_path);
+        }
         cur_attr = cur_attr->next;
     }
+    smtp_write((uint8_t *)("--" SMTP_MAIL_BOUNDARY "--\r\n"), strlen("--" SMTP_MAIL_BOUNDARY "--\r\n"));
 }
 
 /**
@@ -742,7 +764,7 @@ static int smtp_send_content(void)
 
     if (smtp_send_data_with_response_check(SMTP_CMD_DATA, "354") != 0)
     {
-        LOG_E(">smtp send data cmd fail");
+        LOG_E("smtp send data cmd fail");
         smtp_close_connection();
         return -1;
     }
@@ -751,28 +773,45 @@ static int smtp_send_content(void)
 #ifdef SMTP_CLIENT_USING_ATTACHMENT
     if (smtp_session.attachments)
     {
-        sprintf(content_buf, "FROM:<%s>\r\nTO:<%s>\r\nSUBJECT:%s\r\nContent-Type: multipart/mixed; boundary=\"mail_boundry\"\r\n\r\n--mail_boundry\r\nContent-Type: text/plain; charset=\"utf-8\"\r\nContent-Transfer-Encoding: 7bit\r\n\r\n%s\r\n\r\n",
+        sprintf(content_buf,
+                "FROM:<%s>\r\n"
+                "TO:<%s>\r\n"
+                "SUBJECT:%s\r\n"
+                "Content-Type: multipart/mixed;"
+                "boundary=\"smtp_client_boundary\"\r\n\r\n"
+                "--" SMTP_MAIL_BOUNDARY "\r\n"
+                "Content-Type: text/plain; charset=\"utf-8\"\r\n"
+                "Content-Transfer-Encoding: 7bit\r\n\r\n"
+                "%s\r\n\r\n",
                 smtp_session.address_from, smtp_session.address_to->addr, smtp_session.subject, smtp_session.body);
     }
     else
     {
-        sprintf(content_buf, "FROM: <%s>\r\nTO: <%s>\r\nSUBJECT:%s\r\n\r\n%s\r\n\r\n",
+        sprintf(content_buf,
+                "FROM: <%s>\r\n"
+                "TO: <%s>\r\n"
+                "SUBJECT:%s\r\n\r\n"
+                "%s\r\n\r\n",
                 smtp_session.address_from, smtp_session.address_to->addr, smtp_session.subject, smtp_session.body);
     }
 
 #else
-    sprintf(content_buf, "FROM: <%s>\r\nTO: <%s>\r\nSUBJECT:%s\r\n\r\n%s\r\n\r\n",
+    sprintf(content_buf,
+            "FROM: <%s>\r\n"
+            "TO: <%s>\r\n"
+            "SUBJECT:%s\r\n\r\n"
+            "%s\r\n\r\n",
             smtp_session.address_from, smtp_session.address_to->addr, smtp_session.subject, smtp_session.body);
 #endif
+
     smtp_write((uint8_t *)content_buf, strlen(content_buf));
 
 #ifdef SMTP_CLIENT_USING_ATTACHMENT
     smtp_send_attachment();
-    smtp_clear_attachments();
 #endif
     if (smtp_send_data_with_response_check(SMTP_CMD_BODY_FINISHED, "250") != 0)
     {
-        LOG_E(">smtp send data content fail");
+        LOG_E("smtp send data content fail");
         smtp_close_connection();
         return -1;
     }
@@ -790,14 +829,14 @@ static int smtp_quit(void)
 {
     if (smtp_send_data_with_response_check(SMTP_CMD_QUIT, "221") != 0)
     {
-        LOG_E(">smtp quit fail");
+        LOG_E("smtp quit fail");
         smtp_close_connection();
         return -1;
     }
-    LOG_I(">smtp mail send sussess!");
+    LOG_I("smtp mail send sussess!");
     //关闭连接
     smtp_close_connection();
-    LOG_I(">close smtp connection!");
+    LOG_I("close smtp connection!");
     return 0;
 }
 
@@ -805,7 +844,6 @@ static int smtp_quit(void)
  * Name:    smtp_send
  * Brief:   真实的发送函数
  * Input:   
- *  @port_num:  发送邮件的端口号字符串
  * Output:  发送成功0,发送失败-1
  */
 static int smtp_send(void)
@@ -861,7 +899,7 @@ int smtp_send_mail(char *subject, char *body)
 {
     if (subject == NULL)
     {
-        LOG_E(">subject is null!");
+        LOG_E("subject is null!");
         return -1;
     }
     else
@@ -871,7 +909,7 @@ int smtp_send_mail(char *subject, char *body)
 
     if (body == NULL)
     {
-        LOG_E(">body is null!");
+        LOG_E("body is null!");
         return -1;
     }
     else