Python——自动化发送邮件

news2024/11/28 10:38:05

在数字化时代,电子邮件是商务沟通和个人联络的重要工具。自动化邮件发送可以节省时间,提高效率。Python,作为一种强大且灵活的编程语言,提供了多种库来支持邮件的自动化发送。本文将详细介绍如何使用Python的smtplibemail库来编写一个邮件发送程序。

目录

1一、环境准备

二、构建邮件内容

2.1 创建邮件对象

2.2 设置邮件头部

2.3 添加邮件正文

2.3.1 纯文本邮件

2.3.2 HTML邮件

2.4 添加附件

2.5 构建复杂邮件

三、 发送邮件

3.1 连接到SMTP服务器

3.2 发送邮件

3.3 关闭连接

四、 完整的邮件发送函数

5五、注意事项和最佳实践

5.1 安全性

5.2 使用安全的连接

5.3 错误处理

5.4 邮件服务商的限制

5.5 邮件内容的优化

5.6 测试


1一、环境准备

在开始之前,确保你的Python环境已经安装了必要的库。我们将使用smtplib来发送邮件,以及email库来构建邮件内容。

如果你的环境中还没有这些库,可以通过以下命令安装:

pip install smtplib email

二、构建邮件内容

邮件内容可以通过email库中的几个类来构建,包括MIMETextMIMEMultipartMIMEText用于纯文本内容,而MIMEMultipart则可以包含多种类型的数据,如文本、HTML和附件。

2.1 创建邮件对象

首先,我们需要创建一个MIMEMultipart对象,它将作为邮件的容器。

from email.mime.multipart import MIMEMultipart

msg = MIMEMultipart()

2.2 设置邮件头部

邮件头部包括发件人、收件人和主题等信息。

msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg['Subject'] = '邮件主题'

2.3 添加邮件正文

邮件正文是邮件的主要内容,可以是纯文本或HTML格式。我们将使用MIMEText来添加邮件正文。

2.3.1 纯文本邮件

对于纯文本邮件,我们使用MIMETextplain参数。

from email.mime.text import MIMEText

# 纯文本邮件正文
text = '这是一封纯文本邮件。'
part = MIMEText(text, 'plain')

# 将正文部分添加到邮件消息中
msg.attach(part)
2.3.2 HTML邮件

对于HTML邮件,我们使用MIMETexthtml参数。

# HTML邮件正文
html = '<h1>这是一封HTML邮件</h1>'
part = MIMEText(html, 'html')

# 将正文部分添加到邮件消息中
msg.attach(part)

2.4 添加附件

除了正文,我们还可以向邮件中添加附件。附件可以是任何类型的文件。

from email.mime.base import MIMEBase
from email import encoders

# 创建一个附件对象
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(open('filename.txt', 'rb').read())
encoders.encode_base64(attachment)

# 设置附件的头部信息
attachment.add_header('Content-Disposition', 'attachment', filename='1.txt')

# 将附件添加到邮件消息中
msg.attach(attachment)

2.5 构建复杂邮件

在实际应用中,邮件可能包含多种内容类型,如文本、HTML和附件。MIMEMultipart允许我们将这些内容组合在一起。

# 创建一个MIMEMultipart对象
msg = MIMEMultipart()

# 添加文本正文
text = '这是邮件的文本部分。'
text_part = MIMEText(text, 'plain')
msg.attach(text_part)

# 添加HTML正文
html = '<h1>这是邮件的HTML部分</h1>'
html_part = MIMEText(html, 'html')
msg.attach(html_part)

# 添加附件
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(open('filename.txt', 'rb').read())
encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment', filename='1.txt')
msg.attach(attachment)

三、 发送邮件

使用smtplib库来发送邮件。你需要知道SMTP服务器的地址和端口,以及你的邮箱账号和密码。

3.1 连接到SMTP服务器

import smtplib

server = smtplib.SMTP_SSL('smtp.example.com', 465)  # 使用SSL连接
server.login('sender@example.com', 'your_password')

