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

2023-11-10 18:28

本文主要是介绍二十二、W5100S/W5500+RP2040树莓派Pico<SMTP发送邮件>,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

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

本章例程链接

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

这篇关于二十二、W5100S/W5500+RP2040树莓派Pico<SMTP发送邮件>的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384473

相关文章

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

树莓派5_opencv笔记27:Opencv录制视频(无声音)

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi)  本人所用树莓派5 装载的系统与版本如下:  版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今天就水一篇文章,用树莓派摄像头,Opencv录制一段视频保存在指定目录... 文章提供测试代码讲解,整体代码贴出、测试效果图 目录 阶段一:录制一段

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示; 代码如下: Demo07.jrxml <?xml version="1.0" encoding="UTF-8"?><!-- Created with Jaspersoft Studio version 6.6.

1-8 图像腐蚀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernel=np.ones((2,2),np.uint8) _, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) eroded_image=cv2.erode(binary_image,kernel,iterations=1) eroded_image2=cv2.ero

node.js实现阿里云短信发送

效果图 实现 一、准备工作 1、官网直达网址: 阿里云 - 短信服务 2、按照首页提示依次完成相应资质认证和短信模板审核; 3、获取你的accessKeySecret和accessKeyId; 方法如下: 获取AccessKey-阿里云帮助中心 4、获取SignName(签名名称)和 TemplateCode(模板code); 二、代码实现 1、项目结构 【/c

springboot项目编写发送异常日志到企微工具包

1.创建基础Bean public final class ThreadFactory implements java.util.concurrent.ThreadFactory {private static final AtomicInteger poolNumber = new AtomicInteger(1);private final ThreadGroup group;priva

【抽代复习笔记】28-群(二十二):四道子群例题

例1:证明,循环群的子群是循环群。 证:设G = (a),H ≤ G。 (1)若H = {e},则H是一阶循环群; (2)设H至少包含2个元素,即设H = {...,a^(-k),a^(-j),a^(-i),a^0,a^i,a^j,a^k,...}, 其中a^i是H中正指数最小的元素,0<i<j<k, 下证a^i是H的生成元: 对任意的a^t∈H(t∈Z),存在q∈Z,使得t = qi

怎么利用NodeJS发送视频短信

随着5G时代的来临,企业的数字化转型步伐日益加快,视频短信作为新兴的数字营销工具,正逐步展现出其大的潜力。视频群发短信以其独特的形式和内容,将图片、文字、视频、声音融为一体,为用户带来全新的直观感受,为企业营销注入新的活力。 支持免费对接试用乐讯通PaaS平台 找好用的短信平台,选择乐讯通,短信群发|短信平台|群发短信软件|群发短信平台|乐讯通PaaS平台http://yun.loktong