Python--yagmail,我用这个模块每天定时给同事发邮件

简介: Python--yagmail,我用这个模块每天定时给同事发邮件

前言

想要实现自动化发送邮件,自己的邮箱必须开通SMTP服务。

开通SMTP服务

以QQ邮箱为例,其他邮箱类似。点击下方的「生成授权码」依照提示发送短信后,就能看到一串授权码了,例如:复制这个授权码,别点击确定了,然后啥也不知道。

模块/包

yagmail模块先对简单易用,非常适合初学者。且底层用的依旧是smtplib

pip install yagmail

导入模块

import yagmail

发送邮件

import yagmail
mail = yagmail.SMTP('发送邮箱的账号','发送邮箱的授权码','smtp.qq.com')
mail.send('接受邮件的账号',"测试邮件","Hello QingAn")
mail.close()

send源码参数

def send(
        self,
        to=None,
        subject=None,
        contents=None,
        attachments=None,
        cc=None,
        bcc=None,
        preview_only=False,
        headers=None,
        prettify_html=True,
        message_id=None,
        group_messages=True,
    )
to 收件人邮箱
subject 邮件主题
attachments 附件
cc 抄送
bcc 密送(类似于抄送,但是收件人看不到其他人的邮箱地址)
perview_only 仅预览(可以发送,但是接收方收不到)
headers 头部信息(需要时字典格式)
prettify_html 修饰HTML
message_id 消息ID
group_messages 组消息

初始化源码参数

def __init__(
        self,
        user=None,
        password=None,
        host="smtp.gmail.com",
        port=None,
        smtp_starttls=None,
        smtp_ssl=True,
        smtp_set_debuglevel=0,
        smtp_skip_login=False,
        encoding="utf-8",
        oauth2_file=None,
        soft_email_validation=True,
        dkim=None,
        **kwargs
    )
user 用户名
password 密码
host 发信服务
port 默认端口
smtp_ssl True
smtp_set_debuglevel debug等级
smtp_skip_login 跳过登录
encoding 编码格式
oauth2_file 身份鉴权
soft_email_validation 邮箱验证

邮箱域名

163邮箱 smtp.163.com
126邮箱 smtp.126.com
qq邮箱 smtp.qq.com

SMTP服务器域名都类似

批量发送邮箱

import yagmail
mail = yagmail.SMTP('11049@qq.com','yrynkiaaj','smtp.qq.com')
contents = ['下午好',"安某人批量代码测试"]
to_list = ['1867@163.com','204110@qq.com']
# 接收人,标题,内容,抄送
mail.send(to_list,"测试邮件",contents,cc="8736@qq.com")
mail.close()

自定义邮箱内容

import yagmail
mail = yagmail.SMTP('110489@qq.com','yrynkergiaaj','smtp.qq.com')
# 这里面有图片的写法,以及加入了超链接的写法
contents = ['下午好',"以此文件为准。安某人批量代码测试。",yagmail.inline(r"E:\VUE_DEMO\gzh.jpg"),'<a href="https://www.yuque.com/docs/share/6c284c79-d721-42bc-b8c5-210c05e7324b?#"> 《自动化发送邮件(yagmail)》密码:kl1l</a>']
# 附件
attachments = r'E:\352稳定性测试脚本.bat'
to_list = ['1867@163.com','2041@qq.com']
mail.send(to_list,"测试邮件",contents,cc="876@qq.com",headers={"name":"清安"},attachments=attachments)
mail.close()

最后的呈现

b5e87121c9a9c821b86805ed93ae1d9.jpg

封装

class Mail:
    """
    邮件相关类
    """
    def log(self, content):
        now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print(f'{now_time}: {content}')
    def yag_SMTP(self):
        return yagmail.SMTP(
            host=read_smtp()[0], user=read_smtp()[1],
            password=read_smtp()[2], smtp_ssl=True
        )
    def sendmail(self, contents=read_config()[0], subject=read_config()[1],
                 to=read_config()[2], attachments=read_config()[3]):
        """
        发送邮件
        Arguments:
            msg {str} -- 邮件正文
            title {str} -- 邮件标题
            receivers {list} -- 邮件发送者,数组
            attachment -- 测试报告附件
        """
        try:
            self.yag_SMTP().send(contents=contents, subject=subject,
                                 to=to, attachments=attachments)
            self.log("邮件发送成功")
        except BaseException as e:
            print(e)
            self.log("Error: 无法发送邮件")

拓展

在封装的基础上增加一个压缩的方法

import shutil
 def Filezip(self):
        try:
   # 在路径下寻找指定的包
            if os.path.exists('包路径/包名'):
                os.remove('删除包')
        except Exception as e:
            print(e, "没有zip压缩包可以删除")
        finally:
   # 以.zip为后缀,root_dir开始打包的路径
            shutil.make_archive('打包到指定的路径', "zip", root_dir=re.Base_reports)
    def func(self):
        # 压缩文件
        self.Filezip()
        # 发送邮件
        self.sendmail()

错误

exception yagmail.error.YagAddressError
原因:无法识别的电子邮件,一般的,指电子邮件格式错误
解决方案:检查电子邮件的格式
exception yagmail.error.YagConnectionClosed
原因:链接被销毁
解决方案:在链接建立时发送邮件(一般是因为发信前调用了close方法)
exception yagmail.error.YagInvalidEmailAddress
原因:邮件地址中存在语法错误
解决方案:检查地址是否正确

总结

可复制直接使用,最好自己实践一次。

目录
相关文章
|
5月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
687 7
|
5月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
438 0
|
5月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
528 4
|
5月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
532 0
|
5月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
635 0
|
6月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
214 4
|
6月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
537 0
|
7月前
|
存储 安全 数据处理
Python 内置模块 collections 详解
`collections` 是 Python 内置模块,提供多种高效数据类型,如 `namedtuple`、`deque`、`Counter` 等,帮助开发者优化数据处理流程,提升代码可读性与性能,适用于复杂数据结构管理与高效操作场景。
467 0
|
8月前
|
数据安全/隐私保护 Python
抖音私信脚本app,协议私信群发工具,抖音python私信模块
这个实现包含三个主要模块:抖音私信核心功能类、辅助工具类和主程序入口。核心功能包括登录
|
8月前
|
数据采集 存储 监控
Python爬虫自动化:定时监控快手热门话题
Python爬虫自动化:定时监控快手热门话题

推荐镜像

更多