python smtp发送邮件 附件 中文名乱码 问题

2023-11-18

重点

   mime.add_header('Content-Disposition', 'attachment', filename=( make_header([(file_name, 'UTF-8')]).encode('UTF-8')))

完整代码可以发送多个附件

import smtplib
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.header import Header, make_header
from email.utils import COMMASPACE, formatdate
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
from email import encoders
from datetime import datetime
from config import mail_tail

import time, os




SMTP_IP = 'sftp.gmail.com'

SMTP_PORT = 25  # 587

EMAIL_FROM = 'rpa05@rpa.com'
EMAIL_PASSWORD = '82767630'

SMTP_CONTENT_TYPE_HTML = 'html'
SMTP_CONTENT_TYPE_TEXT = 'text'


# 第三方 SMTP 服务
mail_host = SMTP_IP  # 设置服务器
mail_user = EMAIL_FROM # 用户名
mail_pass = EMAIL_PASSWORD  # 口令

sender = EMAIL_FROM


to = cc = receivers = ['yu@rpa.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

week = time.strftime("%W")
year = time.strftime("%Y")
day = datetime.now().strftime('%Y%m%d')

mail_msg = mail_tail




def send_mail(mail_msg, subject, to, cc, bcc, file_name=None, file_path=None, name=None):
    message = MIMEMultipart('related')
    # message = MIMEText(mail_msg, 'html', 'utf-8')
    message['From'] = 'rpa05@rpa.com'

    message['To'] = COMMASPACE.join(to)
    message['Cc'] = COMMASPACE.join(cc)
    msgAlternative = MIMEMultipart('alternative')
    message.attach(msgAlternative)

    #添加附件

    # att1 = MIMEBase(open(file_path, 'rb').read(), 'base64')
    # att1["Content-Type"] = 'application/octet-stream'
    # # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    # att1["Content-Disposition"] = f'attachment; filename={file_name}'
    # message.attach(att1)

    if file_path:
        print('os path', os.path.exists(file_path))
        a = os.path.exists(file_path)
        while not a:
            print('while os path', os.path.exists(file_path))
            time.sleep(0.5)
            a = os.path.exists(file_path)


    if file_path:
        with open(file_path, 'rb') as f:
            # 设置附件的MIME和文件名,这里是png类型:
            mime = MIMEBase('application','vnd.ms-excel') #, filename=file_name
            # 加上必要的头信息:
            mime.add_header('Content-Disposition', 'attachment', filename=file_name)
            mime.add_header('Content-ID', '<0>')
            mime.add_header('X-Attachment-Id', '0')
            # 把附件的内容读进来:
            mime.set_payload(f.read())
            # 用Base64编码:
            encoders.encode_base64(mime)
            # 添加到MIMEMultipart:
            message.attach(mime)


    subject = subject
    message['Subject'] = Header(subject)
    message['Date'] = formatdate(localtime=True)
    msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))

    # 指定图片为当前目录
    # fp = open(img, 'rb')
    # msgImage = MIMEImage(fp.read())
    # fp.close()

    # 定义图片 ID,在 HTML 文本中引用
    # msgImage.add_header('Content-ID', '<image1>')
    # message.attach(msgImage)

    server = smtplib.SMTP('10.10.10.10:25')

    server.ehlo_or_helo_if_needed()
    server.ehlo()  # 向Gamil发送SMTP 'ehlo' 命令
    server.starttls()
    # server.login(sender, mail_pass)
    print(datetime.now())
    print("邮件发送成功---------->",name)
    if file_path:
        os.remove(file_path)

 
    server.sendmail('rpa@rpa.com', to + cc + bcc , message.as_string())
    server.quit()


