我们在有些时候安装某些软件的时候,软件可能会要求我们输入激活码,有些时候需要你自己去获得的,还有一些是发送的(如果是全球性的程序会发电子邮件,如果就是一个国内的程序,会发短信)。其实,生活中的验证码无处不在。比如,某网站登录,有时需要输入验证码。今天,我们就来使用Python来编写程序,事项上面说的内容。
会用到的python代码库如下:
项目 | 说明 |
---|---|
tkinter | 用来编写程序的窗口部分 |
stmplib,email | 发送邮件 |
twilio | 发送短信 |
我们首先创建一个文件,来制作窗口界面部分。
# coding:utf-8
from tkinter import *
from tkinter.ttk import * #为了让按钮更加美观,所以使用tkinter.ttk
root = Tk()
root.title('请输入您的激活码,如果没有激活码,请输入您的邮箱账号来获取')# 首先创建窗口界面
Label(root, text = '请输入您的激活码:').pack() # 创建一个提示标语
code = Entry(root) # 创建一个输入框
code.pack()
Button(root, text = '确定', width = 12).pack() # 创建一个按钮
Button(root,text = '我没有激活码', width = 12).pack() #创建一个没有激活码的按钮
root.mainloop() # 启动tkinter时间主循环,否则无法启动。
下面是运行结果:
在代码中我们可以看到,这个程序目前只是有骨架,也就是窗口界面部分。因为在代码中,我们没有编写事按钮被绑定之后的事件。现在,我们就来解决这个问题。
code.pack()
# 下面是改的内容(创建按钮部分)
ttk.Button(root, text = '确定', width = 12).pack() # 创建一个按钮
ttk.Button(root,text = '我没有激活码', width = 12, command = send_code).pack() #创建一个没有激活码的按钮
# coding:utf-8
from tkinter import *
from tkinter.ttk import * #为了让按钮更加美观,所以使用tkinter.ttk
from tkinter.simpledialog import * # 输入邮箱账号需要用到
现在我们已经把主要窗口用户界面部分写完了。
下面,我们就要编写重头戏部分的程序了。也就是要发送邮件!
这是,我们又有需要更改的代码了。因为我们又导入了几个发送邮件的模块,所以现在开头部分的代码如下图。
# coding:utf-8
from tkinter import *
from tkinter.ttk import * #为了让按钮更加美观,所以使用tkinter.ttk
from tkinter.simpledialog import * # 输入邮箱账号需要用到
import smtplib
#发送字符串的邮件
from email.mime.text import MIMEText
#处理多种形态的邮件主体我们需要 MIMEMultipart 类
from email.mime.multipart import MIMEMultipart
#处理图片需要 MIMEImage 类
from email.mime.image import MIMEImage
不过这还不是最终的版本,因为在后面的文章里。我还会讲到如何使用短信来实现这个程序!(使用短信的方法代码量会少)
当我们编写好发送邮件的代码时,send_code函数如下面。
def send_code():
e_mail = askstring('输入邮箱账号', '请输入邮箱账号:') # 显示对话框
if if e_mail == '': # 如果没有输入账号的话,就不执行程序(此段程序将停止)
return
fromaddr = '你的邮箱地址'#邮件发送方邮箱地址
password = ''#密码(部分邮箱为授权码)
receivers = e_mail
#邮件内容设置
message = MIMEText('您的激活码是:43045 00405 73456 34056','plain','utf-8')
#邮件主题
message['Subject'] = '激活码'
#发送方信息
message['From'] = fromaddr
#接受方信息
message['To'] = receivers
try:
server = smtplib.SMTP('smtp.qq.com') # QQ邮箱的服务器
server.login(fromaddr,password)
server.sendmail(fromaddr, receivers, message.as_string())
print('success')
server.quit()
except smtplib.SMTPException as e:
print('error',e) #打印错误
本程序以QQ邮箱为例,如果你使用的是其他邮箱,具体设置方法请自行百度。
当我们运行程序时,整个程序的运行效果如下图。
我们可以看到程序如期运行。
现在我们继续重头戏,也是程序最最最最最最核心的部分。检测验证码是否输入正确!然后搭配着一个随机生成验证码的程序。这两部分相对单纯一些。
下面是随机发送验证码的部分。
code_name = '您的激活码是:{}'.format(random.randint(10000, 99999))
message = MIMEText(code_name,'plain','utf-8')
我们可以看到,程序如期运行。
因为后面又有输入激活码的部分,所以程序的主要部分如下面。
root = Tk()
root.title('请输入您的激活码,如果没有激活码,请输入您的邮箱账号来获取')# 首先创建窗口界面
ttk.Button(root,text = '获取激活码', width = 12, command = send_code).pack() #创建一个没有激活码的按钮
root.mainloop() # 启动tkinter时间主循环,否则无法启动。
还要注意,因为后面要有提示,所以还要导入tkinter.messagebox模块。
下面是输入激活码的部分。
def send_code():
e_mail = askstring('输入邮箱账号', '请输入邮箱账号:')# 显示对话框
if e_mail == '':# 如果没有输入账号的话,就不执行程序(此段程序将停止)
return
fromaddr = '[email protected]'# 邮件发送方邮箱地址
password = 'ikujwrgiwifychcg'# 密码(部分邮箱为授权码)
receivers = e_mail
# 邮件内容设置
code = random.randint(10000, 99999)
code_name = '您的激活码是:{}'.format(code)
message = MIMEText(code_name,'plain','utf-8')
# 邮件主题
message['Subject'] = '激活码'
# 发送方信息
message['From'] = fromaddr
# 接受方信息
message['To'] = receivers
try:
server = smtplib.SMTP('smtp.qq.com') # QQ邮箱的服务器
server.login(fromaddr,password)
server.sendmail(fromaddr, receivers, message.as_string())
print('success')
server.quit()
except smtplib.SMTPException as e:
print('error',e) #打印错误
else:
True_code = askstring('输入激活码', '请输入激活码:')
if not True_code:
return
if True_code != code:
showinfo('提示', '恭喜,激活成功!')
else:
showinfo('提示', '激活码有误')
完成程序后,整个文件如下。
# coding:utf-8
from tkinter import *
from tkinter.ttk import * #为了让按钮更加美观,所以使用tkinter.ttk
from tkinter.simpledialog import * # 输入邮箱账号需要用到
from tkinter.messagebox import *
import smtplib
#发送字符串的邮件
from email.mime.text import MIMEText
#处理多种形态的邮件主体我们需要 MIMEMultipart 类
from email.mime.multipart import MIMEMultipart
#处理图片需要 MIMEImage 类
from email.mime.image import MIMEImage
import random # 随机生成激活码
def send_code():
e_mail = askstring('输入邮箱账号', '请输入邮箱账号:')# 显示对话框
if e_mail == '':# 如果没有输入账号的话,就不执行程序(此段程序将停止)
return
fromaddr = '[email protected]'# 邮件发送方邮箱地址
password = 'ikujwrgiwifychcg'# 密码(部分邮箱为授权码)
receivers = e_mail
# 邮件内容设置
code = random.randint(10000, 99999)
code_name = '您的激活码是:{}'.format(code)
message = MIMEText(code_name,'plain','utf-8')
# 邮件主题
message['Subject'] = '激活码'
# 发送方信息
message['From'] = fromaddr
# 接受方信息
message['To'] = receivers
try:
server = smtplib.SMTP('smtp.qq.com') # QQ邮箱的服务器
server.login(fromaddr,password)
server.sendmail(fromaddr, receivers, message.as_string())
print('success')
server.quit()
except smtplib.SMTPException as e:
print('error',e) #打印错误
else:
True_code = askstring('输入激活码', '请输入激活码:')
if not True_code:
return
if True_code != code:
showinfo('提示', '恭喜,激活成功!')
else:
showinfo('提示', '激活码有误')
root = Tk()
root.title('请输入您的激活码,如果没有激活码,请输入您的邮箱账号来获取')# 首先创建窗口界面
ttk.Button(root,text = '获取激活码', width = 12, command = send_code).pack() #创建一个没有激活码的按钮
root.mainloop() # 启动tkinter时间主循环,否则无法启动。