# -*- 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. linux100day(day5)--编程原理和shell脚本

    通过前面的学习,我们对于linux文件系统有了一定的了解,我们接下来会初步接触编程原理和尝试编写shell脚本来实现功能. day05--编程原理和shell脚本初步认识 编程原理 在早期编程中,因为 ...

  2. categorical_crossentropy VS. sparse_categorical_crossentropy

    From:https://jovianlin.io/cat-crossentropy-vs-sparse-cat-crossentropy/ categorical_crossentropy 和 sp ...

  3. 洛谷 P2863 [USACO06JAN]牛的舞会The Cow Prom(Tarjan)

    一道tarjan的模板水题 在这里还是着重解释一下tarjan的代码 #include<iostream> #include<cstdio> #include<algor ...

  4. ltp-ddt eth_iperf_tcp iperf dualtest遇到的问题

    ltp-ddt eth_iperf_tcp server端:iperf -s -i 5 -w 1M client端将ddt的核心代码抠出来: iperf -c 1921.68.40.41 -m -M ...

  5. iView的Message提示框

    全局配置message main.js Vue.prototype.$Message.config({ top: 70, duration:3 }); Vue.prototype.$Message.c ...

  6. 利用HTTP、DNS通道测试无回显的命令执行

    windows下通过start命令 for /F %X in ('whoami') do start http://uusifci7x1s0hcrny1lkqwqyjppfd4.burpcollabo ...

  7. Echarts--Y坐标标题显示不全

    如:下图,Y坐标标题显示不全 y2可以控制不显示区域的高度,就能显示全啦 grid:{ x:40, x2:100, y2:200 }

  8. leetcode-15双周赛-1288-删除被覆盖区间

    题目描述: 方法一:排序O(Nlogn) class Solution: def removeCoveredIntervals(self, intervals: List[List[int]]) -& ...

  9. JS中数据结构之字典

    字典是一种以键 - 值对形式存储数据的数据结构 通过数组实现字典 function Dictionary() { this.add = add; this.datastore = new Array( ...

  10. LUOGU P3759 [TJOI2017]不勤劳的图书管理员(树套树)

    传送门 解题思路 和以前做过的一道题有点像,就是区间逆序对之类的问题,用的是\(BIT\)套权值线段树,交换时讨论一下计算答案..跑的不如暴力快.. 代码 #include<iostream&g ...