# -*- 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模块小项目联系之邮箱客户端的更多相关文章

  1. python3 tkinter模块

    一.tkinter 1.tkinter--tool kit interface工具包接口,用于GUI(Graphical User Interface)用户图形界面, 2.python3.x把Tkin ...

  2. python tkinter模块小工具界面

    代码 #-*-coding:utf-8-*- import os from tkinter import * root=Tk() root.title('小工具') #清空文本框内容 def clea ...

  3. python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)

    ''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_ ...

  4. Python2.X和Python3.X中Tkinter模块的文件对话框、下拉列表的不同

    Python2.X和Python3.X文件对话框.下拉列表的不同 今天初次使用Python Tkinter来做了个简单的记事本程序.发现Python2.x和Python3.x的Tkinter模块的好多 ...

  5. spring+springmvc+hibernate架构、maven分模块开发样例小项目案例

    maven分模块开发样例小项目案例 spring+springmvc+hibernate架构 以用户管理做測试,分dao,sevices,web层,分模块开发測试!因时间关系.仅仅測查询成功.其它的准 ...

  6. python3中 tkinter模块创建window窗体、添加按钮、事务处理、创建菜单等的使用

    开始接触桌面图形界面编程,你可以到安装路径  \lib\tkinter 打开__init__.py 文件了解tkinter 1    tkinter 模块创建窗体,代码如下截图: 运行结果,如有右图显 ...

  7. python3+tkinter实现的黑白棋,代码完整 100%能运行

    今天分享给大家的是采用Python3+tkinter制作而成的小项目--黑白棋 tkinter是Python内置的图形化模块,简单易用,一般的小型UI程序可以快速用它实现,具体的tkinter相关知识 ...

  8. 【实战小项目】python开发自动化运维工具--批量操作主机

    有很多开源自动化运维工具都很好用如ansible/salt stack等,完全不用重复造轮子.只不过,很多运维同学学习Python之后,苦于没小项目训练.本篇就演示用Python写一个批量操作主机的工 ...

  9. tkinter模块

    Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的 ...

随机推荐

  1. elasticsearch 基础 —— 索引、更新文档

    索引文档 通过使用 index API ,文档可以被 索引 -- 存储和使文档可被搜索 . 但是首先,我们要确定文档的位置.正如我们刚刚讨论的,一个文档的 _index . _type 和 _id 唯 ...

  2. windows10安装docker[含百度网盘docker安装包]

    在win10上安装 docker(比较简单) 安装步骤: 现在 Docker 有专门的 Win10 专业版系统的安装包,需要开启Hyper-V. 1.开启 Hyper-V 程序和功能 启用或关闭Win ...

  3. 微信小程序(2)--下拉刷新和上拉加载更多

    下拉刷新 1.首先在.json文件中配置(如果在app.json文件中配置,那么整个程序都可以下拉刷新.如果写在具体页面的.json文件中,那么就是对应的页面下拉刷新.) 具体页面的.json文件: ...

  4. Shell07--正则应用

    目录 1. 正则表达式概述 2. 正则表达式规则 3. 正则表达式之GREP文本过滤 4. 正则表达式之SED文本处理 5. 正则表达式之AWK文本处理 1. 正则表达式概述 01. 什么是正则表达式 ...

  5. Shell04--循环语句

    目录 Shell04---循环语句 1. 循环语句for基本概述 2. 循环语句for场景示例 3. 循环语句while基本概述 4. 循环语句while场景示例 5. 内置跳出循环语句指令 Shel ...

  6. java 两个对象共使一个方法

  7. 同步与异步,阻塞与非阻塞 bio,nio,aio

    BIO.NIO和AIO的区别(简明版) 同步异步,阻塞非阻塞: https://www.zhihu.com/question/19732473   转载请注明原文地址:http://www.cnblo ...

  8. HashMap、HashTable、ConcurrentHashMap区别

    HashMap与HashTable区别 HashMap与ConcurrentHashMap区别 1.HashMap与HashTable的区别 HashMap线程不安全,HashTable线程安全 Ha ...

  9. BZOJ5261 Rhyme

    传送门 广义后缀自动机= =+ 跟ptx大爷的博客学的 戳我传送 我写的第一种 建立Trie树的写法 bfs建立SAM 为什么是bfs呢 我也不知道(GG) 经过我一番抱大腿+询问 各位大爷说的原因是 ...

  10. pandas.DataFrame.sample

    DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)[sourc ...