• 二十二、W5100S/W5500+RP2040树莓派Pico<SMTP发送邮件>


    1 前言

      在当今信息时代,互联网已成为人们日常生活中不可或缺的一部分。电子邮件作为互联网应用中最基础、最广泛的一项服务,其传输协议——SMTP自然也扮演着举足轻重的角色。本文将带您深入了解SMTP协议的定义、特点、应用场景以及协议模型,帮助您更好地理解这一重要工具。。

      W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。本教程将介绍W5100S/W5500以太网SMTP应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。

    2 简介

    2 .1 什么是SMTP?

      SMTP简单邮件传输协议是一种应用层协议,可以在不同的服务器和计算机网络之间传输电子邮件。它通过定义通信规则来做到这一点。

    最初的模型于 1982 年推出。根据 RFC 821,用户创建连接请求。作为响应,发送方 SMTP 启动与接收方 SMTP 的双向连接。用现代术语来说,它们分别是SMTP客户端和SMTP服务器。SMTP客户端和SMTP服务器使用命令和响应进行通信(稍后会详细介绍),类似于现实生活中的对话。

    RFC 821 还定义了 SMTP 使用的模型。您可以在下图中看到该方案。

    在这里插入图片描述

    2.2 SMTP是如何工作的?

      当客户端打开与 SMTP 服务器的传输控制协议连接(TCP 连接,有时称为 TCP/IP)时,SMTP 会话开始。服务器以打开消息进行响应,该消息以代码 220 表示。此过程通常称为 SMTP 握手。

      然后,客户端发送 HELO 命令并标识自身。它通常使用域名或 IP 地址跟进命令。用非技术性的话来说,客户说,“你好,我的名字是客户约翰,我正在从 gmail.com 发送电子邮件,我的 IP 是 192.0.2.0”。服务器使用代码 250 进行响应。

    在这里插入图片描述

      之后,电子邮件传输阶段将开始。电子邮件内容将使用 MAIL FROM (john@gmail.com)、RCPT TO (oliver@gmail.com) 和 DATA(“嘿,你好吗?”)命令逐步传输。如果服务器接受,客户端将传输电子邮件标头。一旦传输完所有内容,就必须使用行尾指示器。

    在这里插入图片描述

      如果发送成功,服务器将以代码 250 进行响应。客户端将使用 QUIT 命令启动 SMTP 连接的终止,服务器将关闭代码为 221 的传输通道。

    2.3 SMTP、IMAP和POP3

      除了 SMTP,最常见的电子邮件协议是 IMAP 和 POP3。SMTP 是用于发送和传递电子邮件的出站电子邮件服务器。IMAP 和 POP3 是用于从电子邮件服务器检索传入邮件的邮件访问协议。

      IMAP 是一种 Internet 邮件访问协议,它连接到服务器并根据请求下载邮件。连接终止后,消息不会被删除。使用 IMAP,用户可以从任何计算机或设备访问他们的电子邮件。

      POP3 或邮局协议 3 也连接到服务器,但它会下载所有收到的邮件。完成后,它将从服务器中删除所有电子邮件。与 IMAP 不同,POP3 与设备相关。

    在这里插入图片描述

    2.4 SMTP应用场景

    SMTP协议广泛用于以下场景:

    1.企业内部邮件的安全传输

    2.在线银行交易的安全通信

    3.电子商务平台的交易确认

    4.社交网络的账户验证

    5.新闻媒体的订阅通知

    6.企业与客户之间的沟通桥梁

    3 WIZnet以太网芯片

    WIZnet 主流硬件协议栈以太网芯片参数对比

    ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
    W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max.25Mbps
    W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max.25Mbps
    W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max 15Mbps
    1. W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
    2. W6100 支持IPv6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
    3. W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。

    4 SMTP发送邮件示例概述以及使用

    4.1 流程图

      程序的运行框图如下所示:

    在这里插入图片描述

    4.2 准备工作核心

    软件

    • Visual Studio Code
    • WIZnet UartTool

    硬件

    • W5100S IO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
    • Micro USB 接口的数据线
    • TTL 转 USB
    • 网线

    4.3 连接方式

    • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)

    • 通过TTL串口转USB,连接UART0 的默认引脚:

      • RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
      • RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
    • 使用模块连接RP2040 进行接线时

      • RP2040 GPIO16 <----> W5100S MISO
      • RP2040 GPIO17 <----> W5100S CS
      • RP2040 GPIO18 <----> W5100S SCK
      • RP2040 GPIO19 <----> W5100S MOSI
      • RP2040 GPIO20 <----> W5100S RST
    • 通过PC和设备都通过网线连接路由器LAN口

    4.4 主要代码概述

      我们使用的是WIZnet官方的ioLibrary_Driver库。该库支持的协议丰富,操作简单,芯片在硬件上集成了TCP/IP协议栈,该库又封装好了TCP/IP层之上的协议,我们只需简单调用相应函数即可完成协议的应用。

    第一步:在smtp_client.c文件中引用对应的库文件。

    第二步:宏定义DHCP、DNS、SMTP用到的socket号以及协议交互缓存大小,DHCP和DNS重试次数。

    第三步:定义三个函数,包括一个1秒定时器回调函数(用于处理DHCP和DNS超时处理),一个设置网络地址函数,一个DNS解析函数(用于解析SMTP服务器地址)。

    第四步:定义全局变量,包括静态IP地址信息,协议交互过程的收发缓存空间,以及SMTP需要用到的参数等。

    第五步:主函数首先是对串口和SPI进行初始化以及链路检测。然后是设置W5100S的网络地址,首先使用DHCP的方式进行获取,失败后使用预设的静态IP地址。然后将SMTP报文初始化,这一步主要是将我们的收件人,发件人等信息转换为SMTP报文。然后是DNS的初始化操作,完成之后会进行DNS解析,将SMTP服务器的域名解析为IP地址。最后是连接SMTP服务器并发送邮件啦。

    #include "wizchip_conf.h"
    #include "bsp_spi.h"
    #include "dhcp.h"   // Use dhcp
    #include "socket.h" // Use socket
    #include "dns.h"    //Use dns
    #include "smtp.h"   //Use smtp
    
    #define SOCK_DHCP 0 // DHCP SOCKET
    #define SOCK_DNS 1  //DNS SOCKET
    #define SOCK_SMTP 2                      // SMTP SOCKET
    #define ETHERNET_BUF_MAX_SIZE (1024 * 2) // Send and receive cache size
    #define DHCP_RETRY_COUNT 5               // DHCP retry times
    #define DNS_RET_FAIL 0
    #define DNS_RET_SUCCESS 1
    #define DNS_RETRY 5 /* 5 times */
    
    bool repeating_timer_callback(struct repeating_timer *t);
    void network_init(wiz_NetInfo *conf_info);
    void do_dns(uint8_t *domain_name, uint8_t *remote_ip);
    
    /* Network information to be configured. */
    wiz_NetInfo net_info = {
        .mac = {0x00, 0x44, 0x55, 0x66, 0xed, 0x2e}, // Configured MAC address
        .ip = {192, 168, 1, 10},                     // Configured IP address
        .sn = {255, 255, 255, 0},                    // Configured subnet mask
        .gw = {192, 168, 1, 1},                      // Configured gateway
        .dns = {8, 8, 8, 8},                         // Configured domain address
        .dhcp = NETINFO_DHCP};                       // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.
    static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
        0,
    };
    static uint8_t http_tx_ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
        0,
    };
    static uint8_t http_rx_ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
        0,
    };
    uint8_t Domain_ip[4] = {
        0,
    };
    uint8_t Domain_name[] = "smtp.126.com";
    static uint8_t breakout_flag = 0; // Define the DHCP acquisition flag
    uint8_t Mail_Send_OK = 0;
    
    int main()
    {
        int i;
        struct repeating_timer timer; // Define the timer structure
        wiz_NetInfo get_info;
        /* MCU init */
        stdio_init_all();     // Initialize the main control peripheral
        wizchip_initialize(); // Initialize the chip interface
    
        /*dhcp init*/
        DHCP_init(SOCK_DHCP, ethernet_buf);                                   // DHCP initialization
        add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler
    
        /* mail message init*/
        mailmessage();
    
        /*dns init*/
        DNS_init(SOCK_DNS, ethernet_buf);
        printf("wiznet chip smtp example.\r\n");
        network_init(&net_info);              // Configuring Network Information
        print_network_information(&get_info); // Read back the configuration information and print it
        do_dns(Domain_name,Domain_ip);
        while (true)
        {
            do_smtp(SOCK_SMTP);
            if (Mail_Send_OK)
            {
                while (true)
                    ;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    4.5 结果演示

    在这里插入图片描述

    在这里插入图片描述

    5 注意事项

    • 邮箱必须开启SMTP模式,否则无法发送。
    • 服务器和端口号必须和使用的邮箱的服务器一致。
    • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:

    ​ (1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。

    ​ (2)在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。

    6 相关链接

    WIZnet官网

    WIZnet官方库链接

    本章例程链接

    想了解更多,评论留言哦!

  • 相关阅读:
    【机器学习】聚类【Ⅴ】密度聚类与层次聚类
    大灰狼远程管理[SVIP3会员版]易语言源码
    【HTML/CSS】入门导学篇
    【uniapp】小程序自定义一个通用的返回按钮组件
    Midjourney是什么?Midjourney怎么用?怎么注册Midjourney账号?国内怎么使用Midjourney?多人合租Midjourney拼车
    电脑小Tip---外接键盘F1-F12快捷键与笔记本不同步
    Microsoft的PromptBench可以做啥?
    Linux之yum安装MySQL
    白嫖AWS云服务器,验证、注册指南
    现代机器学习(ML)技术在医疗成像领域的新应用
  • 原文地址:https://blog.csdn.net/WIZnet2012/article/details/134337008