python发送邮件附件中文名乱码_处理 python3 邮件附件中文名乱码的问题

2023-10-31

最近接手了一个 py 机器人的开发,发现不论传入的附件路径是变量、字符串、先编码后解码的字符串都解决不了名称乱码。

打开源码一看,是这个逻辑:

def send_smtp_mail(server=None,port=25,psw=None,sender=None,receivers=None,cc=None,bcc=None,subject=None,body=None,attachments=None,ssl='no'):

'''

SMTP发送邮件

server:smtp服务器 port:端口号 psw:登陆密码 sender:发送方 receivers:接收者

cc:抄送 bcc:密抄 subject:标题 body:邮件正文 attachments:附件路径

'''

__logger.debug('smtp Send mail:[' + str(server) + '][' + str(port) + ']')

re = []

try:

msgRoot = MIMEMultipart()

#msgRoot['Subject'] = subject 构造标题

msgRoot['Subject'] = Header(subject, 'utf-8').encode()

msgRoot['Cc'] = "".join(str(cc))

msgRoot['Bcc'] = "".join(str(bcc))

msgRoot['From'] = formataddr(["", sender])

msgRoot['To'] = formataddr(["", receivers])

msgRoot.attach(MIMEText(body, 'plain', 'utf-8'))

if attachments != None:

for attachment in attachments.split(','):

rst= os.path.exists(attachment)

if rst :

excelFile = open(attachment, 'rb').read()

fileName = os.path.basename(os.path.realpath(attachment))

att = MIMEApplication(excelFile)

att.add_header('Content-Disposition', 'attachment', fileName=('gbk', '', fileName))

msgRoot.attach(att)

else:

__logger.debug(u'Attachment path does not exist')

if receivers != None and receivers != '':

re = receivers.split(',')

if cc != None and cc != '':

re = re + str(cc).split(',')

if bcc !=None and bcc != '':

re = re + str(bcc).split(',')

smtp = smtplib.SMTP()

if ssl=='yes':

smtp = smtplib.SMTP_SSL()

smtp.connect(server,port)

psw = encrypt.decrypt(psw)

smtp.login(sender, psw)

smtp.sendmail(sender,re, msgRoot.as_string())

smtp.quit()

except Exception as e:

raise e

finally:

__logger.echo_msg(u"end execute[sendMail]")

发现这里对附件的处理只是获取真正的附件名,并传入 Content-Disposition 中。在 segmentfault 查到,要给 fileName 进行两次 utf-8 编码、然后用 email.header 库的 make_header() 函数处理一次附件名、才传给 Content-Disposition 中。 修改之后的源码可以正常识别中文名字的附件了,贴一下修改后的源代码:

def send_smtp_mail1(server=None,port=25,psw=None,sender=None,receivers=None,cc=None,bcc=None,subject=None,body=None,attachments=None,ssl='no'):

'''

SMTP发送邮件

server:smtp服务器 port:端口号 psw:登陆密码 sender:发送方 receivers:接收者

cc:抄送 bcc:密抄 subject:标题 body:邮件正文 attachments:附件路径

'''

__logger.debug('smtp Send mail:[' + str(server) + '][' + str(port) + ']')

re = []

try:

msgRoot = MIMEMultipart()

#msgRoot['Subject'] = subject 构造标题

msgRoot['Subject'] = Header(subject, 'utf-8').encode()

msgRoot['Cc'] = "".join(str(cc))

msgRoot['Bcc'] = "".join(str(bcc))

msgRoot['From'] = formataddr(["", sender])

msgRoot['To'] = formataddr(["", receivers])

msgRoot.attach(MIMEText(body, 'plain', 'utf-8'))

if attachments != None:

for attachment in attachments.split(','):

rst= os.path.exists(attachment)

if rst :

excelFile = open(attachment, 'rb').read()

fileName = os.path.basename(os.path.realpath(attachment))

att = MIMEApplication(excelFile)

att.add_header('Content-Disposition', 'attachment', fileName = "%s" % make_header([(fileName, 'UTF-8')]).encode('UTF-8') )

msgRoot.attach(att)

else:

__logger.debug(u'Attachment path does not exist')

if receivers != None and receivers != '':

re = receivers.split(',')

