python批量发送带附件的邮件时,收到的附件名异常且后缀为bin,解决办法

2023-10-27

1、问题描述

在使用 Python 内置的模块 smtplib 发送带中文名的附件邮件时,数据可以正常传输,但是但收件人收到的附件格式是bin,附件名也不是发送时的名称。

附注:smtp,Simple Mail Transfer Protocol,即简单邮件发送协议

在这里插入图片描述

import smtplib  # 负责发送邮件
import string
from smtplib import SMTP_SSL
from email.mime.text import MIMEText  # 构造文本
from email.mime.multipart import MIMEMultipart  # 将多个集合对象集合起来
from email.header import Header
from email.mime.application import MIMEApplication # 用于添加附件
from email.mime.image import MIMEImage  # 构造图片
import warnings
warnings.filterwarnings("ignore")

# 1、基础设置
host_server = 'smtp.xhqh.net.cn'  #qq邮箱smtp服务器
sender_qq = '22***328@qq.com'  #发件人邮箱
pwd = '******'  # 发件人邮箱授权码

receiver = '2191003715@qq.com'  # 收件人邮箱
mail_title = '净留存手续费' #邮件标题


# 2、邮件正文内容
mail_content = f"这是使用python登录QQ邮箱发送的邮件"


# 3、创建带附件的邮件对象
msg = MIMEMultipart()  # 生成一个空的带附件的邮件实例
msg["Subject"] = Header(mail_title,'utf-8')  # 生成邮件主题
msg["From"] = sender_qq  # 生成发件人名称
msg["To"] = Header(receiver,"utf-8")  # 生成收件人名称
msg.attach(MIMEText(mail_content,'html'))  # 将正文插入邮件中,以html的形式呈现


# 4、添加附件
# 4.1 读取附件内容
attachment = MIMEApplication(open(r'C:\Users\liujieru\Desktop\test.xlsx','rb').read())  # 获取附件内容
attachment["Content-Type"] = 'application/octet-stream'  # 指定附件为任何未知形式的二进制文件

# 4.2 给附件重命名
basename = "测试.xlsx"
attachment.add_header('Content-Dispositon', 'attachment', filename=('gbk', '', basename))  # 注意:此处basename要转换为gbk编码,否则中文会有乱码。

# 4.3将附件内容插入邮件中
msg.attach(attachment)


# 5、开始发送
try:
    smtp = SMTP_SSL(host_server) # ssl登录连接到邮件服务器
    smtp.set_debuglevel(0) # 0是关闭,1是开启debug
    connect = smtp.ehlo(host_server) # 跟服务器打招呼,告诉它我们准备连接,最好加上这行代码
    login = smtp.login(sender_qq,pwd)
    send = smtp.sendmail(sender_qq, receiver, msg.as_string())
    quit = smtp.quit()
    print("邮件发送成功!")
except smtplib.SMTPException:
    print("无法发送邮件!")    

2、原因分析:

附件带有中文名


3、解决方案:

使用 yagmail 模块

在网上找了很多相关的解决办法,如:

方法一:

attachment['Content-Disposition'] = 'attachment;filename = "测试.xlsx"'替换成 attachment.add_header('Content-Dispositon', 'attachment', filename=('gbk', '', basename))

但我的原始代码本来就是这么写的,仍然收到bin格式的附件,该方法 Pass


方法二:

写成attachment.add_header('Content-Disposition', 'attachment', filename=Header(basename, 'utf-8').encode()) 这种形式,中、英文名称都可以支持

测试过,无效,Pass

网上能搜到的几乎都是针对附件重命名语法的调整,测试后无一例外的都无效

但天无绝人之路,既然都不行,那就另寻新欢、另辟蹊径,使用更简易的模块

解决方案之终极大 boss —— yagmail模块,上代码:

yagmail不是内置模块,需要先安装:pip install yagmail

import yagmail
from pathlib import Path
import pandas as pd
import numpy as np

# 1、基础设置
host_server = 'smtp.xhqh.net.cn'  #qq邮箱smtp服务器
sender_qq = '22***328@qq.com'  #发件人邮箱
pwd = '******'  # 发件人邮箱授权码

receiver = '21***715@qq.com'  # 收件人邮箱
    
    
# 2、创建带附件的邮件对象    
yag = yagmail.SMTP(user=sender_qq, password=pwd, host=host_server)


# 3、邮件内容
contents = ["正文",]  # 可以是一个列表
subject = "一般法人客户名单"
attachment = [f"{file_path/i}.xlsx"]


# 4、发送邮件            
try:
	# yag.send(收件人, 邮件主题, 邮件内容, 附件)
    ret = yag.send(receiver, subject, contents, attachment)
    print("邮件发送成功!")
except Exception as e:
    print(e)
	print("无法发送邮件!")

yag.close()  # 关闭

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

python批量发送带附件的邮件时,收到的附件名异常且后缀为bin,解决办法 的相关文章

  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • pandas 替换多个值

    以下是示例数据框 gt gt gt df pd DataFrame a 1 1 1 2 2 b 11 22 33 44 55 gt gt gt df a b 0 1 11 1 1 22 2 1 33 3 2 44 4 3 55 现在我想根据
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数

