手把手教你用STM32发送带附件的邮件 (三、附件功能实现)

  • 上节回顾

上一小节我们实现了基本的邮件发送功能,并且学习了如下知识点:

1. 如何使用 RT-Thread Studio 添加软件包。

2. 如何应对由于项目重新构建导致的参数丢失问题。

3. 如何配置邮件相关参数。

4. 如何修改邮件应用相关代码。

并且在上一章节我们强调了如果要能够正常收发邮件,必须打开邮件服务器的SMTP功能,并且使用相应的授权码登录而非邮箱的登录密码。在开始第三章节之前还请大家好好回顾一下前两节的内容。本章节将会是本项目的终章,并且有了前两章的积累,本章的内容也会相对简单一点。

  • 本节目标

    本节在上一节的基础上实现邮件中夹带附件的功能,附件的形式为存于文件系统的文件,因此,本节需要加入文件系统。

加入文件系统

由于本节的附件功能需要文件的功能,因此我们需要在项目中加入文件系统。

打开FatFs文件系统

1、首先打开 RT-Thread Settings,点击 更多配置

2、依次打开 虚拟文件系统 - 使用设备虚拟文件系统 ,在 使能 elm chan FatFs 的框中打上勾,勾上后便会打开FatFs文件系统的具体选项,我们继续打开 使能 elm chan FatFs - elm chan 的 FatFs,通用Fat文件系统模块 ,由于我们使用的是SPI Flash,因此我们将 设置要处理的最大扇区大小 设为 4096。

修改完后保存配置,由于本项目是基于原有的WIFI例程,而WIFI例程中已经包含了一个完整的文件系统功能所需的flash操作、分区操作等软件包和组件,所以我们在本节中就无需再加入这些组件,如果是一个全新的项目的话,那要实现一个文件系统就不仅仅是打开FatFs这一个操作了。我们在这里着重于邮件功能,因此对于这些细节就不再赘述,如有兴趣或者对其中的原理不明白的读者可以去RT-Thread官方文档查看有关文件系统的知识。

保存完后,我们的Fatfs文件系统相关文件就被加入到了工程中,而我们无需对其进行修改。

同样的,由于我们更新了软件包,因此我们的一些库与路径的配置被删除,我们需要重新加回来,步骤与内容与前两节的一模一样,如果遗忘了可以再去查阅前两节关于库与路径的配置。

此时,现在我们的文件系统还不能正常运行起来,我们需要对其进行一个初始化。

初始化FatFs文件系统

根据RT-Thread官方的文档可知,文件系统的初始化过程一般分为以下几个步骤:

1、初始化 DFS 组件。

2、初始化具体类型的文件系统。

3、在存储器上创建块设备。

4、格式化块设备。

5、挂载块设备到 DFS 目录中。

其中,第一项和第二项都是基于RT-Thread的自动初始化机制初始化好的,因此我们需要做的就是后面三个步骤。

为了操作的简便,我们直接在 main.c 中定义如下函数:

static int filesystem_init(void)
{
    //在存储器上创建块设备,名为filesystem
    struct rt_device *flash_dev = fal_blk_device_create("filesystem");
    if (flash_dev == NULL)
    {
      LOG_E("Can't create a block device on filesystem partition.");
    }
    else
    {
      LOG_D("Create a block device on the filesystem partition of flash successful.");
    }

    /* 挂载 spi flash 中名为 "filesystem" 的分区上的文件系统 */
    if (dfs_mount(flash_dev->parent.name, "/", "elm", 0, 0) == 0)
    {
        LOG_I("Filesystem initialized!");
    }
    else
    {
        LOG_E("Failed to initialize filesystem!");
        //挂载不成功,格式化文件系统
        dfs_mkfs("elm", "filesystem");
        //重新挂载
        if (dfs_mount(flash_dev->parent.name, "/", "elm", 0, 0) == 0)
        {
         LOG_I("Filesystem initialized!");
        }
        else
        {
          LOG_E("Failed to initialize filesystem!");
          return -1;
        }
    }
    return 0;
}

