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
原因:邮件地址中存在语法错误
解决方案:检查地址是否正确

总结

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

目录
相关文章
|
27天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
42 4
|
6天前
|
Python
Python Internet 模块
Python Internet 模块。
102 74
|
24天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
104 63
|
26天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
26天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
1月前
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
27天前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
38 5
|
26天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
1月前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
46 5
|
1月前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
下一篇
DataWorks