前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python发送邮件(单发/群发)——yagmail模块

python发送邮件(单发/群发)——yagmail模块

原创
作者头像
Elsa_111
修改2021-07-26 16:27:07
2.6K0
修改2021-07-26 16:27:07
举报
文章被收录于专栏:Elsa的学习笔记

一、有关邮件的基本概念

  • POP3: Post Office Protocol3 的简称,即邮局协议的第3个版本,它规定了怎样将个人计算机连接到 Internet 的邮件服务器和下载电子邮件的电子协议
  • SMTP: Simple Mail Transfer Protocol , 即简单邮件传输协议
  • IMAP: Internet Mail Access Protocol , 即交互式邮件存取协议

二、运用yagmail模块发送邮件

1、以163邮箱为例开启POP3/SMTP/IMAP服务,(QQ邮箱也是类似的操作)

显示已开启,则为正确操作
显示已开启,则为正确操作
记住自己的授权码,之后在代码中,登陆邮箱用的是授权码,而不是账号密码
记住自己的授权码,之后在代码中,登陆邮箱用的是授权码,而不是账号密码
同一个页面,往下滑,找到服务器地址,记下来
同一个页面,往下滑,找到服务器地址,记下来

2、安装依赖模块

  • yagmail:基于 SMTP 的发邮件模块
  • keyring:访问系统密钥环服务,方便、安全地储存密码

在命令行输入以下指令,可以同时安装这两个模块

代码语言:javascript
复制
pip install yagmail keyring --user

3、运用yagmail在命令行将密码/授权码存储起来

因为直接将密码/授权码,写在代码的位置,是很危险的,容易泄露

注意语句的格式,账户名和密码都是要用引号引起来的
注意语句的格式,账户名和密码都是要用引号引起来的

4、使用方法

  • 导入包yagmail 之后, 通过mail = yagmail.smtp()实例化一个对象出来,需要传入的参数:user=“发件人”,password=“授权码”, host=“smtp服务器”
  • 通过mail.send()模块发送邮件内容,需要传入的参数:to=“收件人”,subject=“邮件的主题”,contents=“邮件的正文”, attachments=“发送邮件的附件”

yagmail.SMTP(user=用户名, host=SMTP服务器域名) # 服务器域名就是上面第二大点,记住的那个SMTP服务器地址

yagmail.SMTP(user=用户名, password=授权码, host=SMTP服务器域名)

mail.send(收件人用户名,邮件标题,邮件内容)

代码语言:javascript
复制
# 示例:登陆邮箱,并发送一封邮件;自己的163邮箱,给自己的qq邮箱发,不打扰别人
import yagmail
mail = yagmail.SMTP(user='xxxxx@163.com', host='smtp.163.com')   #xxxxx的部分,换成自己的163邮箱账户名
contents = ['第一段内容', '第二段内容']
mail.send('xxxxx@qq.com', '这是一封邮件', contents)   # xxxxx的部分,换成自己的QQ账户名
这是QQ邮箱收到的邮件效果
这是QQ邮箱收到的邮件效果

5、群发邮件

代码语言:javascript
复制
# 只需要在刚刚的基础上,将收件人的用户名,改成列表传输就可以了
import yagmail
mail = yagmail.SMTP(user='xxxxx@163.com', host='smtp.163.com')
contents = ['第一段内容',
            '第二段内容']
received = ['xxxxx@qq.com', 'yyyyy@qq.com']
mail.send(received, '群发邮件测试', contents)
两个邮箱收到的邮件效果
两个邮箱收到的邮件效果

6、发送带附件的邮件

代码语言:javascript
复制
import yagmail
mail = yagmail.SMTP(user='xxxxx@163.com', host='smtp.163.com')
contents = ['第一段内容', '第二段内容', r'D:\Pictures\保存\笔_1.png']  # 文件地址,一定要精确到文件名,不能是文件夹
mail.send('xxxxx@qq.com', '带附件的邮件测试', contents)
收到的邮件效果
收到的邮件效果

7、发送带链接的邮件

附带链接的语句格式:<a href=链接网址>链接显示的文字</a>

代码语言:javascript
复制
import yagmail
mail = yagmail.SMTP(user='elsa_1022@163.com', host='smtp.163.com')
contents = ['第一段内容', '第二段内容', '<a href="https://www.baidu.com">某度</a>']
mail.send('1106027492@qq.com', '带链接的邮件测试', contents)
点击蓝色字,即可跳转链接
点击蓝色字,即可跳转链接

