python3 tkinter模块小项目联系之邮箱客户端
# -*- coding:utf-8 -*-
from tkinter import *
from tkinter.messagebox import askyesno, showerror, showinfo
import smtplib
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr def login(): emailRegex = r"[-_\w\.]{0,64}@([-\w]{1,63}\.)*[-\w]{1,63}"
try:
smtp_server = 'smtp.' + \
re.search(emailRegex, username.get()).group().rsplit('@', 1)[1]
global server
server = smtplib.SMTP(smtp_server, 25, timeout=5)
except Exception as e:
showerror(title="用户名错误", message="请检查用户名是否正确!") # server.set_debuglevel(1)
try:
server.login(username.get(), password.get())
global from_addr
from_addr = username.get()
showinfo(title="登录成功", message="恭喜登录成功!")
global auth
auth = True
Label(root, text=from_addr).grid(row=0, column=2, sticky='w')
tk.destroy()
except Exception as e:
showerror(title="登录失败", message="登录失败,请检查用户名或密码是否正确!")
print(e, '登录失败')
return False def logout():
try:
global quit
server.quit()
quit = 1
except Exception as e:
pass # 邮件发送成功之后的处理 def after_send():
content.delete(0.0, END)
sub.delete(0, END) # 发送邮件 def send():
try:
if quit or not auth:
showinfo(title="未登录", message="请先登录!")
return 0
elif auth:
FROM = 'From:' + from_addr
TO = 'To:' + to_addr.get()
SUBJECT = subject.get()
CONTENT = content.get(0.0, END) def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr)) msg = MIMEText(CONTENT, 'plain', 'utf-8') msg['From'] = _format_addr(FROM)
msg['To'] = _format_addr(TO)
msg['Subject'] = Header(SUBJECT, 'utf-8').encode()
# server.set_debuglevel(1)
try:
server.sendmail(FROM, TO, msg.as_string())
showinfo(title="发送成功!", message="邮件发送成功!")
after_send()
return 0
except Exception as e:
showerror(title="发送失败", message=e)
return e
except Exception as e:
showerror(title="错误", message=e) def login_window(): global tk
tk = Toplevel()
tk.title("邮箱登录")
tk.resizable(width=False, height=False)
# 设置logo
tk.iconbitmap('logo.ico')
width = 400
height = 200
screenwidth = tk.winfo_screenwidth()
screenheight = tk.winfo_screenheight()
alignstr = '%dx%d+%d+%d' % (width, height,
(screenwidth - width) / 2,
(screenheight - height) / 2)
tk.geometry(alignstr) # 定义登录窗口
Label(tk, text="邮 箱 登 录", font=("Arial", 13), fg='green').grid(
columnspan=4, pady=20, ipadx=150)
Label(tk, text="账 号").grid(column=1, sticky='e', pady=5)
Label(tk, text="密 码").grid(column=1, sticky='e', pady=5)
Entry(tk, textvariable=username).grid(row=1, column=2, pady=5)
Entry(tk, textvariable=password, show='*').grid(row=2, column=2, pady=5) Button(tk, text="退出", command=tk.quit, fg='red').grid(
pady=5, row=3, column=2, sticky='w', padx=30)
Button(tk, text="登录", command=login, fg='green').grid(
pady=5, row=3, column=2, sticky='e', padx=30) # 设置收件人和主题 def send_window(): Button(root, text="发 送", command=send).grid(rowspan=3, padx=10) Label(root, text="发件人").grid(row=0, column=1)
Label(root, text=from_addr).grid(row=0, column=2, sticky='w') Label(root, text="收件人").grid(row=1, column=1)
Entry(root, textvariable=to_addr, width=90).grid(row=1, column=2, pady=5) Label(root, text="主 题").grid(row=2, column=1)
global sub
sub = Entry(root, textvariable=subject, width=90)
sub.grid(row=2, column=2, pady=5) # 邮件内容
global content
content = Text(root, height=35, width=110)
content.grid(pady=30, padx=10, columnspan=4) menu() def menu(): top_menu = Menu(root)
root.config(menu=top_menu) account = Menu(top_menu, tearoff=0)
top_menu.add_cascade(label="账号", menu=account, )
account.add_command(label="登录", command=login_window)
account.add_command(label="退出", command=logout) choice = Menu(top_menu, tearoff=0)
top_menu.add_cascade(label="选项", menu=choice)
choice.add_command(label="插入附件") if __name__ == "__main__": # 创建登录窗口
root = Tk()
root.title("邮件发送")
root.resizable(width=False, height=False)
width = 800
height = 600
screenwidth = root.winfo_screenwidth()
screenheight = root.winfo_screenheight()
alignstr = '%dx%d+%d+%d' % (width, height,
(screenwidth - width) / 2,
(screenheight - height) / 2)
root.geometry(alignstr)
# 设置logo
root.iconbitmap('logo.ico')
auth = False
server = ""
quit = 0
from_addr = "未登录"
username = StringVar()
password = StringVar()
to_addr = StringVar()
subject = StringVar() if not auth:
if askyesno(title="未登录", message="是否登录?"):
login_window()
send_window()
root.mainloop()
实现效果