该函数完成了文件系统的初始化工作,可以看到,首先其创建了一个名为 filesystem 的块设备,然后尝试将其挂载,若挂载不成功,可能是第一次使用导致,所以需要给它格式化一次文件系统,然后再次挂载。挂载成功后,文件系统便可正常使用。

定义好函数后我们即可在 main 函数中调用,这里需要注意的是,由于我们的文件系统初始化操作是基于 fal 分区的,所以在初始化文件系统之前理论上应该先调用 fal_init() 初始化 fal 功能,但是在这里我们的 wifi 初始化中已经包含了 fal 的初始化,因此我们无需再手动初始化一次。不过相对应的,我们的文件系统初始化函数就需要放在 wifi 初始化函数 rt_hw_wlan_wait_init_done(500); 之后:

修改完后,我们编译并且下载代码,观察串口终端的信息:

我们看最后两行,倒数第二行提示初始化文件系统失败,因为我们是第一次使用,还没有格式化,因此无法正常挂载,此时我们的代码会让其自动格式化并且再次挂载,从而得到最后一行的成功提示。当然,格式化文件系统不会每次上电都运行一遍,一般只要格式化一次,并且使用过程中没有遇到一些问题导致文件系统损坏,那么以后重启的时候都不需要再次格式化。

我们输入一个创建文件夹的命令 :mkdir test 创建一个名为 test 的文件夹,等待系统响应,如果没有错误信息,则再输入 ls 命令查看我们的文件夹是否创建成功:

如果如上图所示,那么我们的文件夹已经创建成功,这也就意味着我们的文件系统已经成功加入。

加入附件

如果你成功抵达了这里,那么恭喜你,你离项目完成只差一步之遥了!

还记得在第二节中被我们注释掉的邮件例程的代码吗?我们打开 smtp_client 中的 smtp_client_example.c 文件,找到 smtp_thread 函数中的 while(1) ,此时你应该能看到上一节被我们注释掉的那三行代码,现在将其注释去掉:

这里加入了两个附件,分别是 a.txt b.txt , 由于我们刚刚将文件系统加入,其中还没有任何文件,自然也就没有这两个文件,所以我们需要创建这两个文件。

我们打开串口终端,输入 echo HELLO a.txt ,这条命令创建了 a.txt 文件,并且在里面写入了 HELLO 字符串,创建完成后我们可以通过 ls 命令查看我们的文件是否成功创建,如果要查看文件的内容,可以使用 cat + 文件名 的命令查看:

可以看到,我们成功创建了a.txt文件,并且内容也正确。

我们再使用 echo WORLD b.txt 创建 b.txt 文件。

到这里,我们所有的工作都已经完成。编译并下载。待开发板连上网络并获取到IP,在终端中输入 smtp_test 命令开启邮件测试:

看到成功信息后,我们查看一下我们的收件箱:

可以看到邮件已被成功接收,并且后面多了一个附件标志,这表明我们的附件已经成功发送。点击进入查看详细信息:

可以看到内容正常,并且附件也是全部都接收到,最后我们下载查看附件内容是否正确:

可以看到,两个附件都是没有问题的,其内容就是我们写入的内容。至此,我们的项目也就全部完成。

  • 结语

本项目基于潘多拉开发板,并且使用 RT-thread Studio 进行开发,实现了一个带附件的邮件发送功能,当然本文章只是带领大家了解并学会邮件功能的基本使用与开发,侧重于快速实现演示效果,如果你需要应用到实际的项目中,那么一定不能照搬文中的代码,需要根据你的项目需求进行代码的规范与优化。

并且,文中包含了太多的知识点不能一一进行说明,特别是我们的代码是基于 IOT_Board SDK 的其中一个例程来开发,里面早已帮我们配置好了许多基础组件与软件包,使得我们的工作量大大减小,如果从零开发,其工作量与代码量远远不止文中所描述的那么多。因此如果对RT-Thread的一些组件与软件包有兴趣并且想了解,那么一定要去RTT的官方文档与软件包的主页去查看。

本章结束

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WKJay_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值