【Python快速上手(二十七)】- Python3 SMTP发送邮件

目录

  • Python快速上手(二十七)- Python3 SMTP发送邮件
    • Python3 SMTP发送邮件
      • 1. SMTP 基本概念
      • 2. 使用 smtplib 发送简单邮件
        • 2.1 设置 SMTP 服务器
        • 2.2 登录到 SMTP 服务器
        • 2.3 发送邮件
        • 2.4 关闭连接
      • 3. 构建复杂邮件
        • 3.1 构建带有 HTML 内容的邮件
        • 3.2 发送带有 HTML 内容的邮件
      • 4. 添加附件
        • 4.1 构建带有附件的邮件
        • 4.2 发送带有附件的邮件
      • 5. 使用安全连接
        • 5.1 使用 SSL 连接
        • 5.2 使用 STARTTLS
      • 6. 异常处理
        • 6.1 捕获连接错误
      • 7. 实际应用案例
        • 7.1 发送带有附件和 HTML 内容的邮件

Python快速上手(二十七)- Python3 SMTP发送邮件

Python3 SMTP发送邮件

SMTP(Simple Mail Transfer Protocol)是发送电子邮件的标准协议。Python 提供了 smtplib 模块来实现 SMTP 客户端,用于发送电子邮件。本文将详细讲解如何使用 Python3 的 smtplib 模块发送电子邮件,包括基本使用方法、构建复杂邮件、附件处理、安全连接、异常处理和实际应用案例。

1. SMTP 基本概念

在深入讲解之前,了解一些基本概念是必要的:

  • SMTP 服务器:处理发送邮件请求的服务器。常见的 SMTP 服务器有 Gmail、Yahoo、Outlook 等。
  • SMTP 客户端:用于与 SMTP 服务器通信的客户端程序。在本文中,Python 程序将充当 SMTP 客户端。
  • 端口:SMTP 通常使用端口 25,但为了安全起见,TLS/SSL 加密的 SMTP 通常使用端口 587 或 465。

2. 使用 smtplib 发送简单邮件

首先,从发送一封简单的邮件开始。

2.1 设置 SMTP 服务器

要发送邮件,首先需要连接到 SMTP 服务器。

import smtplibsmtp_server = "smtp.example.com"  # 替换为您的 SMTP 服务器地址
port = 587  # 使用适当的端口号
sender_email = "your_email@example.com"  # 发送方邮箱地址
password = "your_password"  # 发送方邮箱密码# 创建 SMTP 客户端会话对象
server = smtplib.SMTP(smtp_server, port)
2.2 登录到 SMTP 服务器

连接到 SMTP 服务器后,需要进行身份验证。

server.starttls()  # 启用安全加密
server.login(sender_email, password)  # 登录 SMTP 服务器
2.3 发送邮件

登录成功后,可以使用 sendmail 方法发送邮件。

receiver_email = "receiver_email@example.com"  # 接收方邮箱地址
message = """\
Subject: Hi thereThis message is sent from Python."""server.sendmail(sender_email, receiver_email, message)
print("Email sent successfully.")
2.4 关闭连接

邮件发送完成后,需要关闭与 SMTP 服务器的连接。

server.quit()

完整示例代码如下:

import smtplibsmtp_server = "smtp.example.com"
port = 587
sender_email = "your_email@example.com"
password = "your_password"server = smtplib.SMTP(smtp_server, port)
server.starttls()
server.login(sender_email, password)receiver_email = "receiver_email@example.com"
message = """\
Subject: Hi thereThis message is sent from Python."""server.sendmail(sender_email, receiver_email, message)
print("Email sent successfully.")
server.quit()

3. 构建复杂邮件

使用 email 模块可以构建带有 HTML 内容、附件等复杂邮件。

3.1 构建带有 HTML 内容的邮件

首先,使用 email.mime.multipart 和 email.mime.text 构建 HTML 邮件。

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMETextmessage = MIMEMultipart("alternative")
message["Subject"] = "HTML Email"
message["From"] = sender_email
message["To"] = receiver_email# 创建纯文本和 HTML 内容
text = """\
Hi,
This is a plain text version of the email."""
html = """\
<html><body><p>Hi,<br>This is an <b>HTML</b> version of the email.</p></body>
</html>
"""# 将内容附加到 MIMEMultipart 对象
part1 = MIMEText(text, "plain")
part2 = MIMEText(html, "html")
message.attach(part1)
message.attach(part2)
3.2 发送带有 HTML 内容的邮件

使用 send_message 方法发送邮件。

server.send_message(message)

