简单邮件传输协议
交互式邮件存取协议
在命令行输入以下指令,可以同时安装这两个模块
pip install yagmail keyring --user
因为直接将密码/授权码,写在代码的位置,是很危险的,容易泄露
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(收件人用户名,邮件标题,邮件内容)
# 示例:登陆邮箱,并发送一封邮件;自己的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账户名
# 只需要在刚刚的基础上,将收件人的用户名,改成列表传输就可以了
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)
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)
附带链接的语句格式:<a href=链接网址>链接显示的文字</a>
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'图片路径')
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)
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:轻量级的定时任务调度的库。可以完成每分钟,每小时,每天,周几,特定日期的定时任务
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)
# 如果函数带有参数的话,直接加上参数就好了,如下所示
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 删除。