def send_mail_multi_attch(mail_msg, subject, to, cc, bcc, file_list=None,  name=None):
    message = MIMEMultipart('related')
    # message = MIMEText(mail_msg, 'html', 'utf-8')
    message['From'] = 'rpa05@rpa.com'
  
    message['To'] = COMMASPACE.join(to)
    message['Cc'] = COMMASPACE.join(cc)
    msgAlternative = MIMEMultipart('alternative')
    message.attach(msgAlternative)

    #添加附件

    # att1 = MIMEBase(open(file_path, 'rb').read(), 'base64')
    # att1["Content-Type"] = 'application/octet-stream'
    # # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    # att1["Content-Disposition"] = f'attachment; filename={file_name}'
    # message.attach(att1)




    if file_list:
        for index, file in enumerate(file_list):
            file_path = file.get('path')
            file_name = file.get('name')
            with open(file_path, 'rb') as f:
                    # 设置附件的MIME和文件名,这里是png类型:
                    # mime = MIMEBase('application','vnd.ms-excel') #, filename=file_name
                    mime = MIMEBase('application','octet-stream') #, filename=file_name
                    # 加上必要的头信息:
                    print('file_name', file_name)
                    mime.add_header('Content-Disposition', 'attachment', filename=( make_header([(file_name, 'UTF-8')]).encode('UTF-8')))
                    mime.add_header('Content-ID', f'<{index}>')
                    mime.add_header('X-Attachment-Id', f'{index}')
                    # 把附件的内容读进来:
                    mime.set_payload(f.read())
                    # 用Base64编码:
                    encoders.encode_base64(mime)
                    # 添加到MIMEMultipart:
                    message.attach(mime)



    subject = subject
    message['Subject'] = Header(subject)
    message['Date'] = formatdate(localtime=True)
    msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))

    # 指定图片为当前目录
    # fp = open(img, 'rb')
    # msgImage = MIMEImage(fp.read())
    # fp.close()

    # 定义图片 ID,在 HTML 文本中引用
    # msgImage.add_header('Content-ID', '<image1>')
    # message.attach(msgImage)

    server = smtplib.SMTP('10.10.10.10:25')

    server.ehlo_or_helo_if_needed()
    server.ehlo()  # 向Gamil发送SMTP 'ehlo' 命令
    server.starttls()
    # server.login(sender, mail_pass)
    print(datetime.now())
    print("邮件发送成功---------->",name)
    # if file_path:
    #     os.remove(file_path)

   
    server.sendmail('rpa@rpa.com', to + cc + bcc , message.as_string())
    server.quit()

if __name__ == '__main__':
    pass

参考
https://blog.csdn.net/u013948083/article/details/95313594
https://segmentfault.com/q/1010000016296204/

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

python smtp发送邮件 附件 中文名乱码 问题 的相关文章

