当前位置: 首页 > news >正文

解决使用Golang的email库发送qq邮件报错short response,错误类型为textproto.ProtocolError

问题阐述

使用email库发送QQ邮件,采用465端口:

package mainimport ("fmt""net/smtp""github.com/jordan-wright/email"
)func SendEmail(sendTo string, subject string, body string) (err error) {e := email.NewEmail()// 设置发送方的邮箱e.From = "193*******@qq.com"// 设置接收方的邮箱e.To = []string{sendTo}// 设置主题e.Subject = subject// 设置文件发送的内容e.Text = []byte(body)// e.HTML = []byte(body)// 设置服务器相关的配置err = e.Send(fmt.Sprintf("%s:%d", "smtp.qq.com", 587), smtp.PlainAuth("", "193*******@qq.com", "sdacdf********", "smtp.qq.com"))return
}
func main() {err := SendEmail("wwwwwwww@gmail.com", "测试主题",fmt.Sprintf("您的验证码为:%s,请勿泄露于他人!该验证码5分钟内有效!如非本人操作,请忽略此邮件!", "123456"))if err != nil {fmt.Println("发送验证码失败:", err)//打印错误类型fmt.Printf("%T\n", err)return}fmt.Println("发送验证码成功")
}

控制台输出下面的内容:

发送验证码失败: short response: 一串乱码
textproto.ProtocolError

但是收到了验证码:

image-20241104164852486

可能的原因

因为在SMTP发送过程中出现了意料之外的响应情况,可能是因为连接问题、网络不稳定,或是由于服务器的一些特定限制导致的短响应。尽管服务器响应中断,邮件实际上已经发送成功。

debug过程

尝试改用465加密(ssl)端口:

package mainimport ("crypto/tls""fmt""net/smtp""github.com/jordan-wright/email"
)func SendEmail(sendTo string, subject string, body string) (err error) {e := email.NewEmail()// 设置发送方的邮箱e.From = "193*******@qq.com"// 设置接收方的邮箱e.To = []string{sendTo}// 设置主题e.Subject = subject// 设置文件发送的内容e.Text = []byte(body)// e.HTML = []byte(body)// 设置服务器相关的配置// 使用 SSL 端口 465 并配置 TLStlsConfig := &tls.Config{InsecureSkipVerify: true,ServerName:         "smtp.qq.com",}err = e.SendWithTLS(fmt.Sprintf("%s:%d", "smtp.qq.com", 465), smtp.PlainAuth("", "193*******@qq.com", "sdacdf********", "smtp.qq.com"), tlsConfig)return
}func main() {err := SendEmail("wwwwwwww@gmail.com", "测试主题",fmt.Sprintf("您的验证码为:%s,请勿泄露于他人!该验证码5分钟内有效!如非本人操作,请忽略此邮件!", "123456"))if err != nil {fmt.Println("发送验证码失败:", err)//打印错误类型fmt.Printf("%T\n", err)return}fmt.Println("发送验证码成功")
}

还是报相同的错误,能够收到邮件,遂放弃封装好的email库,使用原始的smtp库,但是采用不加密的587端口:

package mainimport ("fmt""net/smtp"
)func SendEmail(sendTo string, subject string, body string) error {from := "193*******@qq.com"password := "dsfdfcf******" // 邮箱授权码smtpServer := "smtp.qq.com:587"// 邮件内容,确保包含 From 头部msg := []byte("From: Sender Name <" + from + ">\r\n" +"To: " + sendTo + "\r\n" +"Subject: " + subject + "\r\n" +"\r\n" +body + "\r\n")// 设置 PlainAuthauth := smtp.PlainAuth("", from, password, "smtp.qq.com")// 发送邮件err := smtp.SendMail(smtpServer, auth, from, []string{sendTo}, msg)if err != nil {return fmt.Errorf("发送失败: %v", err)}return nil
}func main() {err := SendEmail("193*******@qq.com", "古树林书法社团", "您的验证码为:123456,请勿泄露于他人!该验证码5分钟内有效!如非本人操作,请忽略此邮件!")if err != nil {fmt.Println(err)fmt.Printf("%T\n", err)return}fmt.Println("发送验证码成功")
}

还是报相同的错误,能够收到邮件,于是采用加密的465端口:

package mainimport ("crypto/tls""fmt""net/smtp"
)func SendEmail(sendTo string, subject string, body string) error {from := "193*******@qq.com"password := "dsfdfcf******" // 邮箱授权码smtpServer := "smtp.qq.com:465"// 设置 PlainAuthauth := smtp.PlainAuth("", from, password, "smtp.qq.com")// 创建 tls 配置tlsconfig := &tls.Config{InsecureSkipVerify: true,ServerName:         "smtp.qq.com",}// 连接到 SMTP 服务器conn, err := tls.Dial("tcp", smtpServer, tlsconfig)if err != nil {return fmt.Errorf("TLS 连接失败: %v", err)}defer conn.Close()client, err := smtp.NewClient(conn, "smtp.qq.com")if err != nil {return fmt.Errorf("SMTP 客户端创建失败: %v", err)}defer client.Quit()// 使用 auth 进行认证if err = client.Auth(auth); err != nil {return fmt.Errorf("认证失败: %v", err)}// 设置发件人和收件人if err = client.Mail(from); err != nil {return fmt.Errorf("发件人设置失败: %v", err)}if err = client.Rcpt(sendTo); err != nil {return fmt.Errorf("收件人设置失败: %v", err)}// 写入邮件内容wc, err := client.Data()if err != nil {return fmt.Errorf("数据写入失败: %v", err)}defer wc.Close()msg := []byte("From: Sender Name <" + from + ">\r\n" +"To: " + sendTo + "\r\n" +"Subject: " + subject + "\r\n" +"\r\n" +body + "\r\n")_, err = wc.Write(msg)if err != nil {return fmt.Errorf("消息发送失败: %v", err)}return nil
}func main() {err := SendEmail("193*******@qq.com", "古树林书法社团", "您的验证码为:123456,请勿泄露于他人!该验证码5分钟内有效!如非本人操作,请忽略此邮件!")if err != nil {fmt.Println("发送验证码失败:", err)//打印错误类型fmt.Printf("%T\n", err)return}fmt.Println("发送验证码成功")
}

这次控制台显示“发送验证码成功”,报错消失。

相关文章:

解决使用Golang的email库发送qq邮件报错short response,错误类型为textproto.ProtocolError

问题阐述 使用email库发送QQ邮件&#xff0c;采用465端口&#xff1a; package mainimport ("fmt""net/smtp""github.com/jordan-wright/email" )func SendEmail(sendTo string, subject string, body string) (err error) {e : email.NewEmai…...

为什么说高级工程师研究的不仅是器件的稳态,模拟器件的开关过程

高级工程师研究器件的开关过程而不仅仅是稳态&#xff0c;主要有以下几个原因&#xff1a; 1. 动态性能优化&#xff1a;开关过程中的特性&#xff0c;如上升时间、下降时间、过冲、振铃等&#xff0c;直接影响系统的性能。了解和优化这些动态特性对于提高系统的速度、精度和稳…...

Matlab实现白鲸优化算法(BWO)求解路径规划问题

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 白鲸优化算法&#xff08;BWO&#xff09;是一种受自然界白鲸捕食行为启发的新型优化算法&#xff0c;它通过模拟白鲸的群体捕猎策略和社会互动来探索问题的最优解。BWO因其强大的全局搜索能力和高效的局部搜索能…...

SQLserver索引的优化和使用

在SQL Server中&#xff0c;索引的优化和有效使用是提高查询性能的关键。以下是一些详细的步骤和最佳实践&#xff0c;帮助你优化和使用索引。 1. 理解索引类型 聚集索引&#xff08;Clustered Index&#xff09; 定义&#xff1a;表中数据的物理排序顺序与索引的逻辑顺序相…...

Linux 安装nacos

1.下载版本 https://github.com/alibaba/nacos/tags 2.解压压缩包&#xff0c;启动 (1)将压缩包放到/usr/local目录下&#xff0c;解压 tar -xvf nacos-server-2.0.0-BETA.tar.gz(2)删除压缩包 rm -f nacos-server-2.0.0-BETA.tar.gz(3) 找到nacos的mysql的数据库脚本,在数…...

水仙花判断

一个三位整数&#xff0c;如果满足条件&#xff1a;个位数的立方十位数立方百位数立方这个数&#xff0c;那么称之为“水仙花数” 编程判断一个三位整数是不是水仙花数。 输入格式: 输入一个三位整数 输出格式: 是则输出YES&#xff0c;不是输出 NO &#xff08;注意是大写字母…...

在VS中安装chatGPT

2、在VSCode中打开插件窗口 3、输入ChatGPT 4、这里有个ChatGPT中文版&#xff0c;就它了 5、安装 6、这时候侧边栏多了一个chatGPT分页图标&#xff0c;点击它 7、打个招呼 8、好像不行 9、看一下细节描述 10、根据要求按下按下快捷键 Ctrl Shift P 11、切换成国内模式 12、…...

算法笔记:Day-09(初始动态规划)

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …...

“探索未来医疗:生成式人工智能在医疗领域的革命性应用“

生成式人工智能&#xff08;GenAI&#xff09;在医疗领域的应用具有巨大的潜力和变革性&#xff0c;以下是一些关键的应用领域&#xff1a; 医学影像分析&#xff1a; GenAI模型通过深度学习技术&#xff0c;能够自动识别医学影像中的病变区域&#xff0c;提高诊断的准确性和速…...

数字IC后端实现Innovus 时钟树综合(Clock Tree Synthesis)典型案例

对于如下所示电路&#xff0c;要求以下几路做到等长&#xff0c;clock skew控制在50ps以内&#xff0c;clock tree insertion delay做到800ps! from FF/Q to FF1_1/D through the FF1 CK from FF/Q to FF2_1/D through the FF2 CK from FF/Q to FF3_1/D through the FF3 CK fr…...

Matlab应用制作入门

要在 MATLAB 中创建一个简单的应用程序&#xff0c;你可以使用 App Designer&#xff0c;这是一个用于构建交互式应用的工具。以下是一个简单的步骤&#xff0c;帮助你创建一个基本的 MATLAB 应用程序&#xff1a; 1. 打开 App Designer 在 MATLAB 命令窗口中输入 appdesigne…...

什么是声明式编程什么是函数式编程,打比方说明

在前端开发中&#xff0c;声明式编程和函数式编程是两种不同的编程范式&#xff0c;各自有其特定的理念和用法。下面详细介绍这两种编程范式&#xff0c;并通过比喻进行说明。 声明式编程 定义&#xff1a; 声明式编程是一种编程风格&#xff0c;强调“你想要什么”而不是“怎…...

SpringBoot+Shiro权限管理

Shiro是一个强大的Java安全框架&#xff0c;提供了身份验证、授权、加密、会话管理以及与Web集成等多种安全功能。以下是对Shiro权限管理的详细总结&#xff1a; 一、Shiro权限管理的基本概念 权限管理&#xff0c;一般指根据系统设置的安全规则或者安全策略&#xff0c;用户…...

前端面试题22 | 什么是跨域问题?怎么解决?

哈喽小伙伴们大家好!新的一周开始啦~距离2024年结束也仅有两个月了,不知道大家年初给自己制定的目标实现了多少?不管怎样,接下来的两个月都请继续加油哦!我们坚持下来了,我们就是最棒的! 今天,继续来给大家分享一道面试题 在开发中,我们经常会遇到跨域的问题,尤其是开发前后…...

HarmonyOS Next星河版笔记--界面开发(3)

属性 1.1.设计资源-svg图标 需求&#xff1a;界面中展示图标→可以使用的svg图标(任意放大缩小不失真、可以改变颜色) 使用方式&#xff1a; ①设计师提供&#xff1a;基于项目的图标&#xff0c;拷贝到项目目录使用 Image($r(app.media.ic_dianpu)) .width(40) fillColor…...

科研绘图系列:R语言组合连线图和箱线图(linechart+boxplot)

文章目录 介绍加载R包数据数据预处理画图1画图2系统信息介绍 连线图(Line Chart)是一种常用的数据可视化图表,它通过将一系列数据点用直线段连接起来来展示数据随时间或有序类别变化的趋势。以下是连线图可以表示的一些内容: 时间序列数据:展示数据随时间变化的趋势,例如…...

对象的接口与设计模式在其中的作用

对象的接口 对象的接口定义了对象的行为和如何与外界进行交互。以下是对象接口的详细解释&#xff1a; 成员函数&#xff08;Member Functions&#xff09; 定义&#xff1a;成员函数是定义在类中的函数&#xff0c;用于实现类的行为。成员函数可以通过对象来调用&#xff0…...

如何自学机器学习?

自学机器学习可以按照以下步骤进行&#xff1a; 一、基础知识准备 数学基础&#xff1a; 高等数学&#xff1a;学习微积分&#xff08;包括导数、微分、积分等&#xff09;、极限、级数等基本概念。这些知识是后续学习算法和优化方法的基础。 线性代数&#xff1a;掌握矩阵…...

python中应该使用while 1吗?按位运算符可以代替逻辑运算符使用吗?

while 1 很多初学者都很喜欢使用while 1&#xff0c;原因可能是&#xff0c;1只需要输入一个字符&#xff0c;更加“省事”&#xff0c;可以“偷懒”&#xff0c;并且&#xff0c;1看起来更加简洁明了。 实际上&#xff0c;在python中&#xff0c;while 1与while True是等价的…...

线程ID和线程库

在linux中&#xff0c;线程的运行可以用lwp来标识&#xff0c;只是操作系统的标识方法&#xff0c;lwp表示轻量级进程&#xff0c;在Linux中&#xff0c;进程和线程都可以用lwp来标识&#xff0c;而对于用户来说&#xff0c;也有对应的线程ID&#xff0c; 线程库 在linux中&a…...

别只盯着主控芯片!拆解STM32最小系统板:电源、时钟、复位三大支柱电路深度解析

STM32最小系统板设计进阶&#xff1a;电源、时钟与复位电路的工程实践 在嵌入式系统开发中&#xff0c;我们常常将注意力集中在主控芯片的功能实现上&#xff0c;却忽略了支撑系统稳定运行的三大基础电路——电源、时钟和复位。这些看似简单的电路模块&#xff0c;实则是整个系…...

SpringBoot WebClient 介绍

目录一、什么是 WebClient&#xff1f;二、 WebClient 能解决什么问题&#xff1f;三、WebClient 和 RestTemplate 的区别四、WebClient 的核心优势1. 非阻塞&#xff08;Non-Blocking&#xff09;2. 支持异步3. 链式 API 更现代五、WebClient 的核心对象六、Mono 和 Flux 是什…...

从Stable Diffusion到DiT:为什么说Transformer是扩散模型的下一站?

从Stable Diffusion到DiT&#xff1a;Transformer如何重塑扩散模型的未来 在图像生成领域&#xff0c;扩散模型正经历着从U-Net架构向Transformer架构的范式转移。这一转变不仅仅是技术组件的简单替换&#xff0c;而是代表着生成式AI在可扩展性、训练效率和模型容量方面的重大突…...

基于ATmega328P与TFT屏的园艺环境监控系统:硬件选型与软件架构详解

1. 项目概述&#xff1a;打造你的家庭园艺数据监控中心如果你和我一样&#xff0c;是个喜欢在阳台或后院捣鼓花草的园艺爱好者&#xff0c;同时又对电子DIY有点兴趣&#xff0c;那么这个项目绝对会让你兴奋。我们不是在简单地种花&#xff0c;而是在用数据“聆听”植物的需求。…...

问卷数据分析避坑指南:你的验证性因子分析(CFA)模型为什么总拟合不好?

问卷数据分析避坑指南&#xff1a;验证性因子分析&#xff08;CFA&#xff09;模型拟合不良的深度诊断 当你满怀期待地将精心设计的问卷数据导入统计软件&#xff0c;准备验证理论模型时&#xff0c;却发现拟合指标一片飘红——卡方值高得离谱&#xff0c;RMSEA超出临界值&…...

暗黑破坏神2存档编辑器:d2s-editor免费可视化编辑终极指南

暗黑破坏神2存档编辑器&#xff1a;d2s-editor免费可视化编辑终极指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 想要轻松修改暗黑破坏神2存档却不懂十六进制&#xff1f;d2s-editor是你的完美解决方案&#xff01;这款基于…...

抖音批量下载工具:高效获取用户主页全作品的专业解决方案

抖音批量下载工具&#xff1a;高效获取用户主页全作品的专业解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...

别再只会用spline了!MATLAB csape函数详解:从自然边界到夹持边界的实战选择

MATLAB csape函数深度解析&#xff1a;从自然边界到夹持边界的工程实践 在工程仿真和科学计算领域&#xff0c;数据插值是一个永恒的话题。当我们面对一组离散的实验数据或仿真结果时&#xff0c;如何构建一条光滑的曲线来准确反映数据背后的物理规律&#xff1f;这个问题困扰…...

机器学习记忆化:平衡隐私、公平与鲁棒性的可信AI实践

1. 项目概述与核心挑战 在机器学习领域&#xff0c;我们常常追求一个“完美”的模型&#xff1a;它既能精准地识别出图片中的猫狗&#xff0c;又能流畅地生成人类般的文本&#xff0c;还能在医疗诊断中给出可靠的建议。为了实现这些目标&#xff0c;我们投入海量数据&#xff0…...

将 Claude Code 的 API 请求无缝迁移至 Taotoken 平台

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 将 Claude Code 的 API 请求无缝迁移至 Taotoken 平台 如果你正在使用 Claude Code 作为编程助手&#xff0c;并且希望将其后端 AP…...