使用Python自动发送邮件的实现步骤

 更新时间:2026年01月28日 08:57:08   作者:艾派森  
本文介绍了如何使用Python的smtplib和email模块通过SMTP协议,实现向QQ邮箱发送纯文本、HTML格式邮件以及带有附件的功能,包括登录验证和代码示例,需要的朋友可以参考下

发送普通邮件

 SMTP(Simple Mail Transfer Protocol)是简单传输协议。

python中对SMTP进行了简单的封装,可以发送纯文本邮件、HTML 邮件以及带附件的邮件。两个核心模块如下:

email模块:负责构建邮件

smtplib模块:负责发送邮件

常用方法与属性: 

 如果要使用qq邮箱发送的话,需要在qq邮箱设置-账户里面开启POP3/SMTP服务

 首次开启需要你用手机号发送短信,照着做就好了,做完之后会给你一个授权码,记着这个授权码,写代码需要用到,忘记了也可以找回

接着编写代码,发送普通邮件

import smtplib
from email.mime.text import MIMEText
from email.header import Header

def send_email():
    # 设置要登录的邮箱
    smtp_obj = smtplib.SMTP('smtp.qq.com')
    # 登录邮箱  这里需要填写你的qq邮箱地址和生成的授权码
    smtp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
    # 编辑内容
    mail_text = 'This is Email~ 您要的邮件来啦~~'
    # plain 原生文本模式
    msg_body = MIMEText(mail_text,'plain','utf-8')
    # 设置从哪发送的
    msg_body['From'] = Header('xxx','utf-8')  # 设置发送人
    msg_body['Subject'] = Header('测试Python自动邮件','utf-8')  # 设置内容主题
    # 发送邮件  这里第一个邮箱填自己的,第二个填收件人的邮箱地址
    smtp_obj.sendmail('398707160@qq.com','hotelmail@126.com',msg_body.as_string())

if __name__ =='__main__':
    send_email()

发送HTML邮件

 发送HTML邮件只需要把发送的内容换成html代码即可

import smtplib
from email.mime.text import MIMEText
from email.header import Header

def send_email():
    # 设置要登录的邮箱
    smtp_obj = smtplib.SMTP('smtp.qq.com')
    # 登录邮箱  这里需要填写你的qq邮箱地址和生成的授权码
    smtp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
    # 编辑内容
    mail_text = '''
    <h1 style='color:red'>这是一个HTML邮件通知</h1>
    <p>这个是邮件的内容</p>
    <p><a href='http://www.itbaizhan.cn'>这个是链接</a></p>
    '''
    # plain 原生文本模式
    msg_body = MIMEText(mail_text,'plain','utf-8')
    # 设置从哪发送的
    msg_body['From'] = Header('xxx','utf-8')  # 设置发送人
    msg_body['Subject'] = Header('测试Python自动邮件','utf-8')  # 设置内容主题
    # 发送邮件  这里第一个邮箱填自己的,第二个填收件人的邮箱地址
    smtp_obj.sendmail('398707160@qq.com','hotelmail@126.com',msg_body.as_string())

if __name__ =='__main__':
    send_email()

发送附件邮件-smtplib

有时邮件的内容只靠文本是无法完全描述内容。这时就可以考虑发 送附件来携带内容。具体方法如下:

设置登录服务器 、登录邮箱、增加附件 、设置请求头、 发送邮件

import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.header import Header

def send_file_email():
    # 设置邮箱服务器
    stmp_obj = smtplib.SMTP('smtp.qq.com')
    # 登录邮箱
    stmp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
    # 设置邮件内容
    # 文本
    msg_txt = MIMEText('这个带有附件的邮件','plain','utf-8')
    # 附件  打开你要发送的文件
    msg_file = MIMEApplication(open('./base_data/backg.jpg','rb').read())
    msg_file.add_header('Content-Disposition','attachment',filename='bg.jpg')
    # 封装要发送的数据
    part = MIMEMultipart()
    part.attach(msg_txt)
    part.attach(msg_file)
    # 设置邮件其它信息
    part['From'] = Header('xx','utf-8')
    part['Subject'] = Header('附件邮件','utf-8')
    # 发送邮件
    stmp_obj.sendmail('xxx@qq.com','hotelmail@126.com',part.as_string())

if __name__ =='__main__':
    send_file_email()

批量发送邮件-smtplib

这里以发送工资条为例

工资数据如下: 

from email.header import Header
from email.mime.text import MIMEText
import smtplib

from openpyxl import load_workbook

def send_many_mail():
     # 设置登录邮箱服务器
    smtp_obj = smtplib.SMTP('smtp.qq.com')
    # 登录邮箱
    smtp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
    # 打开excel文件
    wb = load_workbook('./base_data/工资数据.xlsx',data_only=True)
    # 激活工作簿
    sh = wb.active
    # 读取数据-遍历
    for i,r in enumerate(sh.iter_rows()):
        if i != 0:
            # 编辑内容
            msg_txt = f'''
            <h3>您好:{r[1].value}</h3>
            <p>请查收2030年12月工资条详情:</p>
            <table border="1">
            <tr>
                <td>工号</td>
                <td>姓名</td>
                <td>部门</td>
                <td>基本工资</td>
                <td>提成</td>
                <td>加班工资</td>
                <td>社保扣除</td>
                <td>考勤扣除</td>
                <td>应发工资</td>
                <td>邮箱</td>
            </tr>
            <tr>
                <td>{r[0].value}</td>
                <td>{r[1].value}</td>
                <td>{r[2].value}</td>
                <td>{r[3].value}</td>
                <td>{r[4].value}</td>
                <td>{r[5].value}</td>
                <td>{r[6].value}</td>
                <td>{r[7].value}</td>
                <td>{r[8].value}</td>
                <td>{r[9].value}</td>
            </tr>
        </table>
            '''
            msg =  MIMEText(msg_txt,'html','utf-8')
            # 设置邮件其他信息
            msg['From'] = Header('财务部','utf-8')
            msg['Subject'] = Header('工资条','utf-8')
            #发送邮件
            smtp_obj.sendmail('xxx@qq.com',{r[9].value},msg.as_string())
            print(f'{r[1].value} 工资条发送成功!!')
