如何使用 Python 发送带附件的电子邮件

news2024/9/22 1:58:53

如何使用 Python 发送带附件的电子邮件

在之前的系列文章中,我们已经讨论了如何配置和使用 SMTP 与 IMAP 服务来发送和接收电子邮件,并提供了如何在 Gmail 和 QQ 邮箱中启用这些服务的具体步骤。为了方便读者了解完整的背景信息,这里我们将提供前几篇文章的链接:

  • 如何配置 谷歌Gmail邮箱 开启SMTP/IMAP服务流程
  • 如何在QQ邮箱中启用 SMTP/IMAP 服务
  • SMTP/IMAP服务

在这篇文章中,我们将详细介绍如何使用 Python 的 smtplib 模块以及 email 库来构建和发送带有附件的电子邮件。

示例代码

import os
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from urllib.parse import quote

"""
EMAIL_HOST: SMTP 服务器地址
EMAIL_PORT: SMTP 服务器端口
EMAIL_USER: 登录 SMTP 服务器的账号
EMAIL_AUTH: 登录 SMTP 服务器的授权码
"""

# 邮件服务器配置
smtp_configs = {
    'qq': {
        'host': 'smtp.qq.com',                  # 邮件服务器域名(自行修改)
        'port': 465,                            # 邮件服务端口(通常是465)
        'user': 'user@qq.com',         			# 登录邮件服务器的账号(自行修改)
        'auth': 'your_authcode'              	# 开通SMTP服务的授权码(自行修改)(不是填入QQ的密码)
    },
    'gmail': {
        'host': 'smtp.gmail.com',               # 邮件服务器域名(自行修改)
        'port': 587,                            # 邮件服务端口(通常是587)
        'user': 'user@gmail.com',      			# 登录邮件服务器的账号(自行修改)
        'auth': 'your_authcode'              	# 配置IMAP/SMTP服务的授权码(应用密码)(需要去谷歌配置)
    }
}

# 定义函数来发送电子邮件
def send_email(*, Sender, Recipient, Subject='', Content='', Attachment=[], Service='qq'):
    try:
        print("开始构建邮件...")
        email = MIMEMultipart()
        email['From'] = Sender
        email['To'] = Recipient
        email['Subject'] = Header(Subject, 'utf-8')

        message = MIMEText(Content, 'plain', 'utf-8')
        email.attach(message)

        for filename in Attachment:
            with open(filename, 'rb') as file:
                attachment = MIMEApplication(file.read(), Name=os.path.basename(filename))
                attachment['Content-Disposition'] = f'attachment; filename="{quote(os.path.basename(filename))}"'
                email.attach(attachment)

        print("邮件构建完成,准备发送...")

        config = smtp_configs.get(Service)
        if not config:
            raise ValueError(f"Unsupported email Service provider: {Service}")

        EMAIL_HOST = config['host']
        EMAIL_PORT = config['port']
        EMAIL_USER = config['user']
        EMAIL_AUTH = config['auth']

        if EMAIL_PORT == 465:
            smtp = smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_PORT)
        else:
            smtp = smtplib.SMTP(EMAIL_HOST, EMAIL_PORT)
            smtp.starttls()  # 启用 TLS 加密

        smtp.login(EMAIL_USER, EMAIL_AUTH)
        smtp.sendmail(Sender, Recipient.split(';'), email.as_string())
        print("邮件发送成功")
    except smtplib.SMTPAuthenticationError:
        print("SMTP Authentication Error: Please check your credentials.")
    except smtplib.SMTPServerDisconnected:
        print("SMTP Server Disconnected: Please check your network connection and server settings.")
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        smtp.quit()
        print("SMTP会话已关闭。")
        
"""
发送邮件

:param Sender:      发件人(可包含名称和邮箱地址)
:param Recipient:   收件人,多个收件人用英文分号进行分隔
:param Subject:     邮件的主题
:param Content:     邮件正文内容
:param Attachment:  附件要发送的文件路径列表
"""

# 调用函数发送 Gmail 邮箱邮件
send_email(
    Sender = '发件人<user@gmail.com>',
    Recipient = '收件人<recipient1@gmail.com>;recipient2@qq.com',
    Subject = '邮件的主题',
    Content = '邮件正文内容',
    Attachment = ['附件要发送的文件路径列表'],
    Service='gmail'
)

