先上两张图,再解释
运行原理:
程序运行后,输入要接收验证码的邮箱地址,点击“发送”后,控制台打印输出得到的验证码并发送到邮箱里;过了15秒以后,验证码再次刷新,并打印输出,这样就实现了动态过期,原理就是到某个时间点我再刷新一遍生成验证码函数,此时输入你邮箱里的验证码点“确认”肯定和最新的是不匹配的。当然这个过程在实际操作的时候是看不到验证码的输出的,这里为了直观理解所以在后台全部进行打印输出。
需要注意的是:
这里每次点击按钮都需要使用一个方法,难点在于全局变量global的使用,发送验证码不难,我之前也写过一篇文章点击查看,难点在于如何动态更新验证码,同时更新后的验证码必须作用于全局使用,希望这篇文章能抛砖引玉,有所启发。
附上测试过的完整代码:
# coding=utf-8
from tkinter import *
from threading import Timer
import smtplib
import string
import random
from email.mime.text import MIMEText
root = Tk()
root.title("邮箱验证码30秒后过期重新验证")
root.geometry("500x200+600+300")
frame1 = Frame(root)
frame1.pack()
address = Entry(frame1)
address.grid(row=0, column=1)
num = string.digits
a = ""
num_digits = ""
def send():
global num_digits
def update_num():
global a
global num_digits
num_digits = ""
for i in range(6):
num1 = random.choice(num)
num_digits = num_digits + num1
# print(num_digits)
a = num_digits
print(a)
update_num() # 先执行验证码
a = num_digits # 把刷新的验证码赋给全局变量a
msg_from = '此处填写我的邮箱' # 填写服务器发送方的邮箱地址
passwd = '此处填写我的授权码' # 授权码不要告诉给他人
to_mail = address.get()
to = [to_mail]
# 设置邮件内容
content = "验证码: " + "<font color='orange' size='5px'><b>" + a + "</b></font>"
global t # 把t设置成全局变量,后面成功验证后就取消定时更新功能
t = Timer(15, update_num) # 这里为了测试,设置成15秒更新
t.start()
# 把内容加进去
msg = MIMEText(content, 'html', 'utf-8')
# 设置邮件主题
msg['Subject'] = "邮箱验证"
# 发送方信息
msg['From'] = msg_from
# 开始发送
# 通过SSL方式发送,服务器地址和端口
try:
s = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 登录邮箱
s.login(msg_from, passwd)
# 开始发送
s.sendmail(msg_from, to, msg.as_string())
s.quit()
# messagebox.showinfo("发送提醒", "邮件发送成功")
print("邮件发送成功")
except Exception as e:
print(e)
# messagebox.showwarning("发送提醒", "邮件发送失败!请输入正确邮箱地址")
def check():
if code.get() == a:
print('验证码输入正确,跳转窗口...')
root.destroy()
newroot = Tk()
newroot.geometry("300x200+600+300")
newroot.focus_force()
Label(newroot, text="欢迎您,登录成功!").pack()
t.cancel()
newroot.mainloop()
else:
print("验证码已过期,请重新发送")
Label(frame1, text="邮箱地址:").grid(row=0, column=0, pady=50)
Button(frame1, text="发 送", width=8, command=send).grid(row=0, column=2, padx=5)
Label(frame1, text="验证码:").grid(row=1, column=0)
code = Entry(frame1, width=10)
code.grid(row=1, column=1, sticky=W)
Button(frame1, text="确 认", width=8, command=check).grid(row=1, column=2, padx=5)
root.mainloop()