if __name__ =='__main__':
    send_many_mail()

发送邮件-zmail

 Zmail的优势

1 自动填充大多数导致服务端拒信的头信息(From To LocalHost之类的)

2 将一个字典映射为email,构造信件就像构造字典一样简单

3 自动寻找邮件服务商端口号地址,自动选择合适的协议(经过认证的)

安装:pip install zmail

发送的消息以字典发送,包含的key:

subject 邮件主题

from 发送人

content_text 邮件内容-文本

content_html 邮件内容-HTML

attachments 邮件内容-附件,可写多个 

import zmail
def send_text():
    # 登录邮箱
    server = zmail.server('xxx@qq.com','spcdwgqkltjsbiah')
    # 编写内容
    info = {
        'from':'笨笨的张小白',
        'subject':'测试zmail模块',
        'content_text':'这个是zmail邮件信息'
    }
    # 发送邮件
    server.send_mail('hotelmail@126.com',info)
def send_html():
    # 登录邮箱
    server = zmail.server('xxx@qq.com','spcdwgqkltjsbiah')
    # 编写内容
    info = {
        'from':笨笨的张小白',
        'subject':'测试zmail模块',
        'content_html':'<h1>这个是zmail邮件信息</h1>'
    }
    # 发送邮件
    server.send_mail('hotelmail@126.com',info)
def send_file():
    # 登录邮箱
    server = zmail.server('xxx@qq.com','spcdwgqkltjsbiah')
    # 编写内容
    info = {
        'from':'笨笨的张小白',
        'subject':'测试zmail模块',
        'content_html':'<h1>这个是zmail邮件信息</h1>',
        'attachments':[r'.\base_data\backg.jpg']
    }
    # 发送邮件
    server.send_mail('hotelmail@126.com',info)
def get_email():
    # 登录邮箱
    server = zmail.server('xxx@qq.com','tzteewnmyfqacbce')
    email = server.get_latest()
    print(email.get('subject'))
    print(email.get('from'))
    print(email.get('content_html'))
    print(email.get('content_text'))
    
if __name__ == '__main__':
    # send_text()
    # send_html()
    # send_file()
    get_email()

以上就是使用Python自动发送邮件的实现步骤的详细内容,更多关于Python自动发送邮件的资料请关注脚本之家其它相关文章!

相关文章

  • Python中文件读取操作漏洞深度解析与防护指南

    Python中文件读取操作漏洞深度解析与防护指南

    在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可以了解下
    2025-06-06
  • Django模型修改及数据迁移实现解析

    Django模型修改及数据迁移实现解析

    这篇文章主要介绍了Django模型修改及数据迁移实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 基于Python实现计算纳什均衡的示例详解

    基于Python实现计算纳什均衡的示例详解

    纳什均衡是一种博弈论中的概念,它描述了一种平衡状态,其中每个参与者都不能通过独立改变其决策来提高自己的利益。本文就来用Python中的Nashpy和PuLP实现计算纳什均衡,感兴趣的可以了解一下
    2023-02-02
  • python调用API实现智能回复机器人

    python调用API实现智能回复机器人

    这篇文章主要为大家详细介绍了python调用API实现智能回复机器人,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • python实现批量视频分帧、保存视频帧

    python实现批量视频分帧、保存视频帧

    这篇文章主要为大家详细介绍了python实现批量视频分帧、保存视频帧,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Python中WebService客户端接口调用及身份验证的问题

    Python中WebService客户端接口调用及身份验证的问题

    这篇文章主要介绍了Python中WebService客户端接口调用及身份验证的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • python学习基础之循环import及import过程

    python学习基础之循环import及import过程

    python中的import语句是用来导入模块的,下面这篇文章主要给大家介绍了关于python学习基础之循环import及import过程的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-04-04
  • Pytest实现setup和teardown的详细使用详解

    Pytest实现setup和teardown的详细使用详解

    这篇文章主要介绍了Pytest实现setup和teardown的详细使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 教你如何用Python实现人脸识别(含源代码)

    教你如何用Python实现人脸识别(含源代码)

    Python可以从图像或视频中检测和识别你的脸.人脸检测与识别是计算机视觉领域的研究热点之一.人脸识别的应用包括人脸解锁、安全防护等,医生和医务人员利用人脸识别来获取病历和病史,更好地诊断疾病,需要的朋友可以参考下
    2021-06-06
  • python写xml文件的操作实例

    python写xml文件的操作实例

    这篇文章主要介绍了python写xml文件的操作实例,是非常常见的实用技巧,需要的朋友可以参考下
    2014-10-10

最新评论