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,解决办法 的相关文章

  • 在Python中不断寻找用户输入

    我将如何编写一个始终寻找用户输入的 Python 程序 我想我希望有一个等于输入的变量 然后根据该变量的等于值会发生不同的情况 因此 如果变量是 w 那么它将执行某个命令并继续执行 直到收到另一个输入 例如 d 然后会发生不同的情况 但直到
  • 如何使用 .pth 文件添加 Python 导入路径

    如果我将 pth 文件放入 site packages 中 则会给出一个ImportError 我不知道如何通过创建 pth 文件来导入 指在Python中导入 https stackoverflow com questions 69728
  • UnicodeDecodeError:“utf-8”编解码器无法解码位置 14 中的字节 0xb9:起始字节无效

    我正在使用 Django REST 进行文件上传测试 Python3 6 2Django1 11djangorest框架 3 6 4Excel OSX 15 38 170902 操作系统 10 12 6 过去使用普通照片文件可以成功完成此操
  • Pygame 让精灵按照给定的旋转行走

    很久以前我做了一个Scratch脚本 我想用Pygame将其转换为Python 有很多示例显示图像的旋转 但我想知道如何更改精灵的旋转以使其沿给定方向移动 而不更改图像 这是我的暂存代码 这是我的 Pygame 精灵类 class Star
  • 如何仅选择数组中的第一列并对其求和?

    这是我的代码 import numpy as np contrainte1 1080 0 65 minutes tous les jours contrainte2 720 0 55 minutes du lundi au vendredi
  • 如何在python中确定过去的时区特定日期是否是夏令时?

    有没有办法检查特定时区在我指定的日期是否处于夏令时 test dt datetime year 2015 month 2 day 1 pst pytz timezone America Los Angeles test dt pst loc
  • Seaborn regplot 中点和线的不同颜色

    中列出的所有示例西伯恩的regplot文档 https seaborn pydata org generated seaborn regplot html点和回归线显示相同的颜色 改变color争论改变了两者 如何为点设置与线不同的颜色 你
  • 从 Python 将分层 JSON 数据写入 Excel xls?

    我想将一些数据从 python 写入 xlsx 我目前将其存储为 JSON 但它从 Python 中输出什么并不重要 单个文章的 JSON 如下所示 Word Count 50 Key Words Blah blah blah Foo Fr
  • 如何计算查询集中每个项目的两个字段的总和

    假设我有以下模型结构 class SomeModel Model base price DecimalField commision DecimalField 我不想存储total price在我的数据库中为了数据一致性并希望将其计算为ba
  • 监控培训课程如何运作?

    我试图理解使用之间的区别tf Session and tf train MonitoredTrainingSession 以及我可能更喜欢其中之一 似乎当我使用后者时 我可以避免许多 杂务 例如初始化变量 启动队列运行程序或设置文件编写器以
  • Django - 使 ModelForm(ImageField 的)仅接受某些类型的图像

    我将 Pillow 2 3 0 与 Django 一起使用 并且在 models py 中有一个 ImageField 如下所示 class UserImages models Model user models ForeignKey Us
  • 使用 os.forkpty() 创建一个伪终端以 ssh 到远程服务器并与其通信

    我正在尝试编写一个 python 脚本 它可以 ssh 到远程服务器 并可以从 python 客户端执行 ls cd 等简单命令 但是 在成功 ssh 到服务器后 我无法读取伪终端的输出 任何人都可以在这里帮助我 以便我可以在服务器上执行一
  • Python Tkinter 网格复选框

    我想知道是否有一种简单的方法可以使用 Tkinter 创建复选框网格 我正在尝试制作一个由 10 行和 10 列 即 100 个复选框 组成的网格 以便每行只能选择两个复选框 编辑 我正在使用带有spyder的python 2 7 到目前为
  • 安塞布尔 + 10.11.6

    我在 非常 干净地安装 10 11 6 时遇到了 Ansible 的奇怪问题 我已经安装了brew zsh oh my zsh Lil snitch 和1password 实际上没有安装其他任何东西 我安装了ansible brew ins
  • 向结构化 numpy 数组添加字段

    将字段添加到结构化 numpy 数组的最简洁方法是什么 是否可以破坏性地完成 或者是否有必要创建一个新数组并复制现有字段 每个字段的内容是否连续存储在内存中 以便可以有效地完成此类复制 如果您使用 numpy 1 3 还有 numpy li
  • datetime strftime 不输出正确的时间戳

    下列 gt gt gt from dateutil parser import parse gt gt gt parse 2013 07 02 00 00 00 0000 datetime datetime 2013 7 2 0 0 tzi
  • 给定一个字符串,如何删除所有重复的连续字母?

    如何从字符串中删除两个连续的字母 例如 a str hii thherre 应该成为 hi there 我尝试这样做 a str join sorted set a str key a str index 但是 我得到 hi ter 是的
  • 具有行业级约束的 SciPy 投资组合优化

    尝试在这里优化投资组合权重分配 通过限制风险来最大化我的回报函数 我可以毫无问题地通过简单的约束 所有权重之和等于 1 找到产生我的回报函数的优化权重 并做出另一个约束 即我的总风险低于目标风险 我的问题是 如何为每个组添加行业权重界限 我
  • 如何从 python 中的字符串中删除 ANSI 转义序列

    这是包含我的字符串的片段 ls r n x1b 00m x1b 01 31mexamplefile zip x1b 00m r n x1b 01 31m 该字符串是从我执行的 SSH 命令返回的 我无法使用当前状态下的字符串 因为它包含 A
  • Pandas 2 个字段中唯一值的数量

    我正在尝试查找覆盖 2 个字段的唯一值的数量 例如 一个典型的例子是姓氏和名字 我有一个数据框 当我执行以下操作时 我只获取每列的唯一字段数 在本例中为 最后一个 和 第一个 不是复合体 df Last Name First Name nu

随机推荐

  • 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