使用Rust发送邮件


SMTP协议与MIME协议


SMTP(简单邮件传输协议,Simple Mail Transfer Protocol)是一种用于发送和接收电子邮件的互联网标准通信协议。它定义了电子邮件服务器如何相互发送、接收和中继邮件。SMTP 通常用于发送邮件,而邮件的接收通常由 POP(邮局协议)或 IMAP(互联网消息访问协议)来处理。

POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S

因特网信息访问协议(缩写为IMAP,以前称作交互邮件访问协议)是一个应用层协议,用来从本地邮件客户端(如Microsoft Outlook、Outlook Express、Foxmail、Mozilla Thunderbird)访问远程服务器上的邮件。

SMTP 的作用包括:

  1. 邮件发送:它允许用户通过电子邮件客户端(如 Outlook、Thunderbird 等)发送邮件。
  2. 邮件中继:SMTP 服务器可以将邮件从一个服务器转发到另一个服务器,最终到达收件人的邮箱服务器。
  3. 邮件排队:如果目标服务器不可用,SMTP 服务器可以将邮件保存在队列中,稍后再次尝试发送。

SMTP 基于 TCP(传输控制协议),而不是 UDP(用户数据报协议)。TCP 提供了一种可靠的方式来确保数据包的顺序和完整性,这对于电子邮件传输非常重要。

尽管 SMTP 非常有效于处理文本信息的发送,但它本身并不支持非文本附件(如图片、视频、文档等)。


MIME扩展了电子邮件标准,使其能够支持:
非ASCII字符文本;
非文本格式附件(二进制、声音、图像等);
由多部分(multiple parts)组成的消息体;
包含非ASCII字符的头信息(Header information)

MIME(多用途互联网邮件扩展,Multipurpose Internet Mail Extensions)协议, 是一种扩展 SMTP 的标准,使电子邮件能够支持诸如文本、图像、音频和视频等不同格式的内容,以及多部分消息体和字符编码。通过 MIME,电子邮件能够包含丰富的多媒体内容,这在现代通信中是非常必需的。




使用Rust发送邮件


在 Rust 中发送电子邮件可以通过使用第三方库来实现,例如 lettre库[1]lettre 提供了发送邮件的功能,包括与 SMTP 服务器的交互。此外,可能还需要使用 mime 库来设置邮件内容的类型。

lettremime 库添加到项目的 Cargo.toml 文件中:

[dependencies]
lettre = "0.11.2"
mime = "0.3"

可用以下代码来发送一封简单的电子邮件:

use lettre::{transport::smtp::authentication::Credentials, Message, SmtpTransport, Transport};
use std::error::Error;

fn send_email() -> Result<(), Box<dyn Error>> {
    let from = "xxxx"// 发件邮箱
    let to = "yyyy@163.com"// 收件邮箱

    let email = Message::builder()
        .from(from.parse()?)
        .to(to.parse()?)
        .subject("Rust Email Test")
        .body("Hello from Rust with lettre!".to_string())?;

    let smtp_server = "smtp.qq.com"// 根据邮件服务商而定
    let smtp_username = "xxxx"// 发件邮箱
    let smtp_password = "xxxxxxx"// 授权码,不同邮件服务商获取方式有所不同,可搜索解决;qq邮箱可参考 https://codeantenna.com/a/PwKbc0S5dd



    let creds = Credentials::new(smtp_username.to_string(), smtp_password.to_string());

    let mailer = SmtpTransport::relay(smtp_server)?
        .credentials(creds)
        .build();

    match mailer.send(&email) {
        Ok(_) => println!("Email sent successfully"),
        Err(e) => eprintln!("Could not send the email: {:?}", e),
    }

    Ok(())
}

fn main() {
    if let Err(e) = send_email() {
        eprintln!("An error occurred: {}", e);
    }
}
alt
alt
alt

cargo run执行以上代码,邮件发送成功

alt


参考资料

[1]

lettre库: https://github.com/lettre/lettre

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

响应式绑定<a-textarea>的内容

项目中的 <a-textarea>组件需要自动填入下方数据表的物品名称数量单位&#xff0c;效果如下&#xff1a; 尝试 <a-textarea>{{插值}}</a-textarea>&#xff0c;实现不了&#xff0c;问ai得知需要使用v-decorator 指令的initialValue 属性 问&#xff1a; 如何…

js数组的方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、push()&&pop() unshift()&&shift()1、push()&#xff1a;向数组的末尾添加一个或多个元素&#xff0c;并返回新的长度2、pop()&#xff1a;删除…

地震烈度速报与预警工程成功案例的经验分享 | TDengine 技术培训班第一期成功落地

近日&#xff0c;涛思数据在成都开设了“国家地震烈度速报与预警工程数据库 TDengine、消息中间件 TMQ 技术培训班”&#xff0c;这次培训活动共分为三期&#xff0c;而本次活动是第一期。其目标是帮助参与者深入了解 TDengine 和 TMQ 的技术特点和应用场景&#xff0c;并学习如…

pybullet安装时出现fatal error C1083: 无法打开包括文件: “string.h”: No such file or directory

pybullet安装时出现fatal error C1083: 无法打开包括文件: “string.h”: No such file or directory 报错原文&#xff1a; -----CloneTreeCreator.cppD:\Program_Professional\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.38.33130\include\cstring(11): fat…

uni-app获取音频播放时长

