# -*- 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. 基于GPU的图像处理平台

    基于GPU的图像处理平台 1.  (309)英伟达推Jetson TX1 GPU模块力推人工智能 1.1 产品概述 Jetson TX1 GPU模块,主要针对近年来蓬勃发展的人工智能市场,包括无人机. ...

  2. 三、SQL Server 对JSON的支持

    一.SQL Server 对JSON的支持 一.实现效果   现在 我用数据库是sql2008 ,共计2万数据. 每一条数据里面的有一个为attribute字段是 json存储状态属性,  我怎么查看 ...

  3. pip安装依赖包

    pip install -r requirements.txt setup.py 模块使用 https://blog.csdn.net/neil_pan/article/details/7900129 ...

  4. Sass-除法

    Sass的乘法运算规则也适用于除法运算.不过除了除法运算还有一个特殊之处.众所周知“/”符号在css中已作为一种符号使用,因此在sass中做除法运算时,直接使用"/" 符号作为除号 ...

  5. Java JDK1.8新特性之四大函数式接口

    JDK 1.8的一些新特性 四大核心函数式接口(Consumer.Predicate.Supplier.Function),结合lambda表达式 import java.util.ArrayList ...

  6. Docker安装RMQ

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11752934.html 进入rabbitmq的docker hub镜像仓库地址:https://hub ...

  7. vue 项目的运行与 打包

    1.vue init webpack 2.npm install axios 3.npm run dev  运行项目 4.npm run build 打包项目 会生成一个dist 文件夹,我们只需要把 ...

  8. Redis事件通知示例

    1. redis如同zk一样,提供了事件监听(或者说是回调机制), 下面是redis的配置说明: ############################# EVENT NOTIFICATION ## ...

  9. spring-boot整合Mybatis案例(注解方式)

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...

  10. logstash配置文件详解

     logstash pipeline 包含两个必须的元素:input和output,和一个可选元素:filter. 从input读取事件源,(经过filter解析和处理之后),从output输出到目标 ...