完整示例代码如下:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMETextsmtp_server = "smtp.example.com"
port = 587
sender_email = "your_email@example.com"
password = "your_password"
receiver_email = "receiver_email@example.com"server = smtplib.SMTP(smtp_server, port)
server.starttls()
server.login(sender_email, password)message = MIMEMultipart("alternative")
message["Subject"] = "HTML Email"
message["From"] = sender_email
message["To"] = receiver_emailtext = """\
Hi,
This is a plain text version of the email."""
html = """\
<html><body><p>Hi,<br>This is an <b>HTML</b> version of the email.</p></body>
</html>
"""part1 = MIMEText(text, "plain")
part2 = MIMEText(html, "html")
message.attach(part1)
message.attach(part2)server.send_message(message)
print("HTML email sent successfully.")
server.quit()

4. 添加附件

添加附件需要使用 email.mime.base 和 email 模块中的编码功能。

4.1 构建带有附件的邮件
from email.mime.base import MIMEBase
from email import encoders# 创建一个 MIMEBase 对象
part = MIMEBase("application", "octet-stream")# 读取附件内容并将其附加到 MIMEBase 对象
filename = "document.pdf"
with open(filename, "rb") as attachment:part.set_payload(attachment.read())# 对附件进行编码并添加到邮件
encoders.encode_base64(part)
part.add_header("Content-Disposition",f"attachment; filename= {filename}",
)
message.attach(part)
4.2 发送带有附件的邮件
server.send_message(message)

完整示例代码如下:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoderssmtp_server = "smtp.example.com"
port = 587
sender_email = "your_email@example.com"
password = "your_password"
receiver_email = "receiver_email@example.com"server = smtplib.SMTP(smtp_server, port)
server.starttls()
server.login(sender_email, password)message = MIMEMultipart()
message["Subject"] = "Email with Attachment"
message["From"] = sender_email
message["To"] = receiver_emailtext = """\
Hi,
This email contains an attachment."""
message.attach(MIMEText(text, "plain"))part = MIMEBase("application", "octet-stream")
filename = "document.pdf"
with open(filename, "rb") as attachment:part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header("Content-Disposition",f"attachment; filename= {filename}",
)
message.attach(part)server.send_message(message)
print("Email with attachment sent successfully.")
server.quit()

5. 使用安全连接

为保证安全性,可以使用 SSL/TLS 连接到 SMTP 服务器。

5.1 使用 SSL 连接
import smtplibsmtp_server = "smtp.example.com"
port = 465
sender_email = "your_email@example.com"
password = "your_password"server = smtplib.SMTP_SSL(smtp_server, port)
server.login(sender_email, password)receiver_email = "receiver_email@example.com"
message = """\
Subject: Hi thereThis message is sent from Python."""server.sendmail(sender_email, receiver_email, message)
print("Secure email sent successfully.")
server.quit()
5.2 使用 STARTTLS
import smtplibsmtp_server = "smtp.example.com"
port = 587
sender_email = "your_email@example.com"
password = "your_password"server = smtplib.SMTP(smtp_server, port)
server.starttls()  # 启用安全加密
server.login(sender_email, password)receiver_email = "receiver_email@example.com"
message = """\
Subject: Hi thereThis message is sent from Python."""server.sendmail(sender_email, receiver_email, message)
print("Secure email sent successfully.")
server.quit()

6. 异常处理

在实际应用中,处理可能发生的异常非常重要。常见的异常包括连接错误、身份验证错误等。

6.1 捕获连接错误
try:server = smtplib.SMTP(smtp_server, port)server.starttls()server.login(sender_email, password)
except smtplib.SMTPConnectError as e:print("Connection error:", e)
except smtplib.SMTPAuthenticationError as e:print("Authentication error:", e)

6.2 捕获发送错误

try:server.sendmail(sender_email, receiver_email, message)
except smtplib.SMTPRecipientsRefused as e:print("Recipient refused:", e)
except smtplib.SMTPDataError as e:print("Data error:", e)

完整示例代码如下:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoderssmtp_server = "smtp.example.com"
port = 587
sender_email = "your_email@example.com"
password = "your_password"
receiver_email = "receiver_email@example.com"try:server = smtplib.SMTP(smtp_server, port)server.starttls()server.login(sender_email, password)message = MIMEMultipart()message["Subject"] = "Email with Attachment"message["From"] = sender_emailmessage["To"] = receiver_emailtext = """\Hi,This email contains an attachment."""message.attach(MIMEText(text, "plain"))part = MIMEBase("application", "octet-stream")filename = "document.pdf"with open(filename, "rb") as attachment:part.set_payload(attachment.read())encoders.encode_base64(part)part.add_header("Content-Disposition",f"attachment; filename= {filename}",)message.attach(part)server.send_message(message)print("Email with attachment sent successfully.")
except smtplib.SMTPConnectError as e:print("Connection error:", e)
except smtplib.SMTPAuthenticationError as e:print("Authentication error:", e)
except smtplib.SMTPRecipientsRefused as e:print("Recipient refused:", e)
except smtplib.SMTPDataError as e:print("Data error:", e)
except Exception as e:print("An error occurred:", e)
finally:server.quit()