在uni-app中&#xff0c;你可以使用uni.createInnerAudioContext()来创建一个内部音频上下文&#xff0c;然后通过这个对象来获取音频的播放时长。以下是一个示例代码&#xff1a; // 创建一个内部音频上下文对象 const audioContext uni.createInnerAudioContext();// 设置要…

腾讯云服务器如何买(购买腾讯云服务器的详细步骤)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

canal 数据同步组件

canal 数据异构组件 为啥要使用这个组件&#xff1f; 在更新DB的时候不同步更新到redis&#xff0c;es等数据库中&#xff0c;时间太久&#xff0c;而且可能会存在同步失败的问题&#xff0c;因此引入canal去拉取DB的数据&#xff0c;再去更新到redis&#xff0c;es等数据库中&…

LeetCode刷题笔记之字符串

一、反转字符串 1. 344【反转字符串】 **题目&#xff1a;**编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。代码&am…

python初试六

之前了解了&#xff1a; 创建Django项目 数据库 模板 表格提交 admin管理页面 上面的功能模块允许我们做出一个具有互动性的站点&#xff0c;但无法验证用户的身份。我们这次了解用户验证部分。通过用户验证&#xff0c;我们可以根据用户的身份&#xff0c;提供不同的服务。 …

TiDB SQL调优案例TiFlash

背景 早上收到某系统的告警tidb节点挂掉无法访问&#xff0c;情况十万火急。登录中控机查了一下display信息&#xff0c;4个TiDB、Prometheus、Grafana全挂了&#xff0c;某台机器hang死无法连接&#xff0c;经过快速重启后集群恢复&#xff0c;经排查后是昨天上线的某个SQL导…

openwrt源码编译

下载openwrt源码 git clone https://github.com/openwrt/chaos_calmer.git // 官方下载地址 当前我们基于15.05版本开发&#xff0c;如果开发者想用最新的OpenWRT系统&#xff0c;可以下载 https://github.com/openwrt/openwrt.git git clone https://github.com/Ying-Yun/o…

OpenGL 绘制Mesh数据(Qt)

文章目录 一、简介二、实现代码三、实现效果一、简介 Mesh数据的结构主要就是点与三角面片,因此本质上仍然是对三角面片进行绘制。这里我们借助VCG这个库实现对Mesh数据的读取,这个库相对简单轻巧,很方便使用。 二、实现代码 由于修改的部分很多,我们逐一进行解释一下: --…

Seata 中封装了四种分布式事务模式,分别是: AT 模式, TCC 模式, Saga 模式, XA 模式,

文章目录 seata概述Seata 中封装了四种分布式事务模式&#xff0c;分别是&#xff1a;AT 模式&#xff0c;TCC 模式&#xff0c;Saga 模式&#xff0c;XA 模式&#xff0c; 今天我们来聊聊seata seata 概述 在微服务架构下&#xff0c;由于数据库和应用服务的拆分&#xff0c…

计算机专业校招常见面试题目总结

博主面试岗位包括&#xff1a;java开发、软件测试、测试开发等岗位&#xff0c;基于之前经历的面试总结出的一些常见题目。仅供参考&#xff0c;互相学习&#xff01;&#xff01; 八股&#xff1a;java开发、测试、测开岗位 Java技术栈&#xff1a;Java基础、JVM、数据结构、…

【SAM系列】Auto-Prompting SAM for Mobile Friendly 3D Medical Image Segmentation

论文链接&#xff1a;https://arxiv.org/pdf/2308.14936.pdf 核心&#xff1a; finetune SAM,为了不依赖外部prompt&#xff0c;通过将深层的特征经过一个编-解码器来得到prompt embedding&#xff1b;finetune完之后做蒸馏

PTA-感染人数

设某住宿区域是一个nn的方阵&#xff0c;方阵中的每个小方格为一个房间&#xff0c;房间里可能住一个人&#xff0c;也可能空着。第一天&#xff0c;某些房间中住着的人得了一种高传染性的流感&#xff0c;以后每一天&#xff0c;得流感的人会使其邻居&#xff08;住在其上、下…

76 Python开发-内外网收集Socket子域名DNS

目录 Python开发相关知识点本篇文章涉及知识点演示案例:IP&Whois&系统指纹获取代码段-外网CDN&子域名&端口扫描&交互代码段-外网IP&计算机名&存活主机&端口扫描代码段-内网Py格式解析环境与可执行程序格式转换-Pyinstaller 涉及资源&#xff1…

git 学习 之一个规范的 commit 如何写

最好的话做一件完整的事情就提交一次

WPF 显示gif动态图

WPF显示gif动态图有以下几种方式&#xff1a; 使用Storyboard使用WpfAnimatedGif(NuGet包管理器安装WpfAnimatedGif)使用ImageAnimator使用Winform控件PictureBox使用MediaElement通过GifBitmapDecoder解析GIF图片&#xff0c;获取gif帧数和每一帧数据&#xff0c;然后通过时间…

一种删除 KubeSphere 中一直卡在 Terminating 的 Namespace--KubeSphere Logging System的简单方法

文章目录 一、问题提出二、删除方法1&#xff0c;获取kubesphere-logging-syste的详细信息json文件2&#xff0c;编辑kubesphere-logging-system.json3&#xff0c;执行清理命令 三、检查结果 一、问题提出 在使用 KubeSphere 的时候发现有一个日志服务KubeSphere Logging Sys…