if cc != None and cc != '':

re = re + str(cc).split(',')

if bcc !=None and bcc != '':

re = re + str(bcc).split(',')

smtp = smtplib.SMTP()

if ssl=='yes':

smtp = smtplib.SMTP_SSL()

smtp.connect(server,port)

psw = encrypt.decrypt(psw)

smtp.login(sender, psw)

smtp.sendmail(sender,re, msgRoot.as_string())

smtp.quit()

except Exception as e:

raise e

finally:

__logger.echo_msg(u"end execute[sendMail]")

所以不要迷信什么产品的内置函数,,业务开发真的有很多细节要考虑周全啊。原始答案在: https://segmentfault.com/q/1010000016296204/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python发送邮件附件中文名乱码_处理 python3 邮件附件中文名乱码的问题 的相关文章

  • 【第29篇】MAE:屏蔽自编码器是可扩展的视觉学习器

    文章目录 摘要 1 简介 2 相关工作 3 方法 4 ImageNet 实验 4 1 主要属性 4 2 与之前结果的比较 4 3 局部微调 5 迁移学习实验 6 讨论与结论 摘要 论文链接 https arxiv org abs 2111
  • js将后台返回的数据转化为树形结构(扁平数组转树状结构)

    前言 做项目使常遇到需要将后台返回的数据 转换为树状结构给用户展现 例如 这也是前端面试常考的算法题 一起来检测一下吧 步骤 准备一个空的树对象 遍历列表中的每个元素 对于每个元素 根据该元素的父级ID找到其对应的父节点 如果找到了父节点
  • 如何开始使用 Python 3 编程:入门

    Python 是世界上发展最快的编程语言 这种流行的编程语言已帮助无数设计师 科学家和工程师努力解决当今消费者和企业面临的重大问题 使用 Python 更智能地工作 什么是 Python 编程 Python 编程是编写代码以执行任务或解决问
  • 小象课堂在线授课教育系统

    此项目包含后端全部代码 前端包括后台和web界面的源码 数据库用的mysql 可当作课设或者毕设 还可写入自己的简历中 web界面展示 前端后台界面展示 用户管理 课程管理 内容配置 订单管理 系统管理 系统监控
  • 概述-数据服务是什么?

    数据服务是什么 我以前认为 数据服务 就是通过数据接口提供数据的方式的统称 就是你调用一个接口 我传给你一些数据 数据处理逻辑接口内已经封装了 用这些数据你可以处理某些问题 而直接查询数据的不是数据服务 后来看了 大数据之路 阿里巴巴大数据
  • FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列 但是在FreeRTOS中任务间的通讯还有信号量 邮箱 事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 增加邮箱部分 任务通知发送消息 Demo 202
  • mysql数据库表升级方案_一个基于mysql数据库的项目的升级解决方案小结(节选)

    1引言 数据库使用MYSQL4 0版本 随用用户数的逐步增多 因为数据库版本过低而引起的抱怨也越来越多 不足也越来越明显 首先 对产品化部署产生了制约 由于MYSQL4 0数据库的配置文件my ini是存放在Windows的系统目录下的 同
  • window域名 映射 如何将域名映射到本地IP

    域名 映射 如何将域名映射到本地IP 万网域名映射 本地电脑映射 若果是自己注册的域名 直接解析到本地 IP 127 0 0 1 就可以使用此域名来访问自己的计算机 若果是想随便制定一个域名映射到本机下面讲解 C Windows Syste
  • CTF - Base64换表

    Base64换表 CTF汇总 原题 复制保存为16进制即可得文件 IDA显示 题目解读 提示 base64程序逆向 题目特点 Base64算法特征 Base64表格 位移 等号补位 结论 Base64变体 换表 Base64变体 题外话 解
  • 字符串变换最小字符串

    题目 给定一个字符串s 最多只能进行一次变换 返回变换后能得到的最小字符串 按照字典序进行比较 变换规则 交换字符串中任意两个不同位置的字符 解题思路 1 对字符串按照字典序进行排序 找到字典序最小的字符串 2 找到这个字符串中字典序最小的
  • 区块链重要基础知识3——签名算法考量以及实现并实验

    签名以及身份的管理 1 签名 1 1 特性 仅自己可以自己特定的签名 但是别人一看就知道就可以进行验证 与特定文件关联 不能拿着我这个签名去与其他文件关联 1 2 签名算法过程 1 2 1 总的流程
  • CANOpen DS402伺服电机控制项目总结

    公司的电机控制要统一到CANOpen上面来 协议栈用的CanFestival 配合RTThread进行控制 要控制伺服电机 最先搞明白的就是控制字6040和状态字6041 一共使用过三个厂家的伺服电机 控制字都是一样的 但是状态字各家有自己
  • DevOps到底是什么意思?看完这篇不要再问我了

    提到DevOps这个词 我相信很多人一定不会陌生 作为一个热门的概念 DevOps近年来频频出现在各大技术社区和媒体的文章中 备受行业大咖的追捧 也吸引了很多吃瓜群众的围观 那么 DevOps是什么呢 有人说它是一种方法 也有人说它是一种工
  • Yolov5

    Yolov5 文章目录 Yolov5 一 Yolov5 现状 二 Yolov5 模型结构 一 Yolov5 2 0 二 Yolov5 6 0 输入端 BackBone基准网络 Head网络 三 Yolov5 模型推理流程 四 Yolov5
  • 电子科技大学软件工程期末复习笔记(八):软件维护

    目录 前言 重点一览 软件维护的定义 四种类型的维护 软件维护的必要性 软件维护的成本 软件维护的困难性 可维护性的定义 决定软件可维护性的因素 软件维护的过程模型 维护费用估算 软件再工程 软件逆向工程 本章小结 前言 本复习笔记基于王玉
  • 盘一盘 Python 系列 - Cufflinks (下)

    本文含 8890 字 37 图表截屏 建议阅读 46 分钟 0 引言 本文是 Python 系列的 Cufflinks 补充篇 整套 Python 盘一盘系列目录如下 Python 入门篇 上 Python 入门篇 下 数组计算之 NumP
  • 5G/NR 上行免授权

    上行免授权 非动态调度 就是指gNB通过激活一次上行授权给UE 在UE不收到去激活的情况下 将会一直使用第一次上行授权所指定资源进行上行传输 其有两种传输类型 配置授权type 1 由RRC通过高层信令进行配置 IE ConfiguredG
  • 【安卓逆向】爱加密so层静态分析

    因为这个是比较久远的apk 所以高版本是运行不起来的 学习的目的是了解一下以前的加固方式 也是划水 哈哈 下一次更新 我这边也打算写一篇关于小x书APP的协议分析 感兴趣的同学可以关注一下 应该就是在这几天更新 有问题也可以加我vx3481

