Tkinter模拟发送邮箱验证码并在指定时间后验证码过期

先上两张图,再解释

在这里插入图片描述
在这里插入图片描述

运行原理:

程序运行后,输入要接收验证码的邮箱地址,点击“发送”后,控制台打印输出得到的验证码并发送到邮箱里;过了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()

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值