8、发送正文插入图片的邮件

插入图片的语句格式: yagmail.inline(r'图片路径')

代码语言:javascript
复制
import yagmail
mail = yagmail.SMTP(user='xxxxx.com', host='smtp.163.com')
contents = ['第一段内容', '第二段内容', yagmail.inline(r'D:\Pictures\壁纸\壁纸.jfif')]
mail.send('xxxxx@qq.com', '正文中插入图片的邮件测试', contents)
收到的邮件效果
收到的邮件效果

三、使用schedule定时器,实现定时发送邮件

代码语言:python
代码运行次数:0
复制
import yagmail


def send_mail(sender='xxxxx@qq.com', password=None, receivers=None,
              subject='自动化发送邮件', contents=None, attaches=None, host='smtp.qq.com'):
    """
    自动化发送邮件
    :param sender:发件人
    :param password: 验证码
    :param receivers: 收件人
    :param subject: 主题
    :param contents: 内容
    :param attaches: 附件
    :param host: 服务器
    :return: none
    """
    try:
        mail = yagmail.SMTP(user=sender, password=password, host=host)
        mail.send(to=receivers, subject=subject, contents=contents, attachments=attaches)
    except Exception as e:
        print('邮件发送失败', e)
    else:
        print('邮件发送成功')


if __name__ == '__main__':
    import schedule

    password = '授权码'
    receivers = 'xxxxx@qq.com'
    contents = ["<h1 style='color:red'>你的磁盘使用量已经高达90%</h1>"]
    attaches = ['picture.jpg']

    schedule.every(2).seconds.do(send_mail, password=password,
                                 receivers='xxxxx@qq.com',
                                 contents=contents,
                                 attaches=attaches)
    while True:
        schedule.run_pending()

补充说明:

schedule:轻量级的定时任务调度的库。可以完成每分钟,每小时,每天,周几,特定日期的定时任务

代码语言:javascript
复制
import schedule
import time
 
def job():
    print("I'm working...")
 
schedule.every(10).minutes.do(job)                # 每隔十分钟,执行一次
schedule.every().hour.do(job)                     # 每隔一小时,执行一次
schedule.every().day.at("10:30").do(job)          # 每天的10:30,执行一次
schedule.every(5).to(10).days.do(job)             # 每隔5到10天,执行一次
schedule.every().monday.do(job)                   # 每周一,当前这个时候,执行一次
schedule.every().wednesday.at("13:15").do(job)    # 每周三13:15,执行一次
 
while True: # 死循环,一直查询上述任务是否可以执行
    schedule.run_pending()   # run_pending 运行可以运行的任务
    time.sleep(1)
代码语言:javascript
复制
# 如果函数带有参数的话,直接加上参数就好了,如下所示
import schedule
import time
 
def job(name):
    print("her name is : ", name)
 
name = xiaona
schedule.every(10).minutes.do(job, name)
schedule.every().hour.do(job, name)
schedule.every().day.at("10:30").do(job, name)
schedule.every(5).to(10).days.do(job, name)
schedule.every().monday.do(job, name)
schedule.every().wednesday.at("13:15").do(job, name)
 
while True:
    schedule.run_pending()
    time.sleep(1)

schedule的局限性:

1、需要定时运行的函数job不应当是死循环类型的,也就是说,这个线程应该有一个执行完毕的出口。一是因为线程万一僵死,会是非常棘手的问题;二是下一次定时任务还会开启一个新的线程,执行次数多了就会演变成灾难

2、如果schedule的时间间隔设置得比job执行的时间短,一样会线程堆积形成灾难,也就是说,我job的执行时间是1个小时,但是我定时任务设置的是5分钟一次,那就会一直堆积线程

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、有关邮件的基本概念
  • 二、运用yagmail模块发送邮件
    • 1、以163邮箱为例开启POP3/SMTP/IMAP服务,(QQ邮箱也是类似的操作)
      • 2、安装依赖模块
        • 3、运用yagmail在命令行将密码/授权码存储起来
          • 4、使用方法
            • 5、群发邮件
              • 6、发送带附件的邮件
                • 7、发送带链接的邮件
                • 三、使用schedule定时器,实现定时发送邮件
                  • 补充说明:
                  相关产品与服务
                  验证码
                  腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档