7. 实际应用案例

7.1 发送带有附件和 HTML 内容的邮件

以下示例展示了如何发送带有附件和 HTML 内容的邮件。

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encodersdef send_email_with_attachment(subject, body, to_email, attachment_path):smtp_server = "smtp.example.com"port = 587sender_email = "your_email@example.com"password = "your_password"try:server = smtplib.SMTP(smtp_server, port)server.starttls()server.login(sender_email, password)message = MIMEMultipart()message["Subject"] = subjectmessage["From"] = sender_emailmessage["To"] = to_emailmessage.attach(MIMEText(body, "html"))part = MIMEBase("application", "octet-stream")with open(attachment_path, "rb") as attachment:part.set_payload(attachment.read())encoders.encode_base64(part)part.add_header("Content-Disposition",f"attachment; filename= {attachment_path.split('/')[-1]}",)message.attach(part)server.send_message(message)print("Email sent successfully.")except Exception as e:print("An error occurred:", e)finally:server.quit()subject = "Test Email"
body = """\
<html><body><p>Hi,<br>This is a test email with an <b>attachment</b>.<br>Regards,<br>Python Script</p></body>
</html>
"""
to_email = "receiver_email@example.com"
attachment_path = "document.pdf"send_email_with_attachment(subject, body, to_email, attachment_path)

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

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

相关文章

Zookeeper 面试题(六)

1. 简述Zookeeper中的脑裂问题 &#xff1f; 在分布式系统中&#xff0c;脑裂&#xff08;Split-brain&#xff09;问题是指由于网络分区或其他故障导致系统分裂成两个或多个独立的、相互之间无法通信的部分&#xff0c;每个部分都认为自己是整个系统的唯一活跃部分。在ZooKee…

一阶数字高通滤波器

本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 1 计算公式推导 1.1.2 算法实现及仿真 利用python实现的代码如下&#xff1a; import numpy as np # from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt #2pifW…

从原理上解决 uniapp (含第三方插件)打包 iOS APP 失败的问题

最近一段时间&#xff0c;我的团队基于uniapp开发的平台型APP因平台资金合规的要求&#xff0c;需要对接中金支付&#xff0c;uniapp的插件市场有一个别人做好的中金支付插件&#xff0c;但前端开发同事在引用这个 插件时&#xff0c;出现了 iOS APP 打包不成功的情况&#xff…

Pantera 合伙人简谈 Morpho:更高效、适应性更强的 DeFi 解决方案

原文标题&#xff1a;《Pioneering Peer-to-Peer Lending in the DeFi Revolution》撰文&#xff1a;Pantera Capital 合伙人 Paul Veradittakit编译&#xff1a;Chris&#xff0c;Techub News 文章来源&#xff1a;香港Web3媒体Techub News Morpho 正在超越 Compound 等传统…

Redis主从、哨兵、cluster集群的部署和细节

目录 1. 主从模式 为什么需要主从&#xff1f; 搭建主从架构 2. Sentinel(哨兵)模式 为什么需要哨兵模式&#xff1f; 搭建哨兵集群 哨兵集群 Go语言编程redis哨兵模式 有了哨兵&#xff0c;客户端连接谁&#xff1f; test1&#xff1a;redis节点主从切换 test2&am…

webgl入门-矩阵变换

矩阵变换 前言 变换有三种状态&#xff1a;平移、旋转、缩放。 当我们变换一个图形时&#xff0c;实际上就是在移动这个图形的所有顶点。 课堂目标 掌握图形变换的三种方式。可以对图像进行复合变换。 知识点 平移旋转缩放 第一章 平移 对图形的平移就是对图形所有顶点…

如何快速从手动测试转向自动化测试

寻求具有无缝持续集成和持续交付 (CI/CD) 的高效 DevOps 管道比以往任何时候都更加重要。想象一下这样一个场景&#xff1a;您的软件组织显著减少了人工工作量、降低了成本&#xff0c;并更加自信地发布了软件更新。换句话说&#xff0c;通过将 Web UI 和 API 测试结合在一起&a…

【小白课程】如何在openKylin上个性化定制开关机动画

