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

本章例程链接

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/128154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常见产品结构四大类型 优劣势比较

一般&#xff0c;我们通过产品架构来构建用户体验&#xff0c;这样可以提供更清晰的导航和组织、优化用户流程和交互、增强产品的可扩展性和可维护性&#xff0c;提升用户的满意度和忠诚度。如果没有明确的产品结构&#xff0c;可能会导致功能冗余或功能缺失、交互流程混乱等问…

「Verilog学习笔记」使用generate…for语句简化代码

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 generate…for语句是Verilog HDL语言特有的语句&#xff0c;使用循环结构编写可综合的多个形式相近的代码&#xff0c;循环变量必须由特定关键字genvar声明。 timesca…

VSD Viewer v6.16.1(Visio绘图文件阅读器)

VSD Viewer是一款可以打开和查看Microsoft Visio文件的工具&#xff0c;适用于Windows和macOS操作系统。它具有以下优点&#xff1a; 直观易用&#xff1a;VSD Viewer的用户界面非常简单直观&#xff0c;易于使用。支持多种文件格式&#xff1a;VSD Viewer支持多种Visio文件格…

二维码解码器怎么用?快速分解二维码图片的方法

现在很多人会将链接网址生成二维码之后来使用&#xff0c;这种方式能够让别人更快的获取链接的内容&#xff0c;而且扫码访问内容的方式也更适合大家的使用习惯。那么如果想要获取二维码中的链接时&#xff0c;一般会使用二维码解码器来处理&#xff0c;那么具体该怎么使用呢&a…

驱动基石之_tasklet中断下半部_工作队列_中断线程化处理

tasklet中断下半部 linux的中断分为两个部分&#xff1a; 1.中断上半部&#xff1a;在中断上半部期间&#xff0c;不允许被其他中断打断&#xff0c;直到中断上半部的服务函数执行完。 2.中断下半部&#xff1a;中断下半部&#xff0c;在执行中断下半部服务函数的期间&#xf…

断点续传-http中Header参数Range(分段请求基础)

文章目录 Range请求头信息介绍RangeIf-Range 响应头Content-RangeAccept-Ranges 需要用到几个http头 rangeif-rangecontent-rangeaccept-range 断点续传的优缺点 好处&#xff1a;防止大文件下载过程出现网络异常&#xff0c;而前功尽弃。缺点&#xff1a;要发起多次请求&…

echarts 圆环图 高亮事件 切换 中心文字