3.2 发送邮件

将之前构建的邮件对象发送出去。

server.send_message(msg)

3.3 关闭连接

发送完毕后,不要忘记关闭与SMTP服务器的连接。

server.quit()

四、 完整的邮件发送函数

将上述步骤整合到一个函数中,可以方便地重复使用。

import subprocess
import sys

# 检测并安装库的函数
def install(package):
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', package])

# 检查所需的库并安装
required_packages = ['smtplib', 'email']
for package in required_packages:
    try:
        __import__(package)
    except ImportError:
        print(f"{package} 未安装,正在安装...")
        install(package)

# 导入所需的库
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def send_email(sender_email, sender_password, recipient_email, subject, body):
    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = recipient_email
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))

    try:
        # 使用 SSL 连接
        server = smtplib.SMTP_SSL('smtp服务器地址', 465)
        server.login(sender_email, sender_password)
        server.send_message(msg)
        print("邮件发送成功!")
    except Exception as e:
        print(f"发送邮件时出错: {e}")
    finally:
        if 'server' in locals():
            server.quit()

# 使用示例
if __name__ == "__main__":
    # 请将以下信息替换为您的实际信息
    sender_email = ''  # 发件人邮箱
    sender_password = ''   # 发件人邮箱密码

    # 用户输入收件人邮箱
    recipient_email = input("请输入收件人邮箱: ")
    
    subject = '邮件标题'
    body = '这是邮件的内容。'

    send_email(sender_email, sender_password, recipient_email, subject, body)

5五、注意事项和最佳实践

在使用Python发送邮件时,有几个重要的注意事项和最佳实践可以帮助你确保邮件的成功发送,同时保护你的账户安全。

5.1 安全性

不要硬编码敏感信息:在代码中直接包含邮箱账号和密码是不安全的。这些敏感信息可能会被泄露,尤其是当你的代码库被上传到公共代码托管平台时。考虑使用以下方法来更安全地处理敏感信息:

  • 环境变量:将敏感信息存储在环境变量中,而不是直接在代码中。这样,你的代码库中就不会包含这些信息,而且可以根据不同的运行环境轻松更改这些值。
  • 配置文件:使用配置文件来存储敏感信息,并确保这些文件不被上传到版本控制系统中。你可以在版本控制的.gitignore文件中排除这些配置文件。
  • 密钥管理服务:对于更复杂的应用,可以考虑使用密钥管理服务来安全地存储和访问敏感信息。

5.2 使用安全的连接

使用SSL或TLS:在发送邮件时,确保你的连接是加密的。smtplib库支持使用SSL(在465端口)和TLS(在587端口)来加密你的连接。使用SSL或TLS可以防止你的敏感信息(如密码)在传输过程中被截获。

# 使用SSL
server = smtplib.SMTP_SSL('smtp.example.com', 465)

# 或者使用TLS
server = smtplib.SMTP('smtp.example.com', 587)
server.starttls()

5.3 错误处理

添加错误处理逻辑:在发送邮件时,可能会遇到各种错误,如网络问题、认证失败或邮件服务器拒绝发送。添加错误处理逻辑可以帮助你诊断问题,并在邮件发送失败时采取适当的措施。

try:
    server.send_message(msg)
    print("邮件发送成功!")
except smtplib.SMTPAuthenticationError:
    print("认证失败,请检查你的邮箱账号和密码。")
except smtplib.SMTPException as e:
    print(f"发送邮件时出错: {e}")
finally:
    server.quit()

5.4 邮件服务商的限制

了解邮件服务商的限制:不同的邮件服务商可能有不同的限制,如发送频率限制、每日发送量限制等。确保你的邮件发送行为符合服务商的政策,否则你的账号可能会被暂时或永久封禁。

5.5 邮件内容的优化

