1.python实现发送邮件
首先介绍一下邮件发送的SMTP协议:
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python中的smtp实现:
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
Python创建 SMTP 对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: runoob.com,这个是可选参数。
port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。
local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。
在码代码之前,要先开启邮箱的授权功能。我使用的QQ,因此以QQ邮箱为例。
- 第一步,登陆QQ邮箱,进入邮箱设置界面。
- 第二步,开启SMTP功能。
- 第三步:获取授权码。
- 如果是首次开启,您在点击后侧对应的“开启”字样时,会弹出授权码框(如下图)
- 如果之前开启过,忘记了授权码,则点击下方“生成授权码”链接,使用您的手机号按照提示便可获取。
使用SMTP服务登录邮箱。
mailhost='smtp.qq.com'
account = '714576810@qq.com'
#获取邮箱账号
password = 'nblaolbvpurlbdhe'
qqmail= smtplib.SMTP()
qqmail.connect(mailhost, 25)
qqmail.login(account, password)
# 登录邮箱,第一个参数为邮箱账号,第二个参数为邮箱密码
接下来是写邮件格式和正文内容。
receiver = '***********************' #接收邮箱
sender = '**********0@qq.com' #发送邮箱
content = "测试" #邮件内容
#content=input('请输入邮件正文:')
#输入你的邮件正文
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = '*************0@qq.com'
message['To'] = 'y*******************'
subject = "测试"
message['Subject'] = Header(subject, 'utf-8')
qqmail.sendmail(sender, receiver, message.as_string())
# 发送邮件,调用了sendmail()方法,写入三个参数,分别是发件人,收件人,和字符串格式的正文。
2.自动发送
我这里使用的是schedule来实现。
他的语法类型
schedule.every(10).minutes.do(job) #部署每10分钟执行一次job()函数的任务
10 schedule.every().hour.do(job) #部署每×小时执行一次job()函数的任务
11 schedule.every().day.at("10:30").do(job) #部署在每天的10:30执行job()函数的任务
12 schedule.every().monday.do(job) #部署每个星期一执行job()函数的任务
13 schedule.every().wednesday.at("13:15").do(job)#部署每周三的13:15执行函数的任务
使用哪种时间间隔定时,视自己的需求。
设置没间隔30分钟发送代码:
schedule.every(30).minutes.do(post_mstp)
while True:
schedule.run_pending()
time.sleep(1)
既然设置的是定时的,为了便于查看文件发送的成功质量,可以将发送信息形成日志。
fo = open("logs.txt", "a")
fo.write(mytime + " " + receiver + " 发送成功\n")
fo.close()
完整代码
import smtplib
#smtplib是python的一个内置库,所以不需要用pip安装
from email.mime.text import MIMEText
from email.header import Header
import datetime
import schedule
import time
#引入Header和MIMEText模块
def post_mstp():
mailhost='smtp.qq.com'
account = '***********0@qq.com'
#获取邮箱账号
password = '***********e'
receiver = '***********n'
sender = '**********m'
#获取收件人的邮箱
content = "测试"
#content=input('请输入邮件正文:')
#输入你的邮件正文
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = '*********m'
message['To'] = 'y**************'
#实例化一个MIMEText邮件对象,该对象需要写进三个参数,分别是邮件正文,文本格式和编码.
subject = "测试"
message['Subject'] = Header(subject, 'utf-8')
#在等号的右边,是实例化了一个Header邮件头对象,该对象需要写入两个参数,分别是邮件主题和编码,然后赋值给等号左边的变量message['Subject']。
#获取当前时间
now_time=datetime.datetime.now()
#日期格式转换
mytime=now_time.strftime('%y-%m-%d %H:%M')
try:
qqmail= smtplib.SMTP()
qqmail.connect(mailhost, 25)
qqmail.set_debuglevel(1)
qqmail.login(account, password)
# 登录邮箱,第一个参数为邮箱账号,第二个参数为邮箱密码
qqmail.sendmail(sender, receiver, message.as_string())
# 发送邮件,调用了sendmail()方法,写入三个参数,分别是发件人,收件人,和字符串格式的正文。
fo = open("logs.txt", "a")
fo.write(mytime + " " + receiver + " 发送成功\n")
fo.close()
#print('邮件发送成功')
except:
fo = open("logs.txt", "a")
fo.write(mytime + " " + receiver + " 发送失败\n")
fo.close()
qqmail.quit()
if __name__ == '__main__':
schedule.every(30).minutes.do(post_mstp)
while True:
schedule.run_pending()
time.sleep(1)