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

news/2024/12/1 20:39:02/

文章目录

  • 1 前言
  • 2 简介
    • 2 .1 什么是SMTP?
    • 2.2 SMTP是如何工作的?
    • 2.3 SMTP、IMAP和POP3
    • 2.4 SMTP应用场景
  • 3 WIZnet以太网芯片
  • 4 SMTP发送邮件示例概述以及使用
    • 4.1 流程图
    • 4.2 准备工作核心
    • 4.3 连接方式
    • 4.4 主要代码概述
    • 4.5 结果演示
  • 5 注意事项
  • 6 相关链接

1 前言

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

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

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 structurewiz_NetInfo get_info;/* MCU init */stdio_init_all();     // Initialize the main control peripheralwizchip_initialize(); // Initialize the chip interface/*dhcp init*/DHCP_init(SOCK_DHCP, ethernet_buf);                                   // DHCP initializationadd_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 Informationprint_network_information(&get_info); // Read back the configuration information and print itdo_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官方库链接

本章例程链接

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


http://www.ppmy.cn/news/1208539.html

相关文章

学习c#的第一天

目录 C# 简介 C# 强大的编程功能 C# 开发环境 .Net 框架&#xff08;.Net Framework&#xff09; C# 的集成开发环境 C# 有用的网站 C# 程序结构 C# 简介 C# 是一种由微软开发的现代、通用的面向对象编程语言&#xff0c;它已经得到了Ecma和ISO的认可。 C#最初是在.NE…

Bean的循环依赖问题

2023.11.10 通俗来讲&#xff0c;循环依赖指的是一个实例或多个实例存在相互依赖的关系&#xff08;类之间循环嵌套引用&#xff09;。比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 正常调用这两对象不会出现问题&am…

如何配置React-Router?

要配置React Router&#xff0c;需要按照以下步骤进行操作&#xff1a; 1&#xff1a;安装React Router依赖&#xff1a;在项目根目录下运行以下命令&#xff0c;使用npm或者yarn安装React Router相关的包。 npm install react-router-dom或 yarn add react-router-dom2&…

【函数讲解】botorch中的函数 is_non_dominated():用于计算非支配(non-dominated)前沿

# 获取训练目标值&#xff0c;计算Pareto前沿&#xff08;非支配解集合&#xff09;&#xff0c;然后从样本中提取出Pareto最优解。train_obj self.samples[1]pareto_mask is_non_dominated(train_obj)pareto_y train_obj[pareto_mask] 这里用到了一个函数 is_non_dominated…

【字符串】【双指针翻转字符串+快慢指针】Leetcode 151 反转字符串中单词【好】

【字符串】【双指针翻转字符串快慢指针】Leetcode 151 反转字符串中单词 解法1 双指针翻转字符串快慢指针更新数组大小 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- ---------------&#x1f388;&#x1f388;解答链接…

爆肝一文,走进大名鼎鼎的HTTP协议(通俗白话+三万字超详细+抓包工具使用)

文章目录 前言1. HTTP 是什么1.1 HTTP 完整请求流程1.2 理解 HTTP 协议的工作过程 2. HTTP 协议格式2.1 抓包工具的使用2.2 抓包工具的原理2.3 抓包结果2.4 协议格式总结 3. HTTP 请求(Request)3.1 认识 URL(Uniform Resource Locator)URL 基本格式关于 URL encode 3.2 认识请求…

调试代码0

dev_update_off () * read_image (Image, C:/Users/Public/Documents/MVTec/HALCON-12.0/examples/images/smd/smd_on_chip_01.png) read_image (Image, D:/图像文件/图片/图片/基板/20230609-103004-0.bmp) get_image_size (Image, Width, Height) * dev_close_window () * de…

Linux: loop device 简介

文章目录 1. 前言2. 什么是 loop device?3. loop device 典型应用场景4. 内核 loop device 支持5. loop device 相关工具6. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 什么是 lo…