一,开发需求和思路
1.开发需求:
你是不是有这么一种需求:在使用邮箱(qq邮箱或163邮箱)时,许多时候都需要我们重新登录(或者隔一段时间),那么如果忘记密码,重新设置将是一件很痛苦的事,加之,我们对邮箱使用很频繁,能不能有种产品能使我们不用登入账户,同时桌面应用程序那样而不用去登入网页版邮箱网站,从而满足我们的发送邮件的基本功能实现呢?答案是有的! 在开源IT时代,我们有很多方法和工具来实现我们的需求,作为极客,我们可以发现SMTP协议背后的一种特殊的发送邮件过程:基于邮箱服务商服务器(IMAP,SMTP,POS3等)来绑定对应程序,从而达到免登录,二次程序开发实现邮件发送功能(简单的理解下就可以了,可以自行百度)。
2.开发思路:
python是具有强大第三方库的一门超级语言,我们可以可控的选择简单且易上手的第三方库,经过笔者比对发现python的yagmail库是个不错的选择,另外,我们的需求开发出的是产品级(简陋的,嘻嘻),那么就不能再运行时再打开代码,那样会很麻烦,我们要设计出有UI交互界面的程序,由于python自带tkinter库,我们可以用来GUI开发比较方便简单。
3.前期准备
概括下前面的,我们需要准备并熟悉好如下东西: (1)设置好所用邮箱服务商的服务器设置,备好对应的服务密码(不是账户登入密码); (2)python的yagmail库,了解下使用方法; (3)确保自带的tkinter包存在(一般没问题),了解下使用方法; 由于笔者前面做过这方面的介绍,在此不一一赘述了,下面给出链接: python-基于yagmail库开发自动邮件发送程序
4.功能叙述
二,编写代码
1.处理程序模块
注意:代码中涉及隐私的,均已屏蔽,对应内容要根据自己实际引入
from tkinter import *
from PIL import Image,ImageTk
import tkinter.filedialog
import yagmail
import time
import datetime
import calendar
root = Tk()
global to, title, content,user, password, port, host
user = ''
password = ''
port = '465'
host = 'smtp.163.com'
mail = yagmail.SMTP(user, password, host, port)
photo1=Image.open('background1.png')
background_image1 = ImageTk.PhotoImage(photo1.resize((500, 400)))
to_text = Text(root,width=26,height=1.55,font=('黑体',13))
title_text = Text(root,width=26,height=1.55,font=('黑体',13))
content_text = Text(root,width=75,height=12,font=('黑体',13))
tipout_label = Label(root,text='暂无操作!',font=('黑体',13),bg='green',fg='white')
time_label=Label(root,text='',font=('黑体',16),fg='green')
menubar=Menu(root)
menuout=Menu(root,tearoff=0)
root['menu']=menubar
def gettime():
timestr = time.strftime("%Y年%m月%d日 %H时:%M分:%S秒,%A")
time_label.configure(text=timestr)
root.after(1000,gettime)
gettime()
def show_datetime():
winnew=Toplevel(root)
winnew.title('日历窗口')
winnew.geometry('500x400+700+50')
winnew.iconbitmap('mail.ico')
tipout_label['text'] = '你点开了日历窗口!'
date_time=datetime.datetime.today()
year=date_time.year
month=date_time.month
calendar.setfirstweekday(firstweekday=6)
dates=calendar.month(year,month)
alldate=Label(winnew,text='',bg='green',fg='white',width=1000,height=600,font=('黑体',20),image=background_image1,compound = CENTER)
alldate.configure(text=dates)
alldate.pack()
global lists,textbooks
textbooks=Label(root,text='无')
lists=['']
def textbook():
text_win=Toplevel(root)
text_win.title('草稿窗口')
text_win.geometry('740x520+500+50')
text_win.iconbitmap('mail.ico')
tipout_label['text'] = '你点开了草稿窗口!'
draft_paper=Text(text_win,width=100,height=30)
draft_paper.insert('1.0', lists[0])
def saves():
textbooks .configure(text=draft_paper.get(1.0, 'end'))
lists[0]=textbooks['text']
tipout_label['text'] = "你保存了草稿箱里的内容!"
def clears():
draft_paper.delete('1.0', 'end')
tipout_label['text'] = "你清空了草稿箱里的内容!"
save_button = Button(text_win, text='保存', command=saves,relief=RAISED,fg='white',bg='green',font=('黑体',14),width=10,height=2).place(x=19,y=430)
clear_button=Button(text_win, text='清空所有内容', command=clears,relief=RAISED,fg='white',bg='green',font=('黑体',14),width=16,height=2).place(x=150,y=430)
draft_paper.place(x=19,y=18)
menubar.add_command(label = " 草稿 ", command=textbook)
menubar.add_command(label = " 日历 ", command=show_datetime)
def pops(event):
menuout.post(event.x_root, event.y_root)
def Clear_to():
to_text.delete('1.0', 'end')
tipout_label['text']='你清空了收件人窗口!'
def Clear_title():
title_text.delete('1.0', 'end')
tipout_label['text'] ='你清空了主题窗口!'
def Clear_content():
content_text.delete('1.0', 'end')
tipout_label['text'] ='你清空了内容窗口!'
def message():
tipout_label['text'] = "输入有误或已全清空!请重新输入所有内容!"
to_text.delete('1.0', 'end')
title_text.delete('1.0', 'end')
content_text.delete('1.0', 'end')
filename=''
def Attachments():
global filename
filename = tkinter.filedialog.askopenfilename()
if filename != '':
tipout_label['text']='您选择的文件是' + filename
else:
tipout_label['text']='您没有选择任何文件'
def Sendto():
to = to_text.get('1.0', 'end')
title = title_text.get('1.0', 'end')
content = content_text.get('1.0', 'end')
if filename =='':
try:
mail.send(to, title, content)
tipout_label['text'] = "发送成功!"
except:
message()
elif filename !='':
try:
mail.send(to, title, content,filename)
tipout_label['text'] = "发送成功!"
except:
message()
root.bind("<Button-3>",pops)
menuout.add_command(label='清空收件人窗口',command=Clear_to)
menuout.add_command(label='清空主题窗口',command=Clear_title)
menuout.add_command(label='清空内容窗口',command=Clear_content)
menuout.add_command(label='清空所有输入窗口',command=message)
to_label=Label(root,text='收件人:',font=('黑体',13)).place(x=10,y=20)
title_label=Label(root,text='主题:',font=('黑体',13)).place(x=10,y=80)
contents_label=Label(root,text='内容:',font=('黑体',13)).place(x=10,y=140)
to_text.place(x=90,y=20)
title_text.place(x=90,y=80)
content_text.place(x=90,y=140)
attachments_button=Button(root,text='附件地址',font=('黑体',13),fg='white',bg='green',command=Attachments,width=10,height=2,relief=RAISED)
attachments_button.place(x=30,y=370)
check_button=Button(root,text='确认发送',font=('黑体',13),fg='white',bg='green',command=Sendto,width=10,height=2,relief=RAISED).place(x=30,y=450)
tip_label=Label(root,text='程序状态:',font=('黑体',13)).place(x=10,y=530)
tipout_label.place(x=120,y=530)
time_label.place(x=340,y=85)
root.title('基于SMTP协议自动发送的邮箱程序')
root.geometry('800x600+300+100')
root.iconbitmap('mail.ico')
root.mainloop()
2.运行效果展示:
三,程序打包
本次开发时,所使用的到的第三方库均已本地安装,pycharm虚拟环境也已继承),所以pycharm和本地PythonIDLE均可以运行执行代码。
1.程序打包步骤演示:
(1)先下载安装好pyinstaller安装如下: pyinstaller安装 (2)Windows下打开命令行: (3)进入自己所在的py文件目录下: (4)进入目录后,输入 :pyinstaller -F -w -i <包含文件类型名的文件全名>
(5)在py文件同目录下回生成以下目录和其他文件:
(6)进入dist文件,我们发现打包完成的exe程序,由于我们的程序exe还不包含里面所用到的图片,会出现以下错误:
(7)我们有解决方法,一是你要先前去掉代码对应的图片插入,二是像下面一样,把对应的图片文件复制或转移到同exe文件目录下,再重新打开,程序运行成功:
2.开发问题中遇到的问题及解决方法汇总:
报错:ModuleNotFoundError: No module named 'PIL’解决方法 python 获取当前年份和月份 Python中tkinter.filedialog Python-Tkinter图形化界面设计(详细教程 ) 用tkinter.pack设计复杂界面布局 python-基于yagmail库开发自动邮件发送程序 最后,由于开发经验尚浅和程序其中的一些瑕疵,希望大家理解! 对于文本内容有何问题,欢迎批评指正!!!
|