Python通过smtplib发送邮件

2023-11-03

1.邮件发送的步骤:

  1. 创建一个smtp对象
  2. 连接smtp服务器
  3. 登陆smtp服务器
  4. 发送邮件
  5. 退出登录
import smtplib

# 1.创建一个smtp对象
smtp = smtplib.SMTP()
# 2.连接smtp服务器
# mainhost: 设置的目标服务器 一般就是域名 比如smtp.qq.com /smtp.163.com
# mainport: 端口号 25 465 22等
smtp.connect(mainhost, mainport)
# 3.登陆smtp服务器
# user: 用户名
# password: 授权码
smtp.login(user, password)
# 4.发送邮件
# msg: 就是使用email模块包装出来的对象 然后将这个对象转换为字符串
# from_addr: 邮件发送者地址
# to_addrs: 字符串列表,邮件发送地址
# msg: 发送消息
smtp.sendmail(from_addr, to_addrs, msg.as_string())
# 5.退出登陆
smtp.quit()

2.邮箱设置

以qq为例,我们要先进行设置,找到服务器、端口号、用户名、授权码等信息,其他邮箱也可以自己去尝试:
在这里插入图片描述
查看服务器和端口号:
在这里插入图片描述
在这里插入图片描述
获取授权码:
在这里插入图片描述

3.发送一封qq邮件

代码如下:

from email.mime.text import MIMEText  # 导包
import smtplib
from email.header import Header
# 设置第三方smtp相关服务信息
main_host = "smtp.qq.com"  # 设置服务器 如果是163 写smtp.163.com即可
main_user = "xxxxxxxxxx@qq.com"  # 用户名 或者是xxxxxxx@163.com
main_pass = "填写自己获取的授权码"  # 授权码
# 设置接收与发送邮件者
sender = "xxxxxxxxxx@qq.com"
receiver = "xxxxxxxxxx@qq.com"  # 第一次可以先测试自己发送给自己

# TODO 1.将发送的内容包装成为邮件需要的格式
content = "Hello World python email"  # 发送内容
msg = MIMEText(content, 'plain', 'utf-8')
# 这里可以将xxxxxxxxxx@qq.com指定为中文
msg["from"] = Header("xxxxxxxxxx@qq.com", "utf-8")
msg["To"] = Header("xxxxxxxxxx@qq.com", "utf-8")
subject = "Python SMTP qq邮件测试尝试"
msg["subject"] = Header(subject, "utf-8")

# TODO 2.使用smtplib模块发送邮件
try:
    smtp = smtplib.SMTP()  # 1.创建一个smtp对象
    smtp.connect(main_host, 25)  # 2.连接smtp服务器 # 这里的端口号写587也是可以的
    smtp.login(main_user, main_pass)  # 3.登陆smtp服务器
    smtp.sendmail(sender, receiver, msg.as_string())  # 4.发送邮件
    smtp.quit()  # 5.退出登陆
except smtplib.SMTPException:
    print("无法发送邮件")


在这里插入图片描述

4.发送HTML格式的邮件

Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。具体代码如下:

from email.mime.text import MIMEText  # 导包
from email.header import Header
import smtplib

# TODO 2.配置发送邮件需要的基本信息
# 设置第三方smtp相关服务信息
main_host = "smtp.qq.com"  # 设置服务器 如果是163 写smtp.163.com即可
main_user = "xxxxxxxxxx@qq.com"  # 用户名 或者是xxxxxxx@163.com
main_pass = "填写自己获取的授权码"  # 授权码
# 设置接收与发送邮件者
sender = "xxxxxxxxxx@qq.com"
receiver = "xxxxxxxxxx@qq.com"  # 第一次可以先测试自己发送给自己

# TODO 1.将发送的内容包装成为邮件需要的格式
content = """
    <p>Python 邮件发送测试...</p>
    <p><a href="https://blog.csdn.net/guiyin1150?spm=1010.2135.3001.5113">点击进入guiyin1150的博客</a></p>
"""  # 发送内容
msg = MIMEText(content, 'html', 'utf-8')
# 这里可以将xxxxxxxxxx@qq.com指定为中文
msg["from"] = Header("xxxxxxxxxx@qq.com", "utf-8")
msg["To"] = Header("xxxxxxxxxx@qq.com", "utf-8")
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")