随机推荐

  • Microchip Studio 7.0 如何编译工程项目

    Microchip Studio 7 0 系列教程 1 Microchip Studio 7 0 如何修改字体大小Microchip Studio 7 0 如何修改字体大小 2 MicroChip Studio 7 0如何快速打开 h文件
  • Linux部分参数作用讲解

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 ls help 查看ls 命令的基本用法 hel
  • NLP学习—23.基于Transformer的机器翻译实战

    文章目录 Transformer理论部分 Transformer代码实现 基于Transformer的机器翻译实战 在Transformer的代码实现的基础上 采用机器翻译数据 进行基于Transformer的机器翻译实战 数据集代码链接
  • JAVA单元测试框架-10-断言Assert

    使用Assert对结果进行断言 这是testng里的断言方式 常用断言 assertTrue assertSame assertEquals Test public void TestAssert Assert assertEquals 2
  • 如何在 SubSystem for Android 上安装应用?

    如何在 SubSystem for Android上安装应用 2022年3月19日更新 原先的 Apk文件安装程序 加入了广告 且软件源代码有盗窃原作者的嫌疑 目前不能确定 如有冒犯请谅解 所以更新此文章 这次推荐的是 来自酷友的作品 Ap
  • 命名接口约束统一

    Dao 接口命名 insert batchInsert selectOne selectByXXX count list listPage update delete Service 接口命名 add findOne findByXXX f
  • Python报错:from torchvision import _C解决办法

    原因 很有可能是torch装的是cpu 而torchvision装的是gpu版本 解决办法 到pytorch官方网站下载对应版本的torchvision cpu版本
  • python怎么打包_如何将一整个python工程打包

    匿名用户 1级 2016 05 14 回答 1 下载并安装py2exe 可下载最新版本 2 编写安装脚本 比较简单 不过多解释 如下 Screenshot setup py usr bin env python coding utf 8 f
  • 直线拟合的三种方法

    近日考虑直线拟合相关的知识 大概有所了解 所以打算进行一些总结 直线拟合常用的三种方法 一 最小二乘法进行直线拟合 二 梯度下降法进行直线拟合 三 高斯牛顿 列 马算法进行直线拟合 一 使用最多的就是最小二乘法 这里我也对最小二乘法进行了一
  • 有道翻译JS逆向最新版本,包含解密部分

    话不多说 首先抓包 发现提交的POST参数中 有一个值会变的sign参数 一看是32位的长度 就判断是一个MD5的加密 我们要做的就是调试出这个参与MD5加密的字符串 然后搜索关键字sige 找到JS的关键位置 发现是一个v方法 V方法又调
  • 【LeetCode】MySQL:数据库简单题(181)

    181 超过经理收入的员工 1 题目描述 2 具体实现 Write your MySQL query statement below 法一 子查询 执行时间 905 ms select name as Employee from Emplo
  • 排队论mm1和mms

    排队论 分类 mm1模型 介绍 代码 结果截图 mms模型 介绍 代码 结果截图 分类 mm1模型 介绍 代码 clear clc 初始化顾客源 需要改动的地方就只有仿真时间 到达率和服务率 服务率一般很难提升 但是到达率可以减小 比如肯德
  • RPC:时钟轮解决定时任务以及超时检测

    定时任务带来了什么问题 我们来看一下RPC框架是如何处理超时请求的 RPC中 无论是同步调用还是异步调用 调用端内部实行的都是异步 调用端在向服务端发送消息之前会创建一个Future 并存储这个消息标识与这个Future的映射 当服务端收到
  • 计算机网络 ping中ttl,ping命令TTL什么意思 ping值ttl多少算正常

    很多人都在问ping命令TTL是什么意思 ping值ttl多少算正常 为什么ping数据的时候有的TTL 52 也有TTL 112 甚至还有TTL 255不等的数值 针对大家的这个网络提问 下面ITmemo就给大家解答下 让您完全明白这是怎
  • 使用 apifm 插件进行 Flutter 云开发——图形验证码

    知识点回顾 使用 apifm 插件进行 Flutter 云开发 安装篇 功能说明 图形验证码的使用场景很多 很多需要考虑安全的场合下都需要使用图形验证码来屏蔽机器人的自动化 批量操作 功能点 App上显示图形验证码 点击更换验证码图片 输入
  • 【HJ74】参数解析

    题目描述 在命令行输入如下命令 xcopy s c d e 各个参数如下 参数1 命令字xcopy 参数2 字符串 s 参数3 字符串c 参数4 字符串d e 请编写一个参数解析程序 实现将命令行各个参数解析出来 解析规则 1 参数分隔符为
  • U盘“文件或目录损坏且无法读取”错误的修复

    U盘mp3移动硬盘 文件或目录损坏且无法读取 错误的修复 cmd 后回车 输入 chkdsk 移动硬盘所在盘符 R 回车 按提示操作即可 这个方法应该同样适用于U盘 MP3等大容量移动存储设备 附 CHKDSK命令参数 检查磁盘并显示状态报
  • Android开发实例:打电话

    1 首先建立一个android工程Phone 这里不再演示 PhoneActivity java文件如下 package jiao jiao import android app Activity import android conten
  • Qt项目使用NSIS工具打包发布

    1 安装NSIS工具 在将要发布的文件夹中添加程序安装图标 卸载图标及License txt文件 如下图 注意生成图标时候像素选择大点 如256 256 License txt文件内容可自行定义 1 安装NSIS 双击运行nsis setu
  • python发送邮件附件中文名乱码_处理 python3 邮件附件中文名乱码的问题

    最近接手了一个 py 机器人的开发 发现不论传入的附件路径是变量 字符串 先编码后解码的字符串都解决不了名称乱码 打开源码一看 是这个逻辑 def send smtp mail server None port 25 psw None se