createEcharts() {let chartDom this.$refs.echartsthis.Echarts echarts.init(chartDom)let option {title: {text: 128, //主标题文本subtext: 总数, //副标题文本left: center,top: 32%,textStyle: {fontFamily: Montserrat-MediumItalic,fontSize: 30,color: #fff,align…

构建全面预算体系,加强企业风险管理

全面预算管理体系是帮助企业实现其战略目标的重要手段。随着预算管理理念备受重视&#xff0c;这种新型的企业管理模式通过高效科学的方式和工具&#xff0c;在我国新时代背景下&#xff0c;逐渐成为了企业经营运作过程中针对挑战的有效措施。通常情况下&#xff0c;企业将全面…

Vue、fabricJS 画布实现自由绘制折线

作者GitHub&#xff1a;https://github.com/gitboyzcf 有兴趣可关注 Vue3代码&#xff0c;Vue2相似改吧改吧 前言 Fabric.js Fabric.js&#xff08;英文官网&#xff09;是一个强大而简单的 Javascript HTML5画布库&#xff08;也就是针对canvas进行的封装操作&#xff0c;使…

Java设计模式-创建者模式-工厂模式

工厂模式 工厂模式简单工厂模式工厂方法模式抽象工厂模式 工厂模式 要求&#xff1a;由一个特定的工厂提供所需的对象&#xff0c;由工厂来完成对象的创建 工厂模式一般分为三种&#xff1a;简单工厂模式&#xff0c;工厂方法模式&#xff0c;抽象工厂模式 其中简单工厂模式不…

SSL证书优惠购买,HTTPS证书双11价格

SSL证书优惠购买哪里有&#xff1f;如何申请HTTPS证书&#xff1f;就看沃通2023“双十一限时特惠”活动&#xff0c;精选HTTPS证书、国密HTTPS证书年度优惠好价&#xff0c;单域名SSL证书、通配符SSL证书任您选择&#xff01;沃通优惠价格、服务优势&#xff0c;访问沃通CA官网…

为什么说软文推广中了解用户是关键?

数字化时代下软文成为众多企业推广品牌的方式之一&#xff0c;所谓软文&#xff0c;就是指以向用户提供信息&#xff0c;并将产品隐含在信息中的柔性手段。 想要使软文效果明显&#xff0c;就必须深入了解用户&#xff0c;把握其需求、兴趣和行为特点&#xff0c;这也是今天媒…

白嫖阿里云服务器,速看!数量不多

白嫖阿里云服务器攻略来了&#xff0c;在阿里云免费试用中心可以申请免费服务器&#xff0c;但是阿里云百科不建议选择免费的&#xff0c;只有3个月使用时长&#xff0c;选择99元服务器不是更香&#xff0c;2核2G配置3M固定带宽&#xff0c;一年99元&#xff0c;重点是新老用户…

react 修改less文件后保存,内存溢出,项目崩溃问题解决

一、完整报错 一个很老的react项目&#xff0c;因为没有package-lock.json版本锁&#xff0c;导致拉下来的时候&#xff0c;安装的依赖版本冲突&#xff0c;好不容易启动起来&#xff0c;修改less文件后只要一保存&#xff0c;项目就会崩溃&#xff0c;需要重启&#xff0c;报…

如何优雅的开发?试试这个低代码项目

一、前言 众所周知&#xff0c;开发一个大型的企业级系统&#xff0c;公司往往需要大量的人力做支持后盾&#xff0c;如需要需求分析师、数据库管理员、前台美工、后台程序员、测试人员等。 在快速发展中的企业里&#xff0c;尤其是中小企业&#xff0c;都是一个萝卜多个坑&…

说说React的事件机制?

一、是什么 React基于浏览器的事件机制自身实现了一套事件机制&#xff0c;包括事件注册、事件的合成、事件冒泡、事件派发等 在React中这套事件机制被称之为合成事件 合成事件&#xff08;SyntheticEvent&#xff09; 合成事件是 React模拟原生 DOM事件所有能力的一个事件…

怎么写日语开发信?写外贸日语开发信技巧?

如何写好日语开发信&#xff1f;日语开发信格式是怎么样的&#xff1f; 无论您是初学者还是有经验的营销专家&#xff0c;都需要掌握一些关键技巧&#xff0c;以确保您的邮件在日本市场取得成功。蜂邮将向您介绍怎样写一封令人印象深刻的日语开发信&#xff0c;以吸引潜在客户…

埃隆·马斯克旗下xAI推出PromptIDE工具,加速提示工程和可解释性研究

&#x1f989; AI新闻 &#x1f680; 埃隆马斯克旗下xAI推出PromptIDE工具&#xff0c;加速提示工程和可解释性研究 摘要&#xff1a;埃隆马斯克旗下人工智能初创公司xAI推出了PromptIDE工具&#xff0c;该工具是一个用于提示工程和可解释性研究的集成开发环境。通过该工具&a…

2024 年天津专升本招生实施办法(天津专升本文化报名考试时间)

2024 年天津市高职升本科招生实施办法 为做好2024年天津市高职升本科招生工作&#xff0c;天津市招生委员会高等学校招生办公室&#xff08;以下简称“市高招办”&#xff09;依据教育部、天津市有关规定&#xff0c;制定本实施办法。 一、招生章程 1&#xff0e;招生学校要制…

C语言求解:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位(约瑟夫问题)

完整代码&#xff1a; /* 有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人 退出圈子&#xff0c;问最后留下的是原来第几号的那位*/ #include<stdio.h>//约瑟夫问题 //递推关系f(n)(f(n-1)2)\mod n…
最新文章