#file:   GUI_MAIL.py
#Date:   2016/01/07
#Author: lao_wan

import tkinter
import smtplib
from email.mime.text import MIMEText
from configparser import ConfigParser
import os
import tkinter.filedialog
import re

class Window:
    def __init__(self, root):
        #Label标签
        Host = tkinter.Label(root, text = '服务器')
        Port = tkinter.Label(root, text = '端口')
        User = tkinter.Label(root, text = '用户名')
        Passwd = tkinter.Label(root, text = '密码')
        Subject = tkinter.Label(root, text = '主题')
        To = tkinter.Label(root, text = '收件人')
        MailFile = tkinter.Button(root, text = '浏览', command = self.MailFile)#调用MailFile函数(得到收件人群组)
        #定义Label的位置
        Host.place(x = 5, y = 5)
        Port.place(x = 200, y = 5)
        User.place(x = 5, y = 30)
        Passwd.place(x = 200, y = 30)
        Subject.place(x = 5, y = 55)
        To.place(x = 5, y = 83)
        #定义浏览按钮的位置
        MailFile.place(x = 345, y = 80)
    
        #Entry文本框
        self.entryHost = tkinter.Entry(root)
        self.entryPort = tkinter.Entry(root)
        self.entryUser = tkinter.Entry(root)
        self.entryPasswd = tkinter.Entry(root, show = '*')
        self.entryTo = tkinter.Entry(root, width = 40)
        self.entrySub = tkinter.Entry(root, width = 40)
        #读取配置文件
        config = ConfigParser()
        config.read('smtp.conf')
        Host = config.get('setting','Host')
        Port = config.get('setting','Port')
        User = config.get('setting','User')
        Passwd = config.get('setting','Passwd')
        #将配置文件里的值放入文本框
        self.entryHost.insert(tkinter.END,Host)
        self.entryPort.insert(tkinter.END,Port)
        self.entryUser.insert(tkinter.END,User)
        self.entryPasswd.insert(tkinter.END,Passwd)
        #文本框的位置
        self.entryHost.place(x = 50, y = 5)
        self.entryPort.place(x = 235, y = 5)
        self.entryUser.place(x = 50, y = 30)
        self.entryPasswd.place(x = 235, y = 30)
        self.entryTo.place(x = 50, y = 83)
        self.entrySub.place(x = 50, y = 55)
    
        #发送按钮,调用MailSend函数
        self.mailsend = tkinter.Button(root,text='开始发送',command=self.MailSend)
        #调用SaveConfig函数保存配置
        self.save = tkinter.Button(root,text='保存配置',command=self.SaveConfig)
        #调用Help函数打开帮助
        self.help = tkinter.Button(root,text='使用帮助',command=self.Help)
        #三个按钮的位置
        self.mailsend.place(x=430,y=20)
        self.save.place(x=430,y=60)
        self.help.place(x=520,y=60)

#多行文本框,用来输入邮件内容
        self.text = tkinter.Text(root)
        self.text.place(y=120)

def MailFile(self):
        #该函数用来读取放有邮件地址的文本文件
        r = tkinter.filedialog.askopenfilename(title='打开文件',filetypes=[('txt','*.txt')])
        if r :
            self.entryTo.delete(0,tkinter.END)
            self.entryTo.insert(tkinter.END,r)
    def MailSend(self):
        #使用get()获取各文本框中的内容
        host = self.entryHost.get()
        port = self.entryPort.get()
        user = self.entryUser.get()
        pw = self.entryPasswd.get()
        fromaddr = user
        subject = self.entrySub.get()
        text = self.text.get(1.0,tkinter.END)
        #读取文件
        mailfile = open(self.entryTo.get(),'r')
        mailaddr = mailfile.read()
        #使用正则表达式分割字符串,这里用逗号分割
        mail = re.split(',',mailaddr)
        #设置邮件内容为utf-8编码
        msg = MIMEText(text,_charset='utf-8')
        msg['From'] = fromaddr
        msg['Subject'] = subject
        smtp = smtplib.SMTP()
        smtp.connect(host,port)
        smtp.login(user,pw)
        #使用循环读取分割出来的邮件地址,同时实现邮件群发
        for toaddr in mail:
            msg['To'] = toaddr
            smtp.sendmail(fromaddr,toaddr,msg.as_string())
            smtp.close()
    #保存设置
    def SaveConfig(self):
        #获取文本框内容
        Host = self.entryHost.get()
        Port = self.entryPort.get()
        User = self.entryUser.get()
        Passwd = self.entryPasswd.get()
        #对需要保存的配置写入文件stmp.conf进行保存
        config = ConfigParser()
        config.add_section('setting')
        config.set('setting','Host',Host)
        config.set('setting','Port',Port)
        config.set('setting','User',User)
        config.set('setting','Passwd',Passwd)
        config.write(open('smtp.conf','w'))
    #使用帮助
    def Help(self):
        help_str = """
        1.服务器是SMTP服务器,QQ邮箱为smtp.qq.com, 126邮箱为smtp.126.com
        2.用户名必须带后缀,例如:12345@qq.com,   12345@126.com
        3.收件人使用txt文件,邮件地址有“,”分隔开
        """
        self.text.insert(tkinter.END,help_str)

