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

总结

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

目录
相关文章
|
4天前
|
JSON 数据格式 Python
Python标准库中包含了json模块,可以帮助你轻松处理JSON数据
【4月更文挑战第30天】Python的json模块简化了JSON数据与Python对象之间的转换。使用`json.dumps()`可将字典转为JSON字符串,如`{&quot;name&quot;: &quot;John&quot;, &quot;age&quot;: 30, &quot;city&quot;: &quot;New York&quot;}`,而`json.loads()`则能将JSON字符串转回字典。通过`json.load()`从文件读取JSON数据,`json.dump()`则用于将数据写入文件。
10 1
|
4天前
|
Linux API Python
【python】如何通过python来发邮件,各种发邮件方式详细解析
【python】如何通过python来发邮件,各种发邮件方式详细解析
|
5天前
|
Python 容器
python内置函数、数学模块、随机模块(二)
python内置函数、数学模块、随机模块(二)
|
5天前
|
索引 Python
python内置函数、数学模块、随机模块(一)
python内置函数、数学模块、随机模块(一)
|
7天前
|
人工智能 安全 Java
Python 多线程编程实战:threading 模块的最佳实践
Python 多线程编程实战:threading 模块的最佳实践
124 5
|
7天前
|
人工智能 数据库 开发者
Python中的atexit模块:优雅地处理程序退出
Python中的atexit模块:优雅地处理程序退出
8 3
|
10天前
|
存储 开发者 Python
Python中的argparse模块:命令行参数解析的利器
Python中的argparse模块:命令行参数解析的利器
16 2
|
10天前
|
开发者 Python
Python的os模块详解
Python的os模块详解
17 0
|
14天前
|
数据挖掘 API 数据安全/隐私保护
python请求模块requests如何添加代理ip
python请求模块requests如何添加代理ip
|
15天前
|
测试技术 Python
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