使用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 time库的使用

    详解Python time库的使用

    这篇文章主要介绍了Python time库的使用,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • 详解python requests中的post请求的参数问题

    详解python requests中的post请求的参数问题

    这篇文章主要介绍了详解python requests中的post请求的参数问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python爬取数据并实现可视化代码解析

    Python爬取数据并实现可视化代码解析

    这篇文章主要介绍了Python爬取数据并实现可视化代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • python的metaclass使用小结

    python的metaclass使用小结

    python中的metaclass可谓熟悉而又陌生,自己开发时很少用,阅读源码时却经常遇到,那么到底什么是metaclass呢?何时使用metaclass呢?这篇文章主要介绍了python的metaclass,需要的朋友可以参考下
    2024-01-01
  • Python删除列表中重复元素的七种方法举例

    Python删除列表中重复元素的七种方法举例

    我们在面试中很可能遇到给定一个含有重复元素的列表,删除其中重复的元素,下面这篇文章主要给大家介绍了关于Python删除列表中重复元素的七种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 深入理解Python中的函数参数传递机制

    深入理解Python中的函数参数传递机制

    在Python中,对于函数的参数传递,有两种主要的方式:传值和传引用。事实上,Python的参数传递是一种“传对象引用”的方式,本文呢我们将详细介绍Python的函数参数传递机制,这对理解Python编程语言的底层实现以及优化你的代码都非常有帮助
    2023-07-07
  • Python数据结构集合set教程示例详解

    Python数据结构集合set教程示例详解

    这篇文章主要为大家介绍了Python数据结构集合set教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • PyQt教程之自定义组件Switch Button的实现

    PyQt教程之自定义组件Switch Button的实现

    这篇文章主要为大家详细介绍了PyQt中如何实现自定义组件Switch Button,文中的示例代码简洁易懂,具有一定的学习价值,感兴趣的可以了解一下
    2023-05-05
  • Python中将语音转换为文本的实现方法

    Python中将语音转换为文本的实现方法

    语音识别是计算机软件识别口语中的单词和短语并将其转换为人类可读文本的能力,在本教程中,您将学习如何使用SpeechRecognition 库在 Python 中将语音转换为文本,文中有相关的代码供大家参考,需要的朋友可以参考下
    2024-01-01
  • Python中的文件输入输出问题

    Python中的文件输入输出问题

    这篇文章主要介绍了Python中的文件输入输出问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论