QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid

文章目录

  • 场景描述
  • 问题排查
    • 根据提示查看原因
    • 查看封装的 `message`
  • 个人简介

场景描述

  • QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid
失败原因:(550, b'The "From" header is missing or invalid. Please follow RFC5322, RFC2047, RFC822 standard protocol. https://service.mail.qq.com/detail/124/995.')
  • 源码(pthon 3.12
import smtplib
from email.header import Header
from email.mime.text import MIMETextclass Mail:def __init__(self, mail_pass, sender, receivers):# 第三方 SMTP 服务self.mail_host = "smtp.qq.com"  # 填写邮箱服务器:这个是qq邮箱服务器,直接使用smtp.qq.comself.mail_pass = mail_pass  # 填写在qq邮箱设置中获取的授权码self.sender = sender  # 填写邮箱地址self.receivers = receivers  # 填写收件人的邮箱,QQ邮箱或者其他邮箱,可多个,中间用,隔开def send(self, subject, content):message = MIMEText(content, 'plain', 'utf-8')  # 邮件内容message['From'] = Header(self.sender)  # 邮件发送者姓名# message['To'] = Header(self.receivers)  # 邮件接收者姓名message['Subject'] = Header(subject, 'utf-8')  # 发送的主题print(message)try:smtpObj = smtplib.SMTP_SSL(self.mail_host, 465)  # 建立smtp连接,qq邮箱必须用ssl边接,因此边接465端口smtpObj.login(self.sender, self.mail_pass)  # 登陆smtpObj.sendmail(self.sender, self.receivers, message.as_string())  # 发送smtpObj.quit()print(f"发送成功:sender:{self.sender} receivers:{self.receivers}")except smtplib.SMTPException as e:print(f"发送失败:sender:{self.sender} receivers:{self.receivers} ,失败原因:{e}")if __name__ == '__main__':mail = Mail("xxxx", "xxxx@qq.com", ["xxxx@gmail.com"])mail.send("titel", "content")

问题排查

根据提示查看原因

  • 看到 QQ 邮箱对 header 中的 from 有合法性校验,我们的字段格式符合要求,怀疑是字符编码问题。

查看封装的 message

  • 通过打印封装的 message 查看我们的 From 字段乱码,去掉 utf-8 编码。
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
From: =?utf-8?q?XXX=40qq=2Ecom?=
Subject: =?utf-8?q?titel?=Y29udGVudA==
  • 再次测试,正常发送邮件。
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
From: XXXXXX@qq.com
Subject: =?utf-8?q?titel?=Y29udGVudA==发送成功:sender:XXXXX@qq.com receivers:['XXXXX@gmail.com']

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

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

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

相关文章

数据仓库—主数据管理

在当今信息爆炸的时代,数据已经成为企业最重要的资产之一。然而,许多企业在管理数据时面临着挑战,其中之一就是处理不同系统中的数据不一致问题。主数据管理(Master Data Management,MDM)就是为了解决这一问…

JVM修炼之路【11】- 解决内存溢出、内存泄漏 以及相关案例

前面的10篇 都是基础的知识,包括类加载的过程 类加载的细节,jvm内存模型 垃圾回收 等等, 这一篇我们开始实战了解一下 各种疑难杂症:怎么监控 怎么发现 怎么解决 内存溢出 内存泄漏 这两个概念在垃圾回收器里面已经讲过了&#…

云原生(八)、Kubernetes基础(一)

K8S 基础 # 获取登录令牌 kubectl create token admin --namespace kubernetes-dashboard1、 NameSpace Kubernetes 启动时会创建四个初始名字空间 default:Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。 kube-node-lease: 该…

【学习】VScode修改侧边栏大小。

侧边栏不可以直接更改,所以先缩放整体界面,再改变工作区大小。 缩放整体界面: Ctrl 或 Ctrl - 。 也可以直接使用如下代码: Ctrl Shifit p 打开搜索 settings ,选择下图第一个。 然后嵌入如下代码&#xff1a…

股票价格预测 | Python使用GAN预测股票价格

文章目录 效果一览文章概述代码设计效果一览 文章概述 生成对抗网络(GAN)是一种强大的机器学习模型,用于生成以假乱真的数据。然而,使用GAN来预测股票价格可能会面临以下挑战: 数据可用性:GAN需要大量的数据进行训练,以便生成准确的输出。对于股票价格预测,历史股票价…

前端响应式布局方式及其优缺点大全

前端响应式布局方式及其优缺点大全 1. 什么是响应式布局2. 响应式布局方式有哪些1. 媒体查询布局2. Flex弹性布局3. 百分比布局4. vw/vh响应式布局5. rem响应式布局 3. 结语 1. 什么是响应式布局 对于不同宽度和高度的屏幕,通过一套代码使页面样式根据屏幕尺寸自适应…

OpenHarmony开发——Makefile方式组织编译的库移植

以yxml库为例,其移植过程如下文所示。 源码获取 从仓库获取yxml源码,其目录结构如下表: 表1 源码目录结构 名称描述yxml/bench/benchmark相关代码yxml/test/测试输入输出文件,及测试脚本yxml/Makefile编译组织文件yxml/.gitat…

基于机器学习的识别准确率不高问题

识别准确率不高,可能存在以下几个方面的原因: 数据质量:数据集中可能存在错误、不完整或与实际情况偏离的情况。数据清洗和预处理是解决这个问题的关键。 数据不平衡:某些类别的样本过多,而其他类别的样本过少&#x…

sklearn的LabelEncoder 遇到新值的解决办法

问题:sklearn的LabelEncoder函数遇到新值报错 sklearn的LabelEncoder函数,在fit结束后,对dataframe数据进行transform的时候,如果遇到了没在fit时编码规则里的新值,会出现代码报错,不同于spark的LabelEnco…

SQL中的INNER JOIN与笛卡尔积:区别与实例详解

SQL中的INNER JOIN与笛卡尔积:区别与实例详解 引言1. 笛卡尔积(Cartesian Product)定义与概念结果特点 2. INNER JOIN定义与概念结果特点 3. 区别与比较4. 实例演示5. 总结 引言 在SQL查询中,INNER JOIN和笛卡尔积(Car…

【示例】Mybatis-标签学习+Mybatis工作流程

前言 本文主要学习Mybatis相关标签的使用及Mybatis的工作流程。 文中用到的示例,代码存储位置: GitHubhttps://github.com/Web-Learn-GSF/Java_Learn_Examples父工程Java_Framework_Mybatis 基础 示例 | 初始Mybatis 数据库初始化 -- 建表 CREATE…

深入探索自然语言处理:用Python和BERT构建文本分类模型

在当今的信息时代,自然语言处理(NLP)技术正在改变我们理解和处理自然语言的方式。NLP使计算机能够解读、理解和生成人类语言,从而在多种应用中实现自动化,如聊天机器人、情感分析和文本分类。本文将详细介绍如何使用Py…

Elasticsearch安装、启动异常问题总结

安装es、kibana、ik分词器可参考:http://t.csdnimg.cn/59mEG 1. 内核过低 我们使⽤的是 centos6 ,其 linux 内核版本为 2.6 。⽽ Elasticsearch 的插件要求⾄少 3.5 以上版 本。不过没关系,我们禁 ⽤这个插件即可。 修改 elasticsearch.ym…

俄罗斯游戏市场分析与海外营销策略洞察

俄罗斯作为全球十大经济体之一,拥有广阔的游戏市场。以下是对俄罗斯游戏市场的一些关键要素的分析: 人口基础:俄罗斯人口众多,游戏用户群体庞大。根据统计数据,俄罗斯的游戏人口超过7000万,占其总人口的相当…

spring boot整合Redis监听数据变化

一、前言 Redis提供了数据变化的通知事件,可以实时监测key和value的变化,客户端可以通过订阅相关的channel来接收这些通知事件,然后做相应的自定义处理,详细的介绍可以参考官方文档Redis keyspace notifications | Docs 使用Red…

使用element-plus中的表单验证

标签页代码如下&#xff1a; // 注意&#xff1a;el-form中的数据绑定不可以用v-model&#xff0c;要使用:model <el-form ref"ruleFormRef" :rules"rules" :model"userTemp" label-width"80px"><el-row :gutter"20&qu…

一次http访问超时服务器端调试

问题&#xff1a;http访问服务器时没有返回&#xff0c;没有超时&#xff0c;一直在阻塞 处理过程&#xff1a;telnet端口能连上&#xff0c;服务端程序也不存在处理时间过长的情况。 说明tcp连接没问题。推测是客户端连接后再发起请求&#xff0c;服务端阻塞了。因为很多客户…

关于 TDengine 的时区(timeZone)问题

背景 在学习SagooIOT物联网平台使用docker部署TDengine时序数据库&#xff0c;根据时间戳&#xff08;timestamp&#xff09;ts查询上报设备数据时 发现结果跟查询条件不匹配。查询问题原因竟然是timezone时区设置问题。 查询数据结果&#xff1a; 查看容器时区&#xff1a; …

分类算法——sklearn转换器和估计器(一)

转换器&#xff08;特征工程的父类&#xff09; 实例化&#xff08;实例化的是一个转换器类&#xff08;Transformer&#xff09;&#xff09;调用fit_transform&#xff08;对于文档建立分类词频矩阵&#xff0c;不能同时调用&#xff09; 把特征工程的接口称之为转换器&…

什么是跨域?

跨域&#xff08;Cross-Origin&#xff09;指的是在Web开发中&#xff0c;一个网页的资源&#xff08;例如脚本、样式表、图片等&#xff09;请求另一个源的资源时&#xff0c;两个源的协议、域名或端口不相同。简单来说&#xff0c;当浏览器试图从一个源加载来自不同源的资源时…