# 调用函数发送 QQ 邮箱邮件
send_email(
    Sender = 'GLNG<user@qq.com>',
    Recipient = 'Gwyn Winthrop<recipient@qq.com>',
    Subject = 'Invitation to the Annual Conference',
    Content = '''
                Dear Mr. Doe,

                We would like to formally invite you to attend our annual conference on innovation and technology, which will be held on October 20th at the Grand Convention Center. Your expertise in this field would be greatly appreciated by all attendees.

                Please find attached the agenda for the conference and an RSVP form for confirming your attendance.

                We look forward to your participation and hope to see you there.

                Kind regards,

                Jane Smith
    ''',
    Attachment = ['./path/to/attachment1', './path/to/attachment2'],
    Service='qq'
)
注意事项
  • 安全性和隐私:在使用此脚本时,请确保您的登录凭据不会泄露给第三方。最好是在本地环境中测试并运行此类脚本。
  • 错误处理:上述代码包含了基本的错误处理逻辑,但是根据具体需求可能还需要增加更详细的异常捕获和日志记录功能。
  • 服务器配置:根据所使用的邮件服务提供商的不同,SMTP 主机地址、端口号以及其他设置可能会有所不同。请参考相应的服务文档来获取正确的配置信息。

以上就是如何使用 Python 发送带附件的电子邮件的全部内容。如果您有任何疑问或需要进一步的帮助,请随时提问!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HashMap扩容时机是插入前还是插入后?

结论 不管是HashMap还是ConcurrentHashMap都是插入后。 过程为&#xff1a; 先计算哈希值。对应的哈希槽插入数据&#xff0c;决定是红黑树还是链表插入完毕才计算是否需要扩容&#xff0c;假如需要则扩容 源码 源码如下&#xff1a; 其中addCount方法里面写入扩容。

如何设置 Django 错误邮件通知 ?

Django 是一个强大的 web 框架&#xff0c;非常适合那些想要完美快速完成任务的人。它有许多内置的工具和特性&#xff0c;一个有用的特性是 Django 可以在出现错误时发送电子邮件提醒。这对开发人员和管理员非常有用&#xff0c;因为如果出现问题&#xff0c;他们会立即得到通…

STM32F407单片机编程入门(十二) FreeRTOS实时操作系统详解及实战含源码

文章目录 一.概要二.什么是实时操作系统三.FreeRTOS的特性四.FreeRTOS的任务详解1.任务函数定义2.任务的创建3.任务的调度原理 五.CubeMX配置一个FreeRTOS例程1.硬件准备2.创建工程3.调试FreeRTOS任务调度 六.CubeMX工程源代码下载七.小结 一.概要 FreeRTOS是一个迷你的实时操…

智慧校园建设解决方案建设系统简介

一、建设背景 1.1 政策背景 1.2 班牌的演变 1.3 建设愿景 二、 智慧班牌简介 三、智慧班牌系统 3.1 系统概述 3.2 软件平台功能交互简介 3.2.1 智慧班牌与管理平台间的功能关联 3.2.2 手机客户端&#xff08;管理员、教师、家长端&#xff09; 3.2.3 手机客户端&#x…

数据采集与预处理,前后端结合案例(有代码),Python连接MySQL,对MySQL的增删改查

