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

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.lryc.cn/news/339327.html

相关文章:

  • mysql中的视图
  • 树莓派点亮双色LED
  • DAY27| 39. 组合总和 ,40.组合总和II ,131.分割回文串
  • 24年重庆三支一扶报名照不通过怎么处理?
  • 20240409在全志H3平台的Nano Pi NEO CORE开发板上运行Ubuntu Core16.04时跑通4G模块EC200A-CN【PPP模式】
  • 【示例】MySQL-不同case下索引的使用分析
  • MySQL表空间管理与优化(8/16)
  • 杂货铺 | Linux虚拟机Ubuntu操作系统下设置共享文件夹(以及找不到hgfs文件夹怎么办)
  • 《HF经理》:二认知误区
  • ELK日志分析系统之Zookeeper
  • 家居网购项目(Ajax验证用户名+上传图片)
  • 09 Php学习:超级全局变量
  • 【Java】SpringBoot快速整合mongoDB
  • UI设计的未来发展
  • 推荐系统学习记录——连续的嵌入空间
  • 【Entity Framework】你要知道EF中功能序列与值转换
  • 顶顶通呼叫中心中间件-SIP分机安全(mod_cti基于FreeSWITCH)
  • CountDownLatch
  • Vue3中的组合式API与选项式API:深入理解与比较
  • 接口自动化测试实战之接口概念、项目简介及测试流程问答!
  • 浏览器工作原理与实践--跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性
  • Ubuntu配置VScode的C++环境
  • 使用Code开发Django_模版和CSS
  • Llama 3下月正式发布,继续开源!
  • 有图片转成PDF文件格式的方法吗?分享图片转成PDF文件的方法
  • 数据结构---绪论
  • matlab 安装 mingw64(6.3.0),OPENEXR
  • 最新彩虹知识付费商城源码 V3.4
  • Redis实现延迟任务的几种方案
  • 一种springboot请求参数校验的实现方案