python3 tkinter模块小项目联系之邮箱客户端的更多相关文章
- python3 tkinter模块
一.tkinter 1.tkinter--tool kit interface工具包接口,用于GUI(Graphical User Interface)用户图形界面, 2.python3.x把Tkin ...
- python tkinter模块小工具界面
代码 #-*-coding:utf-8-*- import os from tkinter import * root=Tk() root.title('小工具') #清空文本框内容 def clea ...
- python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)
''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_ ...
- Python2.X和Python3.X中Tkinter模块的文件对话框、下拉列表的不同
Python2.X和Python3.X文件对话框.下拉列表的不同 今天初次使用Python Tkinter来做了个简单的记事本程序.发现Python2.x和Python3.x的Tkinter模块的好多 ...
- spring+springmvc+hibernate架构、maven分模块开发样例小项目案例
maven分模块开发样例小项目案例 spring+springmvc+hibernate架构 以用户管理做測试,分dao,sevices,web层,分模块开发測试!因时间关系.仅仅測查询成功.其它的准 ...
- python3中 tkinter模块创建window窗体、添加按钮、事务处理、创建菜单等的使用
开始接触桌面图形界面编程,你可以到安装路径 \lib\tkinter 打开__init__.py 文件了解tkinter 1 tkinter 模块创建窗体,代码如下截图: 运行结果,如有右图显 ...
- python3+tkinter实现的黑白棋,代码完整 100%能运行
今天分享给大家的是采用Python3+tkinter制作而成的小项目--黑白棋 tkinter是Python内置的图形化模块,简单易用,一般的小型UI程序可以快速用它实现,具体的tkinter相关知识 ...
- 【实战小项目】python开发自动化运维工具--批量操作主机
有很多开源自动化运维工具都很好用如ansible/salt stack等,完全不用重复造轮子.只不过,很多运维同学学习Python之后,苦于没小项目训练.本篇就演示用Python写一个批量操作主机的工 ...
- tkinter模块
Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的 ...
随机推荐
- 基于GPU的图像处理平台
基于GPU的图像处理平台 1. (309)英伟达推Jetson TX1 GPU模块力推人工智能 1.1 产品概述 Jetson TX1 GPU模块,主要针对近年来蓬勃发展的人工智能市场,包括无人机. ...
- 三、SQL Server 对JSON的支持
一.SQL Server 对JSON的支持 一.实现效果 现在 我用数据库是sql2008 ,共计2万数据. 每一条数据里面的有一个为attribute字段是 json存储状态属性, 我怎么查看 ...
- pip安装依赖包
pip install -r requirements.txt setup.py 模块使用 https://blog.csdn.net/neil_pan/article/details/7900129 ...
- Sass-除法
Sass的乘法运算规则也适用于除法运算.不过除了除法运算还有一个特殊之处.众所周知“/”符号在css中已作为一种符号使用,因此在sass中做除法运算时,直接使用"/" 符号作为除号 ...
- Java JDK1.8新特性之四大函数式接口
JDK 1.8的一些新特性 四大核心函数式接口(Consumer.Predicate.Supplier.Function),结合lambda表达式 import java.util.ArrayList ...
- Docker安装RMQ
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11752934.html 进入rabbitmq的docker hub镜像仓库地址:https://hub ...
- vue 项目的运行与 打包
1.vue init webpack 2.npm install axios 3.npm run dev 运行项目 4.npm run build 打包项目 会生成一个dist 文件夹,我们只需要把 ...
- Redis事件通知示例
1. redis如同zk一样,提供了事件监听(或者说是回调机制), 下面是redis的配置说明: ############################# EVENT NOTIFICATION ## ...
- spring-boot整合Mybatis案例(注解方式)
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...
- logstash配置文件详解
logstash pipeline 包含两个必须的元素:input和output,和一个可选元素:filter. 从input读取事件源,(经过filter解析和处理之后),从output输出到目标 ...