Python对MySQL的增删改查 通过Python连接MySQL """连接MySQL数据库&#xff0c;并进行增删改查&#xff0c;同时查询了MySQL版本号&#xff0c;并做了动态注册的账号&#xff0c;实现过程&#xff1a;先向userinfo当中添加account、password新字段&#xff0c…

数据结构:内部排序

文章目录 1. 前言1.1 什么是排序&#xff1f;1.2 排序的稳定性1.3 排序的分类和比较 2. 常见的排序算法3. 实现常见的排序算法3.1 直接插入排序3.2 希尔排序3.3 直接选择排序3.4 堆排序3.5 冒泡排序3.6 快速排序3.6.1 hoare思想3.6.2 挖坑法3.6.3 lomuto前后指针法3.6.4 非递归…

软考(中级-软件设计师)计算机系统篇(0921)

I 计算机系统知识 一、考纲要求 数值及其转换 二进制、十进制和十六进制等常用数制及其相互转换 计算机内数据的表示 数值的表示&#xff08;原码、反码、补码、移码表示&#xff0c;整数和实数的机内表示&#xff0c;精度和溢出&#xff09;非数值表示&#xff08;字符和汉字…

AI直播新浪潮:无人视频自动直播,出圈再造辉煌,创业者首选!

AI直播新浪潮:无人视频自动直播&#xff0c;出圈再造辉煌&#xff0c;创业者首选&#xff01; 在数字化浪潮的汹涌澎湃中&#xff0c;AI技术正以前所未有的速度重塑着各行各业的边界&#xff0c;而直播行业作为数字内容消费的前沿阵地&#xff0c;正迎来一场由AI驱动的深刻变革…

MQ(RabbitMQ)笔记

初识MQ 同步调用优缺点 异步调用优缺点 总结&#xff1a; 时效性要求高&#xff0c;需要立刻得到结果进行处理--->同步调用 对调用结果不关心&#xff0c;对性能要求高&#xff0c;响应时间短--->异步调用

2024年华为杯-研赛F题论文问题一二讲解+代码分享

X射线脉冲星光子到达时间建模 摘要 脉冲星是一类高速自转的中子星&#xff0c;其自转形成规律性脉冲信号&#xff0c;类似于“宇宙中的灯塔”&#xff0c;因此被认为是极为精确的时钟。X射线脉冲星导航利用脉冲星信号为航天器提供时间和空间参考。通过比较脉冲信号到达航天器…

查找算法 01分块查找

自己设计一个分块查找的例子&#xff0c;不少于15个数据元素&#xff0c;并建立分块查找的索引 基于上述例子&#xff0c;计算查找成功的ASL、查找失败的ASL 拓展&#xff1a; ‌‌分块查找的平均查找长度&#xff08;‌ASL&#xff09;的计算公式如下‌&#xff1a;‌ ‌顺序…

Camunda流程引擎并发性能优化

文章目录 Camunda流程引擎一、JobExecutor1、工作流程2、主要作用 二、性能问题1、实际场景&#xff1a;2、性能问题描述3、总结 三、优化方案方案一&#xff1a;修改 Camunda JobExecutor 源码以实现租户 ID 隔离方案二&#xff1a;使用 max-jobs-per-acquisition 参数控制上锁…

ThreadLocal与AsyncLocal

简介 ThreadLocal 用于在多线程环境中创建线程局部变量&#xff0c;可以让每个线程独立地访问自己的变量副本&#xff0c;互不影响。 而 AsyncLocal 是 ThreadLocal 的异步版本&#xff0c;专门用于异步编程场景&#xff0c;在异步操作中它可以正确处理上下文切换。 ThreadLo…

ftp服务的管理及安全优化

1.ftp介绍 ftp : file transfer proto 互联中最老牌的文件传输协议 2.vsftpd安装及启用 环境 #server 主机 &#xff1a; # R3 # 192.168.10.130 # selinux 关闭 # 火墙开启 # dnf 安装设定完成 # #client 主机 &#xff1a; # R4 # 192.168.10.131 # selinux 关闭 …

C++之职工管理系统(细节Q)

指针初始化类 && 普通变量初始化类 抽象基类worker&#xff0c;只需编写 .h &#xff0c;无需 .cpp 底层实现 类 记得声明权限public&#xff01;&#xff01;&#xff01;不然默认private&#xff0c;主函数访问不了 记得继承父类 Worker * worker&#xff1a;指向Wo…

source insight学习笔记

目录 目的 基础配置 1、护眼的保护色 2、行号显示 基础操作 目的 记录一下使用source insight中遇到的问题。比如常见好用的基础配置&#xff0c;常用的基础操作等。主要是为了自己以后忘记了好找。自己写的东西总归看起来更舒服。 PS&#xff1a;目前是第一个版本&#…

Linux相关概念和重要知识点(5)(权限的修改、时间属性)

1.权限的修改 &#xff08;1&#xff09;提权行为 普通用户是会受到权限的限制&#xff0c;但root账户无视一切权限限制&#xff0c;因此当我们要获取更高的权限&#xff0c;有一种办法就是将自己变成root或者短暂拥有和root一样的权力。 普通用户 -> root &#xff1a;s…

NoSql数据库Redis知识点

数据库的分类 关系型数据库 &#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL 、 Oracle 、 MS SQL Server 和 DB2 都属于这类传统数据库。 NoSQL 数据库 &#xff0c;全称为 Not Only SQL &a…

网络丢包定位记录(二)

网卡驱动丢包 查看&#xff1a;ifconfig eth1/eth0 等接口 1.RX errors: 表示总的收包的错误数量&#xff0c;还包括too-long-frames错误&#xff0c;Ring Buffer 溢出错误&#xff0c;crc 校验错误&#xff0c;帧同步错误&#xff0c;fifo overruns 以及 missed pkg 等等。 …

K8S介绍+集群部署

Kubernetes介绍 官网&#xff1a;https://kubernetes.io/ 一、应用部署方式演变 1、传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&a…