避免垃圾邮件过滤器:确保你的邮件内容不会触发垃圾邮件过滤器。避免使用过多的感叹号、全大写字母或可疑的链接。同时,确保邮件的标题和内容相关,并且对收件人有价值。

5.6 测试

在生产环境之前进行测试:在将邮件发送功能部署到生产环境之前,确保在开发环境中进行充分的测试。测试不同的邮件服务商、不同的网络环境和不同的邮件内容,以确保你的邮件发送功能在各种情况下都能正常工作。

通过遵循这些注意事项和最佳实践,你可以确保你的邮件发送功能既安全又可靠。这些实践不仅可以帮助你避免潜在的问题,还可以提高你的邮件发送成功率。

进群一起交流icon-default.png?t=O83Ahttps://qm.qq.com/q/H8C416r92S

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

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

相关文章

DRC-20开发指南:新一代区块链代币标准

区块链技术自比特币诞生以来&#xff0c;迅速发展成为全球科技与金融领域的创新中心。随着区块链技术的普及&#xff0c;数字代币作为一种新兴的数字资产类别&#xff0c;逐渐为更多人所熟知。从ERC-20到BRC-20&#xff0c;代币标准的演进一直在推动着区块链生态系统的创新与发…

从零开始的JavaScript基础!

目录 一、JavaScript 的概述 二、如何在HTML页面中使用JS &#xff08;一&#xff09;、行内式 &#xff08;二&#xff09;、内嵌式 &#xff08;三&#xff09;、外链式 &#xff08;四&#xff09;、基本执行顺序 1.从上到下线性执行&#xff1a; 2.阻塞行为&#x…

“格格不入”的星瑞东方曜,燃油市场有麻烦了

文/王俣祺 导语&#xff1a;在新能源汽车蓬勃发展的当下&#xff0c;吉利近日推出的星瑞东方曜可以说有些“格格不入”了。那么&#xff0c;这款被称为“10万以内唯一选择”的新车&#xff0c;究竟带来了哪些新变化&#xff0c;又会给燃油市场中苦苦坚持的“战友们”带来多大的…

【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024)

在线投稿&#xff1a;学术会议-学术交流征稿-学术会议在线-艾思科蓝 2024年计算机视觉与艺术国际学术会议&#xff08;CVA 2024&#xff09;作为2024年人工智能、数字媒体技术与交互设计国际学术会议&#xff08;ICADI 2024)的分会。此次大会旨在汇聚全球在计算机视觉与艺术…

【MySql】-0.1、Unbunt20.04二进制方式安装Mysql5.7和8.0

1、下载Mysql二进制报&#xff08;选择Linux的通用版本&#xff09; mysql官网地址&#xff1a;https://downloads.mysql.com/archives/community/ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.26-linux-glibc2.12-x86_64.tar wget https://downloads.…

H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)

LUA脚本的好处是用户可以根据自己注册的一批API&#xff08;当前TOOL已经提供了几百个函数供大家使用&#xff09;&#xff0c;实现各种小程序&#xff0c;不再限制Flash里面已经下载的程序&#xff0c;就跟手机安装APP差不多&#xff0c;所以在H7-TOOL里面被广泛使用&#xff…

【Cri-Dockerd】安装cri-dockerd

cri-dockerd的作用&#xff1a; 在k8s1.24之前。k8s会通过dockershim来调用docker进行容器运行时containerd&#xff0c;并且会自动安装dockershim&#xff0c;但是从1.24版本之前k8s为了降低容器运行时的调用的复杂度和效率&#xff0c;直接调用containerd了&#xff0c;并且…

java实现的音视频格式转化器

一、前言 最近写了一款图形界面版的音视频格式转化器&#xff0c;可以实现将多种视频之间进行转化&#xff0c;非常好用&#xff0c;如将AVI转换为&#xff0c;TS&#xff0c;FLV&#xff0c;MP4等。音频可将MP3转成WAV。 二、实现 1.需引入相关maven依赖。 <!-- 核心包 -…

Java知识巩固(十二)

