版本 | 连接 |
---|---|
V1.0.0 | 点我查看 |
- 支持设置多个收件人
- 支持删除指定收件人
- 支持附件发送(需要文件系统)
- 新版中需要调用
smtp_add_receiver
函数添加邮件的收件人,当使用多个收件人时只需多次调用该函数即可。 - 新版中
smtp_send_mail
函数去掉了发送者邮箱地址与接收者邮箱地址两个参数。发送者邮箱地址必须与服务器用户名相同,在设置服务器用户名后系统自动设置,接收者邮箱通过smtp_add_receiver
进行设置。 - 新版加入
smtp_add_attachment
与smtp_clear_attachments
接口,用于添加与清空附件,附件可以添加多个,清空附件时会清空所有之前添加的附件。
这是一个基于RT-Thread的SMTP软件包,其支持普通的25端口,同时也支持465和587这两个加密端口。该软件包的使用非常简单方便,如果是基于RT-Thread操作系统,则无需进行任何移植操作即可使用,且仅需调用几个简单的接口即可实现不同端口的邮件发送功能。
- 支持25端口
- 支持加密功能,支持465,587端口。(有些邮件服务器可能不支持其中的某个端口,用户使用前需了解自己所选用的邮件服务器支持哪个端口的smtp功能)
- 使用简单,无需了解SMTP协议,设置好一些必要参数后仅需一个接口即可实现邮件发送。
首先需要下载 SMTP_CLIENT 软件包,并将软件包加入到项目中。在 BSP 目录下使用 menuconfig 命令打开 Env 配置界面,在 RT-Thread online packages → IoT - internet of things
中选择 SMTP_CLIENT 软件包,具体路径如下:
RT-Thread online packages
IoT - internet of things --->
[*] smtp_client:smtp client package for rt-thread --->
Version (latest) --->
[*] use 465/587 port(encrypted port)
[ ] enable debug log information
smtp_client Options --->
[*] smtp client example
[*] enable attachment
- Version: 配置软件版本
- use 465/587 port(encrypted port): 使用加密端口,选中后会将 mbedtls 软件包加入编译,同时开启 465和587 两个加密端口的支持。
- enable debug log information: 使能调试打印信息
- smtp client example: 加入示例文件
- enable attachment: 启用附件
注意:加入示例文件后不能直接下载使用,默认示例中缺少SMTP的个人参数,需要用户补全自己的用户名密码及接收方邮箱等信息!
- 开启加密功能后会占用比较大的RAM空间,请根据自己使用的硬件平台决定是否选用加密。并且适当调大调用发送功能的线程的堆栈大小。(推荐大于8192)
- 有些邮件服务器不支持某个加密端口或者默认关闭,使用者需要确认自己选用的邮件服务器所支持的端口,并且确认已经打开邮件服务器的SMTP功能。
- 若用户在使用的过程中出现加密有关的错误,请参照 RT-Thread mbedtls 软件包的说明文档。
- 调用
smtp_client_init
函数初始化 smtp_client 客户端 - 调用
smtp_set_server_addr
函数设置服务器的地址及端口 - 调用
smtp_set_auth
函数设置服务器认证信息 - 调用
smtp_add_receiver
函数添加收件人地址 - 调用
smtp_add_attachment
函数添加附件(可选) - 调用
smtp_send_mail
函数发送邮件
void smtp_client_init(void);
该函数主要用于初始化 smtp 会话结构。
int smtp_set_server_addr(const char *server_addr, uint8_t addr_type, const char *port);
参数 | 说明 |
---|---|
server_addr | 服务器地址 |
addr_type | 地址类型(域名或IP) |
port | 端口 |
返回值 | 说明 |
---|---|
0 | 设置成功 |
-1 | 设置失败 |
该函数用于设置 smtp 服务器地址及端口,地址类型为域名类型和IP类型,分别对应宏 ADDRESS_TYPE_DOMAIN
与 ADDRESS_TYPE_IP
.需要注意的是,由于时间仓促及其需求不是很大,目前仅支持域名连接,但如果有需求,在后续版本中会加入IP连接。当然程序中已预留接口,需求紧的用户可使用接口进行拓展。
int smtp_set_auth(const char *username, const char *password);
参数 | 说明 |
---|---|
username | 服务器用户名 |
password | 认证密码或凭据 |
返回值 | 说明 |
---|---|
0 | 设置成功 |
-1 | 设置失败 |
该函数用于设置 smtp 服务器的认证信息,需要注意有些服务器需要用 凭据 而非用户登录邮箱时的密码进行认证,用户在连接服务器时需要确认自己所用服务器的认证方式。
int smtp_add_receiver(char *receiver_addr);
参数 | 说明 |
---|---|
receiver_addr | 收件人邮箱地址 |
返回值 | 说明 |
---|---|
0 | 添加成功 |
-1 | 添加失败 |
在邮件发送前需要调用该函数添加收件人,若需要将邮件发送给多个收件人,则仅需多次调用该函数并传入不同的参数即可。
int smtp_delete_receiver(char *receiver_addr);
参数 | 说明 |
---|---|
receiver_addr | 收件人邮箱地址 |
返回值 | 说明 |
---|---|
0 | 删除成功 |
-1 | 删除失败 |
若当前有多个收件人的情况下想要删除某个特定的收件人,仅需调用该接口并传入待删除的收件人邮箱即可。
int smtp_send_mail(char *subject, char *body);
参数 | 说明 |
---|---|
subject | 主题 |
body | 内容 |
返回值 | 说明 |
---|---|
0 | 发送成功 |
-1 | 发送失败 |
该函数为邮件发送函数,在用户设置好服务器的连接参数后,可以直接调用该函数进行邮件的发送。
int smtp_add_attachment(char *file_path, char *file_name)
参数 | 说明 |
---|---|
file_path | 附件的文件路径 |
file_name | 附件名 |
返回值 | 说明 |
---|---|
0 | 添加成功 |
-1 | 添加失败 |
用户可以自定义附件名,无需与文件路径中的文件名相同,在邮件中附件的名字总是为该函数中设置的附件名。
void smtp_clear_attachments(void)
调用该函数可以清除所有添加的附件。
若用户在使用过程中发现默认的配置无法满足自身的使用需求,用户可以进入 smtp_client_private.h
文件对相关宏定义参数进行配置:
宏 | 说明 |
---|---|
SMTP_MAX_ADDR_LEN | 邮箱地址最大长度 |
SMTP_MAX_AUTH_LEN | 认证信息最长度 |
SMTP_SEND_CMD_MAX_LEN | SMTP指令发送最大长度 |
SMTP_SEND_DATA_HEAD_MAX_LENGTH | 邮件头最大长度 |
SMTP_SEND_DATA_MAX_LEN | 邮件内容最大长度 |
SMTP_RESPONSE_MAX_LEN | 服务器响应数据最大长度 |
一般情况下,用户需要根据自己内容的大小对 SMTP_SEND_DATA_MAX_LEN
进行配置即可。
加入例程后需要在命令行中输入 smtp_test 指令开启邮件发送,为了防止频繁发送,例程限制了最小发送间隔为30s,在发送成功后的30s内输入测试指令均无效。
/*************************************************
Copyright (c) 2019
All rights reserved.
File name: smtp_client_example.c
Description: smtp发送邮件示例邮件
History:
1. Version: V1.0.0
Date: 2019-10-14
Author: WKJay
Modify:
2. Version: V1.0.1
Date: 2019-10-14
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 8192
#else
#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.163.com"
//smtp 服务器端口号
#define SMTP_SERVER_PORT "25"
//smtp 登录用户名
#define SMTP_USERNAME ""
//smtp 登录密码(或凭证)
#define SMTP_PASSWORD ""
//邮件主题
#define SMTP_SUBJECT "SMTP TEST"
//邮件内容
char *content = "THIS IS SMTP TEST\r\n"
"HELLO SMTP\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)
{
//初始化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("[email protected]");
while (1)
{
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);
}
}
}
int smtp_thread_entry(void)
{
rt_thread_t smtp_client_tid;
//创建邮件发送线程(如果选择在主函数中直接调用邮件发送函数,需要注意主函数堆栈大小,必要时调大)
smtp_client_tid = rt_thread_create("smtp", smtp_thread, RT_NULL, SMTP_CLIENT_THREAD_STACK_SIZE, 20, 5);
if (smtp_client_tid != RT_NULL)
{
rt_thread_startup(smtp_client_tid);
}
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);
- 维护: WKJay
- 主页:https://github.com/WKJay/SMTP_CLIENT
- email: [email protected]
- 若在使用过程中有任何问题,请与作者取得联系。同时欢迎大家参与到该软件包的开发与维护中来,共同创建一个更加完善、稳定的软件包。