#检查配置文件是否存在,不存在则创建
if(not os.path.isfile('smtp.conf')):
    config = ConfigParser()
    config.add_section('setting')
    config.set('setting','Host','smtp.qq.com')
    config.set('setting','Port','25')
    config.set('setting','User','user')
    config.set('setting','Passwd','passwd')
    config.write(open('smtp.conf','w'))

root = tkinter.Tk()
root.title("GUI_MAIL") #APP标题
root.geometry("650x500")
window = Window(root)
root.mainloop()

源地址:http://www.cnblogs.com/lao-wan/p/5111808.html

win7/64+python3.4+pyinstall3+tkinter+smtp=图形界面群发邮件客户端的更多相关文章

  1. Python图形界面Tk

    最近在学习Python,在使用Tkinter做图形界面时遇到了几个小问题,网上查了一下,在Python2.x导入的是Tkinter,Python3则是tkinter.而且导入的simpledialog ...

  2. java 图形界面 Socket编程

    一.使用图形界面实现客户端服务器端的通信: 上代码: 服务器端代码: package cn.MyNET; import java.io.*; import java.net.*; import jav ...

  3. Ubuntu远程登陆、SSH图形界面、WOL远程唤醒

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 实现目标:通过路由器配置路由路径,将拨号获取的公网IP地址指向局域网Ubuntu服务器.家里有 ...

  4. win7+64位笔记本 python3.6安装opencv3

    1.直接在cmd窗口下用pip,输入 pip install opencv-python 安装成功是如下界面: 不放心还可以验证下,方法是cmd窗口下输入python,然后输入 import cv2 ...

  5. 怎么安装Scrapy框架以及安装时出现的一系列错误(win7 64位 python3 pycharm)

    因为要学习爬虫,就打算安装Scrapy框架,以下是我安装该模块的步骤,适合于刚入门的小白: 一.打开pycharm,依次点击File---->setting---->Project---- ...

  6. 2018-09-28 用Python3和tkinter开发简单图形界面程序

    源码库: program-in-chinese/wubi_code_editor 起因在这里. 由于此项目和汉字相关, 个人也想尝试Python的图形界面开发, 于是开始尝试. 遇到的一个坑. 用户测 ...

  7. Win7 64位下sql server链接oracle的方法

    继上一次mysql同步sql server后,这一次需要将Oracle同步到sql server上来,方案相似,只是在sql server链接oracle的时候费了很多时间. 一.测试环境 本方案实现 ...

  8. Win7 64位安装MySQL

    1.Win7 64位 安装MySQL5.5版本 安装文件的执行:会提示“已经停止工作”: 2.我下载了mysql-installer-community-5.7.11.0.msi,可以安装成功,中途需 ...

  9. win7的python3.5安装numpy包

    1.你需要先确保已经安装了pip(因为我是我们需要用pip安装numpy包),我在cmd里面输入pip能显示pip的有关信息,所以我已经安装了pip了(其实是python3.x自带了pip) 如果没有 ...

随机推荐

  1. localStorage(本地存储)使用总结

    1.https://www.cnblogs.com/st-leslie/p/5617130.html (localStorage使用总结)

  2. 007——php字符串中的处理函数(六)

    <?php /** * 一.addslashes() 在预定义字符串前添加反斜杠 * * stripslashes() 把转义字符串前的反斜杠删除 * get_magic_quotes_gpc ...

  3. Constructor vs Object

    1. Constructor:是用于创建和初始化类中创建的一个对象的一种特殊方法. constructor([arguments]) { ... } 在一个类中只能有一个名为 “constructor ...

  4. 解决MySQL workbench的Can't connect to MySQL server on '127.0.0.1'(10061)问题

    如题,今天打开MySQL时,出现了这种问题,无法连接到数据库 问题原因:The error (2003) Can't connect to MySQL server on 'server' (1006 ...

  5. 如何在JavaScript中手动创建类数组对象

    前言 关于什么是js的类数组对象这里不再赘述.可以参考这个链接,还有这里. js中类数组对象很多,概念简单的讲就是看上去像数组,又不是数组,可以使用数字下标方式访问又没有数组方法. 例: argume ...

  6. [置顶] Android 打包apk无敌报错

    前言: 这个问题从昨天上午一直到现在,请教了很多大佬,都没有给出确定的解决方案,可能他们也没碰到过可能,不过还是挺感谢他们的建议,一直到今天中午午休,我一直都在想这个问题,就是下面的这个,看了国内很多 ...

  7. fullfile

    这个我总是忽略,见过也不少了,顺便写写,其实一些命令很方便的. 一个例子: root_dir = '../mcg/pre-trained'; addpath(root_dir); addpath(fu ...

  8. HDU4819 Mosaic【树套树】

    LINK 题目大意 给你一个\(n*n\)矩阵,每个点有初始权值 q次询问每次把一个矩形的中心节点变成这个矩形中最大值和最小值的平均数 思路 很显然的树套树啊 就是一开始傻逼了没想到怎么去维护这个东西 ...

  9. (译)KVO的内部实现

    09年的一篇文章,比较深入地阐述了KVO的内部实现.   KVO是实现Cocoa Bindings的基础,它提供了一种方法,当某个属性改变时,相应的objects会被通知到.在其他语言中,这种观察者模 ...

  10. [UOJ198][CTSC2016]时空旅行

    uoj description 你要维护若干个集合,每个集合都是有一个编号比他小的集合扩展而来,扩展内容为加入一个新的元素\((x,c)\)或者删除一个已有元素.集合的扩展关系之间构成一个树形结构. ...