二十二、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)
                ;
        }
    }
}

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官方库链接

本章例程链接

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值