Python—使用tkinter制作一款邮件发送小工具

Python的smtplib模块可以从来发送邮件,非常方便,支持附件,支持HTML格式。为此,我用tkinter做了一款可以发送邮件的UI工具,分享给大家。支持群发,支持多个附件

#-*- coding:utf-8 -*-
import tkinter as tk                            #使用Tkinter前需要先导入
from tkinter import messagebox,ttk,filedialog
import smtplib,os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header

class MY_GUI(tk.Tk):
  #初始化
  def __init__(self):
    super().__init__()
    self.set_window()
    self.set_frame()
    self.set_body()
  #设置窗口
  def set_window(self):
    self.title("发送邮件工具v1.0")           #窗口名
    w_width=800                             #工具宽度
    w_height=600                            #工具高度 
    scn_width=self.maxsize()[0]             #屏幕宽度
    x_point=(scn_width-w_width)//2          #取点让工具居中
    self.geometry('%dx%d+%d+%d' %(w_width,w_height,x_point,100))
  #设置框架
  def set_frame(self):
    self.frame1=tk.Frame(self,pady=10,padx=10)
    self.frame1.grid(row=0,column=0,sticky='w')
    self.frame2=tk.Frame(self,pady=10,padx=10)
    self.frame2.grid(row=1,column=0,sticky='w')
  #设置组件
  def set_body(self):
    self.server=tk.StringVar()
    self.server.set('smtp.126.com')
    self.sender=tk.StringVar()
    self.sender.set('chaodaibing@126.com')
    self.receiver=tk.StringVar()
    self.receiver.set('chaodaibing@126.com 88140040@qq.com')
    self.username=tk.StringVar()
    self.username.set('chaodaibing')
    self.password=tk.StringVar()
    self.password.set('dio19871021')
    self.title=tk.StringVar()
    self.files=tk.StringVar()
    ttk.Label(self.frame1,text='SMTP服务器:').grid(row=0,column=0,sticky='w',pady=5)
    ttk.Entry(self.frame1,textvariable=self.server).grid(row=0,column=1,sticky='w')
    ttk.Label(self.frame1,text='发送者:').grid(row=1,column=0,sticky='w',pady=5)
    ttk.Entry(self.frame1,textvariable=self.sender).grid(row=1,column=1,sticky='w')
    ttk.Label(self.frame1,text='接收者:').grid(row=2,column=0,sticky='w',pady=5)
    ttk.Entry(self.frame1,textvariable=self.receiver,width=50).grid(row=2,column=1,sticky='w')
    ttk.Label(self.frame1,text='用户名:').grid(row=3,column=0,sticky='w',pady=5)
    ttk.Entry(self.frame1,textvariable=self.username).grid(row=3,column=1,sticky='w')
    ttk.Label(self.frame1,text='密码:').grid(row=4,column=0,sticky='w',pady=5)
    ttk.Entry(self.frame1,textvariable=self.password).grid(row=4,column=1,sticky='w')
    ttk.Label(self.frame1,text='邮件标题:').grid(row=5,column=0,sticky='w',pady=5)
    ttk.Entry(self.frame1,textvariable=self.title).grid(row=5,column=1,sticky='w')
    ttk.Label(self.frame1,text='邮件内容:').grid(row=6,column=0,sticky='w',pady=5)
    ybar=ttk.Scrollbar(self.frame1,orient='vertical')
    textarea=tk.Text(self.frame1,width=50,height=12,yscrollcommand=ybar.set)
    ybar['command']=textarea.yview
    textarea.grid(row=6,column=1,columnspan=1,sticky='w')
    ybar.grid(row=6,column=2,sticky='ns')
    ttk.Button(self.frame1,text="附件:",command=self.getfiles).grid(row=7,column=0,sticky='w',pady=5)
    ttk.Entry(self.frame1,textvariable=self.files,width=50).grid(row=7,column=1,sticky='w')
    ttk.Button(self.frame2,text='点击发送',command=lambda:self.sending(textarea.get(1.0,'end'))).grid(row=0,column=0,sticky='w')
    ttk.Button(self.frame2,text='清空',command=lambda:self.clear(textarea)).grid(row=0,column=1,sticky='w')
  #功能函数
  def clear(self,textarea):             #清空文本框
    textarea.delete(1.0,'end')

  def getfiles(self):                   #上传附件
    self.file_paths=filedialog.askopenfilenames(title='选择文件(可多选)')
    self.files.set(self.file_paths)

  def sending(self,content):                          #发送邮件
    textpart=MIMEText(content,'html','utf-8')         #文字内容
    msg=MIMEMultipart() 
    msg.attach(textpart)
    msg['Subject']=Header(self.title.get(),'utf-8')
    sender=self.sender.get()
    receivers=self.receiver.get().split()             #多个收件人
    msg['From']=sender
    msg['To']=receivers[0]
    if(self.file_paths):                              #多个附件
      for filename in self.file_paths:
        print(filename)
        sendfile=open(filename,'rb').read()
        filepart = MIMEApplication(sendfile)
        filepart.add_header('Content-Disposition', 'attachment', filename=os.path.basename(filename))  #发送的文件名
        msg.attach(filepart)

    smtp=smtplib.SMTP()
    try:
      smtp.connect(self.server.get())
    except Exception as e:
      messagebox.showerror('错误','连接邮件服务器失败')
      return False
    try:
      smtp.login(self.username.get(),self.password.get())
    except Exception as e:
      messagebox.showerror('错误','身份验证失败')
      return False
    smtp.sendmail(sender,receivers,msg.as_string())  #发送邮件
    smtp.quit()
    messagebox.showinfo('提示','邮件发送完成')

app=MY_GUI()
app.mainloop()

效果如下:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值