I/O JavaIO流了解吗&#xff1f; IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因…

1.3 面向对象 C++面试问题

1.3.1 简述一下什么是面向对象,面向对象与面向过程的区别 什么是面向对象 面向对象&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它通过将现实世界中的实体抽象为“对象”来组织代码。面向对象编程关注对象及其交互&#x…

Visual Studio Code

代码自动保存 打开设置搜索auto save&#xff0c;设置为afterDelay 设置延迟时间&#xff0c;单位是毫秒 启用Ctrl鼠标滚轮对字体进行缩放 搜索Mouse Wheel Zoom&#xff0c;把该选项勾选上即可 Python插件 运行和调试Python

Hash表算法

哈希表 理论知识&#xff08;本文来自于代码随想录摘抄&#xff09;什么是哈希常见的三种哈希结数组&#xff1a;set:map:其他常用方法或者技巧&#xff08;自己总结的&#xff09; 练习题和讲解有效的字母移位词349. 两个数组的交集1. 两数之和454. 四数相加 II15. 三数之和 总…

广泛的四款录屏工具专业软件解析!!!

当代社会的进步&#xff0c;电脑、手机等数码产品的普及&#xff0c;改变了我们的沟通形式&#xff0c;只需要动动手指&#xff0c;就能实现视频连接&#xff0c;影像播放等。有时候就需要我们录屏留存。在市面上的录屏软件种类繁多&#xff0c;从简洁易用的小工具到功能丰富的…

通俗直观介绍ChatGPT背后的大语言模型理论知识

“AI 的 iPhone 时刻到来了”。非算法岗位的研发同学’被迫’学习 AI&#xff0c;产品岗位的同学希望了解 AI。但是&#xff0c;很多自媒体文章要么太严谨、科学&#xff0c;让非科班出身的同学读不懂&#xff1b;要么&#xff0c;写成了科幻文章&#xff0c;很多结论都没有充分…

力扣21 : 合并两个有序链表

链表style 描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 节点大小相同时&#xff0c;l1的节点在前 何解&#xff1f; 1&#xff0c;遍历两个链表&#xff0c;挨个比较节点大小 同时遍…

MATLAB——入门知识

内容源于b站清风数学建模 目录 1.帮助文档 2.注释 3.特殊字符 4.设置MATLAB数值显示格式 4.1.临时更改 4.2.永久改 5.常用函数 6.易错点 1.帮助文档 doc sum help sum edit sum 2.注释 ctrl R/T 3.特殊字符 4.设置MATLAB数值显示格式 4.1.临时更改 format lon…

LCR 024. 反转链表 最细图片逐行解析过程

LCR 024. 反转链表 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例…

【JavaEE】【多线程】定时器

目录 一、定时器简介1.1 Timer类1.2 使用案例 二、实现简易定时器2.1 MyTimerTask类2.2 实现schedule方法2.3 构造方法2.4 总代码2.5 测试 一、定时器简介 定时器&#xff1a;就相当于一个闹钟&#xff0c;当我们定的时间到了&#xff0c;那么就执行一些逻辑。 1.1 Timer类 …

TVM前端研究--Relay

文章目录 深度学习IR梳理1. IR属性2. DL前端发展3. DL编译器4. DL编程语言Relay的主要内容一、Expression in Relay1. Dataflow and Control Fragments2. 变量3. 函数3.1 闭包3.2 多态和类型关系3.3. Call4. 算子5. ADT Constructors6. Moudle和Global Function7. 常量和元组8.…

SSL/TLS 密码套件漏洞分析以及修复方法

1. 前言 在当今数字化时代&#xff0c;网络安全至关重要。SSL/TLS 协议作为保障网络通信安全的重要手段&#xff0c;广泛应用于各类网络应用中。然而&#xff0c;如同任何技术一样&#xff0c;SSL/TLS 也并非绝对安全&#xff0c;存在着一些可能被攻击者利用的漏洞。本文将深入…