开关机动画是Linux系统的重要组成部分&#xff0c;其主要功能是在Linux内核启动的早期遮盖内核打印日志&#xff0c;并在内核刷新屏幕分辨率时保证屏幕显示的流畅性。 其中&#xff0c;openKylin操作系统使用plymouth组件作为开关机动画显示程序。Linux系统在启动时&#xff0…

计算机SCI期刊,中科院2区,收稿范围非常广泛!

一、期刊名称 Journal of Web Semantics 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;2.5 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$1600 三、期刊征稿范围 《网络语义学杂志》…

【软件测试】5.测试用例

目录 1.测试用例 1.1概念 1.2测试的要素 2.测试用例的万能公式 2.1常规思考逆向思维发散性思维 2.2万能公式 2.2.1功能测试 2.2.2界面测试 2.2.3性能测试 2.2.4兼容性测试 2.2.5易用性测试 2.2.6安全测试 2.3弱网测试 1.测试用例 1.1概念 什么是测试用例&#xf…

Jenkins 构建 Web 项目:构建服务器和部署服务器分离的情况

构建命令 #!/bin/bash node -v pnpm -v pnpm install pnpm build:prod # 将dist打包成dist.zip zip -r dist.zip dist

2024离婚新规已生效,不用等30天冷静期,线上开庭

2024年离婚必知的12条法律知识&#xff1a; ✅分居多久都不会自动离婚&#xff0c;想离婚&#xff0c;必需通过协议或起诉程序离婚 ✅婚后的工资收入&#xff0c;继承的遗产(未指定只给一人&#xff09;都是夫妻共同财产 ✅没有领结婚证&#xff0c;或领证后没有共同生活&#…

软件项目运维方案-word原件2024

1. 文档介绍 1.1 文档目的 1.2 文档范围 1.3 读者对象 1.4 参考文献 1.5 术语与缩写解释 2. 人员与责任 2.1 项目建设管理机构 2.2 驻场人员工作时间 2.3 人员培训 2.3.1. 培训需求管理 2.3.2. 培训内容管理 2.4 绩效考核 3. 运维过程内容 3.1. 运维模型 3.2. P…

多电脑共享鼠标键盘

由于要在两个电脑之间共用一套鼠标键盘&#xff0c;所以在此记录一下。 mouse without borders Mouse without Borders 是一款免费的 Windows 工具&#xff0c;允许你在多台电脑之间共享鼠标和键盘。 安装与配置步骤 下载和安装&#xff1a; 前往 Mouse without Borders 官…

LangChain - 概念指南

文章目录 一、Architecture1、langchain-core2、partner-packages3、langchain4、langchain-community5、langgraph6、langserve7、langsmith 二、浪链表达语言&#xff08;LCEL &#xff09;可运行界面 runnable-interface 三、组件 components1、聊天模型 chat-models2、 LLM…

工程机械租赁平台数字化平台系统油耗与排放管理创新与应用

在快速发展的城市建设和基础设施项目中&#xff0c;工程机械扮演着举足轻重的角色。随着工程规模的扩大和施工技术的不断进步&#xff0c;工程机械租赁平台应运而生&#xff0c;为建设项目提供了灵活高效的解决方案。然而&#xff0c;随着租赁机械数量的增加&#xff0c;如何有…

【GO基础】GO基础语法一

GO基础语法一 一、编写第一个Go程序1、基本程序结构2、应用程序入口3、退出返回值4、获取命令行参数 二、变量&#xff0c;常量以及与其他语言的差异1、编写测试程序2、实现Fibonacci数列3、变量赋值4、常量定义 三、数据类型1、类型转化2、类型的预定义值3、指针类型 四、运算…

微信小程序仿胖东来轮播和背景效果(有效果图)

效果图 .wxml <view class"swiper-index" style"--width--:{{windowWidth}}px;"><image src"{{swiperList[(cardCur bgIndex -1?swiperList.length - 1:cardCur bgIndex > swiperList.length -1?0:cardCur bgIndex)]}}" clas…

【四数之和】python,排序+双指针

四层循环&#xff1f;&#xff08;doge) 和【三数之和】题目很类似 class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:nums.sort()#a,b,c,d四个数&#xff0c;先固定两个数&#xff0c;那就是双指针问题了&#xff0c;令ba1&#xff…

关于搜索引擎链路

一、搜索引擎的的链路 简单流程如下&#xff0c;一般都包括query理解&#xff0c;召回&#xff0c;粗排&#xff0c;精排&#xff0c;重排。 二、query理解&#xff0c;查询词处理 对于进来的query需要有很多道工序做处理。才能让搜索引擎的效果更好、更智能。 2.1 分词 分词…