# TODO 3.使用smtplib模块发送邮件
try:
    smtp = smtplib.SMTP()  # 1.创建一个smtp对象
    smtp.connect(main_host, 25)  # 2.连接smtp服务器 # 这里的端口号写587也是可以的
    smtp.login(main_user, main_pass)  # 3.登陆smtp服务器
    smtp.sendmail(sender, receiver, msg.as_string())  # 4.发送邮件
    smtp.quit()  # 5.退出登陆  
except smtplib.SMTPException:
    print("无法发送邮件")

在这里插入图片描述

5.发送带附件的邮件

代码如下:

# TODO 1.倒入需要相关的模块/类
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import smtplib

# TODO 2.包装email
# 创建一个带附件的实例
msg = MIMEMultipart()
msg["from"] = "xxxxxxxx@qq.com"
msg["to"] = "xxxxxxxx@qq.com"
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")

# 邮件正文内容
msg.attach(MIMEText("这是guiyin 现在开始Python邮件发送测试请查收....", "plain", "utf-8"))

# 构造附件1 传送当前目录下的user_info.txt文件
att1 = MIMEText(open("user_info.txt", "rb").read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="user_info.txt"'
msg.attach(att1)

# 构造附件2 传送当前目录下的gobang.py文件
att2 = MIMEText(open("d1.py", "rb").read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="d1.py"'
msg.attach(att2)

# TODO 3.发送邮件
# 准备发送邮件需要的基本信息
main_host = "smtp.qq.com"
main_user = "xxxxxxxx@qq.com"
main_pass = "填写自己获取的授权码"
sender = "xxxxxxxx@qq.com"
receiver = "xxxxxxxx@qq.com"
try:
    smtp = smtplib.SMTP()
    smtp.connect(main_host, 25)
    smtp.login(main_user, main_pass)
    smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()
except smtplib.SMTPException:
    print("无法发送邮件...")

在这里插入图片描述

6.在HTML文本中添加图片

代码如下:

# TODO 1.倒入需要相关的模块/类
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplib

# TODO 2.包装email
# 创建一个带附件的实例
msg = MIMEMultipart("related")
msg["from"] = "xxxxxxxxxx@qq.com"
msg["to"] = "xxxxxxxxxx@qq.com"
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")

msg2 = MIMEMultipart("alternative")
msg.attach(msg2)

mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="https://blog.csdn.net/guiyin1150?spm=1010.2135.3001.5113">点击进入guiyin1150的博客</a></p>
<p>图片演示: </p>
<p><img src="cid:image1"></p>
"""

msg2.attach(MIMEText(mail_msg, "html", "utf-8"))
# 指定图片为当前目录
msgImage = MIMEImage(open('timg.jpeg', "rb").read())
# 定义图片id 在html文本中引用
msgImage.add_header("Content-ID", "<image1>")
msg.attach(msgImage)

# TODO 3.发送邮件
# 准备发送邮件需要的基本信息
main_host = "smtp.qq.com"
main_user = "xxxxxxxxxx@qq.com"
main_pass = "填写自己获取到的授权码"
sender = "xxxxxxxxxx@qq.com"
receiver = "xxxxxxxxxx@qq.com"
try:
    smtp = smtplib.SMTP()
    smtp.connect(main_host, 25)
    smtp.login(main_user, main_pass)
    smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()
except smtplib.SMTPException:
    print("无法发送邮件...")

在这里插入图片描述

7. python给同一个人发送多封邮件

# TODO 1.倒入需要相关的模块/类
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import smtplib

# TODO 2.包装email
# 创建一个带附件的实例
msg = MIMEMultipart()
msg["from"] = "xxxxxxxxx@qq.com"
msg["to"] = "xxxxxxxxx@qq.com"
subject = "Python SMTP 邮件测试"
msg["subject"] = Header(subject, "utf-8")

# 邮件正文内容
msg.attach(MIMEText("这是guiyin 现在开始Python邮件发送测试请查收....", "plain", "utf-8"))

# 构造附件1 传送当前目录下的user_info.txt文件
att1 = MIMEText(open("user_info.txt", "rb").read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="user_info.txt"'
msg.attach(att1)

# 构造附件2 传送当前目录下的gobang.py文件
att2 = MIMEText(open("d1.py", "rb").read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="d1.py"'
msg.attach(att2)

# TODO 3.发送邮件
# 准备发送邮件需要的基本信息
main_host = "smtp.qq.com"
main_user = "xxxxxxxxx@qq.com"
main_pass = "填写授权码"
sender = "xxxxxxxxx@qq.com"
receiver = "xxxxxxxxx@qq.com"
try:
    smtp = smtplib.SMTP()
    smtp.connect(main_host, 25)
    smtp.login(main_user, main_pass)
    # 给同一个人发很多封 直接在这里加一个for循环即可 5:表示发送5封
    for i in range(5):
        smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()
except smtplib.SMTPException:
    print("无法发送邮件...")

在这里插入图片描述

8.python给不同的人发送不同内容的邮件

from email.mime.text import MIMEText  # 导包
from email.header import Header
import smtplib

# TODO 2.配置发送邮件需要的基本信息
# 设置第三方smtp相关服务信息
main_host = "smtp.qq.com"  # 设置服务器 如果是163 写smtp.163.com即可
main_user = "xxxxxxxxxx@qq.com"  # 用户名 或者是xxxxxxx@163.com
main_pass = "授权码"  # 授权码
# 设置接收与发送邮件者
sender = "xxxxxxxxxx@qq.com"
receiver = ["xxxxxxxxxx@qq.com", "xxxxxxxxxx@163.com", "xxxxxxxxxx@rzsyznzcwwgc.onexmail.com",
            "xxxxxxxxxx@qq.com"]
# 不同邮箱对应的人的姓名
receiver_name = ["name1", "name2", "name3", "name4"]

# TODO 1.将发送的内容包装成为邮件需要的格式
content = """
    Dear {}:
        恭喜你!通过软件自动化测试工程师面试,薪资20K,16薪,请携带相关证件,与2020-11-11日前来我司报道,谢谢。
"""  # 发送内容
for i in range(len(receiver)):
    msg = MIMEText(content.format(receiver_name[receiver.index(receiver[i])]), 'plain', 'utf-8')
    msg["from"] = Header("xxxxxxxxx@qq.com", "utf-8")
    msg["To"] = Header("xxxxxxxxx@qq.com", "utf-8")
    subject = "Python SMTP 邮件测试"
    msg["subject"] = Header(subject, "utf-8")
    # TODO 3.使用smtplib模块发送邮件
    try:
        smtp = smtplib.SMTP()  # 1.创建一个smtp对象
        smtp.connect(main_host, 25)  # 2.连接smtp服务器 # 这里的端口号写587也是可以的
        smtp.login(main_user, main_pass)  # 3.登陆smtp服务器
        smtp.sendmail(sender, receiver[i], msg.as_string())  # 4.发送邮件
        smtp.quit()  # 5.退出登陆
    except smtplib.SMTPException:
        print("无法发送邮件")

在这里插入图片描述

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

Python通过smtplib发送邮件 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 将 Python 中的日期与日期时间进行比较

    所以我有一个日期列表 datetime date 2013 7 9 datetime date 2013 7 12 datetime date 2013 7 15 datetime date 2013 7 18 datetime date
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只

随机推荐

  • 动态规划学习

    动态规划 动态规划简介 什么是动态规划 动态规划和递归区别 动态规划和分治区别 动态规划解决步骤 动态规划类别 1 坐标型动态规划 2 位操作型动态规划 3 背包型动态规划 动态规划简介 什么是动态规划 动态规划是运筹学中用于求解决策过程中
  • python已知两边求第三边_已知两边求第三边公式

    如果是三角形是直角三角形 知道两边 可以用勾股定理求出第三边 如果是三角形是普通三角形 锐角 钝角三角形 那这个条件下只能求出第三边的范围 两边之和大于第三边 两边之差小于第三边 求边公式 只知道两边相等如果一个是底边一个是腰的话 这个是正
  • 数学建模写作与排版

    1 2 数学建模 快速入门 上 1 3 数学建模 快速入门 下 写作部分 首页 论文标题 摘要 关键词 一 问题重述 二 问题分析 三 模型假设 四 符号说明 五 模型的建立与求解 六 模型的分析与检验 七 模型的评价 改进和推广 八 参考
  • NFS环境搭建

    NAT模式下 安装NFS sudo apt install nfs kernel server 重启NFS服务器 sudo etc init d nfs kernel server restart 修改配置文件 etc exports 在里
  • 灰色关联分析法

    与灰色预测模型一样 比赛不能优先使用 灰色关联往往可以与层次分析结合使用 层次分析用在确定权重上面 1 确定比较对象 评价对象 就是数据 并且需要进行规范化处理 就是标准化处理 见下面例题的表格数据 和参考数列 评价标准 一般该列数列都是1
  • windows下能搭建php-fpm吗 phpstudy

    这个Windows和Linux系统是不一样的 因为一般nginx搭配php需要php fpm中间件 但是Windows下需要第三方编译 下载的包里有php cgi exe 但不是php fpm如果想在windows上跑php fpm 据说可
  • 【ES】分布式集群

    ES 分布式集群 单节点集群 故障转移 水平扩容 应对故障 路由计算 本文主要参考尚硅谷的资料 少部分自己原创 有错误之处请指出 单节点集群 node 1001配置如下 集群名称 节点之间要保持一致 cluster name my elas
  • C++ PCL库实现最远点采样算法

    最远点采样 Farthest Point Sampling 简称FPS 是点云处理领域中的一种重要算法 用于对点云数据进行快速降采样 最早的最远点采样算法应该是在计算机图形学领域中提出的 用于在三维模型上进行表面重建 随着点云处理技术的发展
  • HDU--1200:To and Fro (字符串)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1200 2 解题代码 include
  • 服务器远程使用什么协议,云服务器远程是什么协议

    云服务器远程是什么协议 内容精选 换一换 弹性云服务器 Elastic Cloud Server 是一种可随时自动获取 计算能力可弹性伸缩的云服务器 可帮助您打造可靠 安全 灵活 高效的应用环境 确保服务持久稳定运行 提升运维效率 WinS
  • Jira 史诗指南 (2022)

    Jira 就是为了完成工作 而 Epics 是实现该目标的一种有价值的方式 一般来说 Epics 适用于顾名思义 不会在一天内完成但会 的工作 史诗 在本指南中 我们将分解什么是 Epics 它们的用途 以及它们的用途 以及如何创建和使用它
  • Qt 应用程序显示页面的方法

    1 在qt窗口中显示页面 1 pro中添加 QT webkitwidgets 2 添加头文件 include
  • Swift4.0 guard,Array,Dictionary

    guard的使用 guard是Swift新增语法 guard语句必须带有else语句当条件表达式为true时候跳过else语句中的内容 执行语句组内容 条件表达式为false时候执行else语句中的内容 跳转语句一般是return brea
  • Web服务器群集:Nginx网页及安全优化

    目录 一 理论 1 Nginx网页优化 2 Nginx安全优化 3 Nginx日志分割 二 实验 1 网页压缩 2 网页缓存 3 连接超时设置 4 并发设置 5 隐藏版本信息 6 脚本实现每月1号进行日志分割 7 防盗链 三 总结 一 理论
  • 上海交大ACM班C++算法与数据结构——数据结构之栈

    上海交大ACM班C 算法与数据结构 数据结构之栈 1 栈的定义 后进先出LIFO first in last out 先进后出FILO first in last out 的线性表 有关线性表可查看 上海交大ACM班C 算法与数据结构 数据
  • HTML ,CSS ,JS 组合运用制作登录界面,注册界面,相册旋转展示界面,并相互跳转联系,源代码

    完成 个人相册 项目登录页面 要求 1 使用正则表达式验证邮箱 2 密码长度至少为6位且为字母与数字的组合 可自行改变背景图片 此时所用图片与项目在同一目录下 只需写入文件名 图片要在与项目同级目录下 要写入路径及名称 登录界面所有代码如下
  • PHP学习之路——基本语法

    phpinfo是一个函数 功能 这个函数 功能 会显示一个当前电脑 服务器 的详细的PHP信息 我们写完一段代码 就需要在后面加分号 php的代码部份全部要用半角的英文 很多人容易写成全角的英文和符号造成PHP代码报错 PHP中的变量也是如
  • CPU乱序执行

    CPU乱序执行 CPU乱序执行是什么 例程 参考 总结 CPU乱序执行是什么 我们理解的程序是顺序执行的 其实是指在单个独立的进程中表现得像顺序运行的 而多处理器多线程共享内存系统是十分复杂的 需要约束这些复杂系统的行为 我们将程序线程共享
  • mavon-editor 使用及如何将html的数据转为markdown的数据问题

    1 安装mavon editor cnpm install mavon editor s 2 页面使用
  • Python通过smtplib发送邮件

    Python通过smtplib发送邮件 1 邮件发送的步骤 2 邮箱设置 3 发送一封qq邮件 4 发送HTML格式的邮件 5 发送带附件的邮件 6 在HTML文本中添加图片 7 python给同一个人发送多封邮件 8 python给不同的