# -*- 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. 安卓构架组件——概述 Android Architecture Components

    谷歌官文文档地址:https://developer.android.google.cn/topic/libraries/architecture 安卓构架组建是库的集合:帮助你设计健壮的.易测试的. ...

  2. shell判断用户是否已经在系统中登录

  3. pwd - 显示出当前/活动目录的名称

    总览 (SYNOPSIS) pwd [OPTION] 描述 (DESCRIPTION) 显示出 完整的 当前 活动目录 名称. --help 显示 帮助 信息, 然后 退出 --version 显示 ...

  4. rabbit 独占队列

    std::string queue_name = "hello"; AmqpClient::Channel::ptr_t channel = AmqpClient::Channel ...

  5. Sass-unitless()函数

    unitless() 函数相对来说简单明了些,只是用来判断一个值是否带有单位,如果不带单位返回的值为 true,带单位返回的值为 false: >> unitless(100) true ...

  6. elasticsearch 进行聚合+去重查询

    转载:https://www.jianshu.com/p/c03c3c8bf583 以客户customer为例 我想查询每日的客户数. 先按照日期分桶,然后在桶内按照 姓名来去重 来计算客户数(实际会 ...

  7. IBM研究人员开发了一对低功耗,高性能的计算机视觉系统

    机器学习算法近年来有了突飞猛进的发展.例如,像Facebook这样的最先进的系统,可以在一小时内训练图像分类算法,而不会牺牲准确性.但是,许多这些系统都是在具有强大GPU的高端机器上进行培训的,随着物 ...

  8. python基础面试题总结

    1.python中深拷贝和浅拷贝的理解 自己理解:浅拷贝,只是拷贝引用,不开辟新的空间存储拷贝内容. 深拷贝,就是在内存中,开辟一个新的内存地址,将拷贝内容放到新的地址中去. 验证:对于数字,字符串, ...

  9. Xcode7.1环境下上架iOS App到AppStore 流程①

    前言部分 之前App要上架遇到些问题到网上搜上架教程发现都是一些老的版本的教程 ,目前iTunesConnect 都已经迭代好几个版本了和之前的 界面风格还是有很大的差别的,后面自己折腾了好久才终于把 ...

  10. 【HDU5306】【DTOJ2481】Gorgeous Sequence【线段树】

    题目大意:给你一个序列a,你有三个操作,0: x y t将a[x,y]和t取min:1:x y求a[x,y]的最大值:2:x y求a[x,y]的sum 题解:首先很明显就是线段树裸题,那么考虑如何维护 ...