随机推荐

  • 【计算机视觉

    文章目录 一 检测相关 11篇 1 1 Follow Anything Open set detection tracking and following in real time 1 2 YOLO MS Rethinking Multi
  • 【分治法】中位数问题和Gray码问题——武汉理工大学算法分析与设计课程实验

    i 中位数问题 问题描述 设X 0 n 1 和Y 0 n 1 为两个数组 每个数组中含有n个已排好序的数 找出X和Y的2n个数的中位数 编程任务 利用分治策略试设计一个O log n 时间的算法求出这2n个数的中位数 数据输入 由文件inp
  • sublime text添加install package报错 Package Control There are no packages available for installation

    sublime text在使用插件之前 需要安装Package Control插件 但在安装时报错 There are no packages available for installation 也就是说无法获取安装所需的包 首先确认网络
  • 基于java项目 服务器远程debug开启教程

    首先 在我们的工作中避免不了进行远程调试 我们可以通过远程debug的方式去调试我们的程序代码 通常我们的spring项目打成包的方式有jar 或者war包发布到我们的远程服务器上 我们先介绍第一种jar包方式开启远程debug 打成jar
  • JAVA 面向对象

    第五章 面向对象 面向对象技术利用对现实世界中对象的抽象和对象之间相互关联及相互作用的描述来对现实世界进行模拟 并且使其映射到目标系统中 其以基本对象模型为单位 将对象内部处理细节封装在模型内部 重视对象模块间的接口联系和对象与外部环境间的
  • 关于GRE over IPsec及IPsec over GRE

    GRE over IPsec IPsec over GRE IPSec Over GRE是先ipsec后gre 这种我没用过 GRE Over IPSec 是先gre后ipsec 也就是说ipsec是最后的承载方式 一般常用的就是这种 解决
  • 最详细的Python安装教程

    最详细的Python安装教程 一 进入Python官网首页 下载最新的Python版本 https www python org downloads 选择最新的Python3 10 5 下载64位的版本 二 下载完成后 进行安装 1 双击P
  • 数字图像处理(入门篇)六 图像数据预处理之坐标变化

    目录 1 平移 2 镜像 3 旋转 4 缩放 图像的坐标变换又称为图像的几何计算 常见的基本变换包括 平移 旋转 镜像和缩放等等 1 平移 1 代码 使用OpenCV仿射变换函数 cv2 warpAffine 实现平移操作 import n
  • 前端vue可以左右滚动的切换的tabs tabs选项卡 滑动动画效果 自动宽度

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • Feign原理 (图解)

    1 1 简介 Feign远程调用的 Feign远程调用 核心就是通过一系列的封装和处理 将以JAVA注解的方式定义的远程调用API接口 最终转换成HTTP的请求形式 然后将HTTP的请求的响应结果 解码成JAVA Bean 放回给调用者 F
  • namespace命令空间

    目录 1 解决什么问题 2 基本介绍 2 1 定义 2 2 应用场景 3 使用案例 4 资源配额 5 标签 5 1 定义 5 2 pod资源打标签 5 3 查看标签 1 解决什么问题 命令空间类似于C 中的命名空间 当用户数量较多的集群 才
  • 使用docker搭建jupyter notebook/jupyterlab

    说明 由于官方镜像实在是不怎么好用 所以我自己做了一个优化过的jupyter notebook的镜像 notebook hub 使用我这个镜像搭建容器非常简单 下面就基于这个notebook hub来进行搭建 关于notebook hub
  • hive 报system:java.io.tmpdir错误解决

    Exception in thread main java lang IllegalArgumentException java net URISyntaxException Relative path in absolute URI sy
  • 2. IDEA + maven + protobuf配置(on mac)

    1 絮絮叨叨 都说懒惰是人类进步的源泉 有时候想想还真就那么回事 学习了如何使用protoc命令编译 重度依赖IDEA且已经习惯了maven的我 就在想是否能在IDEA中一键编译 proto文件 2 vscode配置protobuf编辑环境
  • pyecharts实现电影数据分析可视化

    根据电影数据 使用pyecharts进行可视化分析 数据介绍 import pandas as pd data pd read csv 电影 csv data head 前5行数据如下 需要安装的python库 pip install pa
  • 2.晶晨A311D-编译Ubuntu/Debian固件

    上面是我的微信和QQ群 欢迎新朋友的加入 参考 https docs khadas com zh cn vim3 FenixScript html 编译环境 我重新安装了ubuntu20 安装软件包 配置环境 sudo apt get in
  • 【数据结构】排序(直接插入、折半插入、希尔、冒泡、快速、直接选择、堆、归并、基数排序)

    一 什么是排序 排序 将一组杂乱无章的数据按一定规律顺次排列起来 即 将无序序列的数据节点包含多个数据域 那么排序往往是针对其中某个域而言 二 排序方法的分类 1 按数据存储介质可分为 内部排序 数据量不大 数据在内存 无需内外存交换数据
  • SQL抽取数据脚本

    sp OutputData IF EXISTS SELECT 1 FROM sys objects o WHERE object id object id N sp OutputData AND OBJECTPROPERTY object
  • vue数据劫持 ajax,Vue视图更新原理 - 数据劫持,最小量更新和DIFF算法

    什么是数据劫持 加入有一个js文件内容如下 var obj x 100 y 200 Object defineProperties obj x set console log You gonna update x the vision wi
  • python smtp发送邮件 附件 中文名乱码 问题

    重点 mime add header Content Disposition attachment filename make header file name UTF 8 encode UTF 8 完整代码可以发送多个附件 import