随机推荐

  • Nginx主备模式配置

    Nginx主备模式配置 配置示例 参数解释 配置示例 upstream tomcatserver server ip 8780 max fails 2 fail timeout 30s server ip 8068 max fails 2
  • 计算机网络教程_第二章物理层_整理与复习

    计算机网络教程 第一章 概述 第二章 物理层 第三章 数据链路层 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 计算机网络教程 1 物理层的作用及主要任务 2 数据传输的方式 并行 串行 异步 同步 P40 3
  • 《区块链技术与应用》公开课系列笔记——目录导航页

    目录 区块链技术与应用 公开课笔记1 课程介绍 click here 比特币 BTC 篇 已全部更新完成 区块链技术与应用 公开课笔记2 BTC密码学原理 click here 区块链技术与应用 公开课笔记3 BTC数据结构 click h
  • 【重复图识别】在茫茫图海中,怎么找到相同的它?

    转载请标名出处 背景 在一些图像相关的项目中 重复图识别是很重要的 就比如热图排行榜 需要识别出重复图 涉及图像深度学习的项目 训练数据需要剔除重复图 图片原创 视频原创 需要识别出重复图 等等 什么是相同图片 什么是相同图片 相信在不同场
  • typeAliases中package标签的用法

  • 基于视觉的机器人抓取-综述

    基于视觉的机器人抓取 综述 论文 总结 图例 论文 Vision based Robotic Grasping From Object Localization Object Pose Estimation to Grasp Estimat
  • 解决Uncaught (in promise) TypeError: Object(...) is not a function报错

    今天搬砖的时候遇到一个报错 问题 Uncaught in promise TypeError Object is not a function 如图所示 原因 经过排查 发现原因是导入的JS方法没有用大括号接收 然后又把它当做方法调用了 低
  • SimpleFOC之ESP32(九)—— WIFI、UDP和TCP

    目录 说明 一 网络通信 1 1 准备工作 1 2 UDP通信 1 3 TCP通信 二 硬件准备 三 代码参考 四 代码演示 4 1 WIFI AP模式UDP通信 4 2 WIFI STA模式TCP client通信 五 UDP通信控制电机
  • Leetcode日练4 #34 search for a range

    第三种二分法是要求当下算出中值的左右相邻的值 也就是说每一次都要判别至少3个值 最后是应该剩两个值 34 Search for a Range Given an array of integers nums sorted in non de
  • Rockchip Pinctrl 开发文档

    Rockchip Pinctrl 开发文档 前言 概述 本文介绍Rockchip PIN CTRL驱动及DTS使用方法 产品版本 芯片名称 内核版本 RK3568 RK3399 RK3368 RK3288 PX30 RK3128 RK312
  • 一篇文章教小白学会搭建 vite + ts + vue3 项目,手把手教程,不会算我输

    目录 一 基础环境和工具 1 使用 pnpm 代替 npm 2 使用 pinia 代替 vuex 3 使用 windicss 4 使用 vscode 5 使用 sourcetree 6 了解 vite ts vue 二 项目搭建 1 流程图
  • Java voliate关键字常见面试题

    1 什么是 volatile 关键字 它的作用是什么 volatile 是 Java 中的关键字 用于声明一个变量是 易变 的 即可能被多个线程同时修改 它的主要作用是保证对该变量的读写操作具有可见性 即一个线程对该变量的修改对其他线程是可
  • Lua : 循环就三种,谁用谁知道

    Lua中的循环 分为while 循环 for循环和 repeat until 循环 语法比较简单 看看例子就秒懂了 while循环 while 循环 while condition do statement end local a 0 wh
  • android 仿ios右滑退出当前activity

    1 概述 iPhone的用户在使用APP的时候 打开很多页面想关闭的时候只需要在屏幕的左侧向右滑动即可退出当前页面 这是iPhone没有返回键的原因 但是这个效果很炫酷呀 能应用在Android上不是更好吗 今天就来讲一个这个功能的实现 不
  • 【C++】string

    C 修炼秘籍 string 目录 C 修炼秘籍 string 文章目录 前言 一 标准库里的string 二 string常用接口功能简介 具体使用和底层转到模拟实现 1 string类的常见构造函数 2 string类对象的容量操作 3
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Vue中DOM的更新为什么是异步的?

    在 Vue 中 DOM 的更新是异步的机制是为了优化性能和提升用户体验 这个机制被称为 异步更新队列 Vue的异步更新队列机制是其实现高效渲染的关键 它通过将多次数据变化合并到一个批处理中 从而减少了不必要的DOM操作 提高了性能 下面是V
  • costmap 代价地图

    转自 https sychaichangkun gitbooks io ros tutorial icourse163 content chapter10 10 3 html 10 3 costmap costmap是Navigation
  • 嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av13570243/?from=search&seid=15873837810484552531 中的...

    coding gbk 嵩天老师的零基础Python笔记 https www bilibili com video av13570243 from search seid 15873837810484552531 中的15 22讲 数字类型的
  • python批量发送带附件的邮件时,收到的附件名异常且后缀为bin,解决办法

    1 问题描述 在使用 Python 内置的模块 smtplib 发送带中文名的附件邮件时 数据可以正常传输 但是但收件人收到的附件格式是bin 附件名也不是发送时的名称 附注 smtp Simple Mail Transfer Protoc