频道栏目
首页 > 程序开发 > 综合编程 > 其他综合 > 正文
邮件之将懒惰进行到底
2010-08-25 10:36:00      个评论      
收藏   我要投稿

转载请注明版权

图/文 jokerfox
===================================
在上一篇文章《快速编程之懒人发邮件》中,我写到了如何编写Python程序使得发送带附件的邮件变得更加简单快捷;但事实上当我用了几天之后才发现,竟然还是好麻烦啊!下面我们就分析一下之前的那个程序有哪些不太合理的地方呢?
        如图1所示,当我们打开程序时,提示要输入本地文件的路径,那么这就有三个问题了,首先我必须手动输入长长的文件名,一旦我要发送的附件在几层目录下,就意味着我得输入很长的字符串;其次,我只能发送单个的文件而没法发送整个文件夹之类的,当然,我们可以先将文件夹压缩成RAR格式后再发送,这的确可以,不过你不嫌麻烦吗?另外,对于文件的大小也有限制,比如现在邮箱服务商一般都可以发送20M大小以下的附件,可是大于20M文件就不行了,这也是问题!
 
图1
        为了将懒惰的哲学发挥得淋淋尽致,我决定在原来那个程序的基础上再写个更方便的程序,之前的jfEmail.py包里面实现了一个jfEmail类,那么我们就可以很方便的在另外的程序中调用这个类而不用修改jfEmail.py文件。
        没有什么东西比需求更重要了,因此我们首先要明确新的需求:不仅可以发送单个文件,还可以发送文件夹;为了减少普通文件的大小,用第三方的RAR程序进行压缩,不仅能压缩单个文件还能压缩文件夹;对于文件的大小不应有限制,当文件大于20M时应该可以进行分卷压缩后分别发送邮件;当程序运行一次后,可以作为进程不断监控指定的目录,定时扫描这个目录,一旦有文件或者文件夹出现就开始执行压缩发送过程;添加到鼠标右键的“发送到”链接上去。
        实现以上功能的程序文件名为daemonEmail.py,有点进程守护的味道。为了能进行压缩,使用了WinRAR下的命令行工具RAR.exe,可以对文件或文件夹进行分卷压缩等。其下实现了4个函数。
1)        def removedir(dirpath)
这个函数用来删除整个目录,它可以在发送完一个目录之后将原始目录删除掉;里面使用的是递归的删除文件和目录算法。参数dirpath是要删除的目录的绝对路径。
2)def splitfile(filepath)
该函数实现RAR文件分卷压缩的功能。根据邮箱附件的限制进行分割压缩,本质就是调用了RAR程序执行而已。参数filepath是要分卷压缩的文件的绝对路径。
3)def SendMail(_filepath,_name)
该函数执行发送带附件的邮件的功能。参数_filepath是要发送的文件附件;_name是要显示的邮件主题,这里是取文件名而已,这样就能在邮件中区分不同的附件了。
4)def CheckIt()
该函数是最重要的函数了,它是定时执行的函数,每次执行的时候将检查指定目录是否有文件或者文件夹。遇到文件的情况下,读取文件的大小,若大于附件上限则进行文件分卷压缩,否则就直接发送出去;遇到是文件夹的情况下,直接压缩成RAR格式,然后读取该RAR文件的大小,若大于附件上限,则再进行分卷压缩。原始的文件和文件夹在发送附件之后都将被删除。
        程序其实很简单,全部加起来才80多行而已,发送带附件的邮件部分直接调用了jfEmail.py包中的jfEmail类,程序本身就只是处理一些业务逻辑以及RAR压缩。话不多说,下面我们重点看看下面比较重要的几行代码。

###以下几个数据参数 根据自己的需要设置好
SMTP_HOST=smtp.163.com        #邮件服务器的地址
FROM_EMAIL=jokerfox@163.com #发送方的Email地址
TO_EMAIL=hijack9@qq.com  #接收方的Email地址
USER=jokerfox  #  发送邮件时需要认证的用户名
PASSWORD=123456#  以及密码
#SUBJECT=你好  #邮件的标题
CONTENT=大家好才是真的好
DEBUGLEVEL=0  #设置调试级别
#####目录信息设置#############
folderpath=F:\EmailTemp\  #指定要监视的目录
vsize=15 #分卷大小,这里设置为15M,可以根据自己的需要设置,单位是M

以上几行都是参数设置,其中的SMTP信息根据自己的情况设置好,下面的目录信息很重要,folderpath为要监控的目录绝对路径,而vsize是设置了进行RAR分卷压缩的卷大小,这里设置了15M。

###检查目录并发送邮件,监控函数
def CheckIt():
##枚举监控目录下的文件以及文件夹
mylist=os.listdir(folderpath)
for i in mylist:
filepath=folderpath+I #获取绝对路径
if not path.isdir(filepath): #如果是普通文件
st=os.stat(filepath) #获取文件信息
print st.st_size
if (st.st_size>vsize*1024*1024): #文件大小比较
splitfile(filepath) #分卷压缩文件
else:
SendMail(filepath,i) #若小于附件上限直接发送
print "Mail "+filepath+" OK!!"
os.unlink(filepath)
elif path.isdir(filepath): #如果是目录
##执行文件夹压缩
os.system(rar.exe a "+filepath+.rar" "+filepath+")
st=os.stat(filepath+".rar") #获取压缩后的RAR文件大小
if (st.st_size>vsize*1024*1024):
splitfile(filepath+".rar")
else:
SendMail(filepath+".rar",i)
print "Mail "+filepath+" OK~~~"
removedir(filepath) #删除目录
os.unlink(filepath+.rar) #删除RAR文件

CheckIt函数进行监控指定目录,只要发现该目录下面有文件或者文件夹就开始执行发送或者压缩的动作,上面的注释很详细,相信大家很容易了解监控的整个过程。
最后就是主代码了,它只是一个简单的循环,每隔10秒调用CheckIt()函数,使用time包中的sleep函数来暂停程序以达到定时执行的功能。

#####主代码执行#####
print "Ready to go!!!!"
while True:
CheckIt()
time.sleep(10) #程序暂停10秒后继续执行

代码很短,注释也很详细,所以代码我就不多做介绍了。OK,下面看看如何使用它!
首先要确保本机已经安装了Python2.5,jfEmail.py、rar.exe和daemonEmail.py要放在同一目录下,或者将jfEmail.py放在Python的lib下面也行,rar.exe文件在安装了WinRAR之后在其目录下就有,相信都是人手一个了吧?设置好自己的SMTP信息和要监控的目录folderpath变量,直接点击daemonEmail.py即可,之后就不用管它了如图2所示。接下来要做的事情就是将要发送保存到邮箱里面去的文件或者文件夹复制到监控目录下吧!比如我这里的监控目录是“F:EmailTemp”,注意咯,在填写folderpath变量的时候要写成“F:\EmailTemp\”!我试着将几个文件和文件夹复制到该目录下,然后就去干其他的事情吧,在处理其他事情的过程中,程序已经将我们要保存的资料都发送到指定的邮箱里面去了,而这一切我们都无需再操心了!当文件发送完毕后,我们看看Console里面输出了什么,如图3所示。去检查一下邮箱吧,一定会发现刚才所发送的带附件的几封邮件的。
  
图2
  
图3
        之前说过还要增加一个可以添加到鼠标右键发送到菜单的功能,不然的话每次都得复制粘贴的,也挺麻烦的!打开“我的电脑->Documents and Settings”目录,选择你登录用户的目录进去,本文是Adminitrator,可以发现有个叫“SendTo”的隐藏目录,进入SendTo目录,创建一个新的快捷方式,将路径直接链接到之前的监控路径folderpath中去,这样你无论在电脑的什么位置都可以将要发送的文件或者文件夹通过“发送到”右键菜单复制到监控目录下等待发送了,如图4所示。
  
图4
是不是觉得比较方便啦?从此以后,生活因为你的懒惰又变得更加的多姿多彩了……所以说,人懒点还是有好处的,聪明的懒人总会想出一种可以一劳永逸,以不变应万变的方式去生活,于是大家就有了更多的时间去休息,有了更多的精力去思考,以及更多的想法去创造…… 

点击复制链接 与好友分享!回本站首页
相关TAG标签 之将 邮件
上一篇:软件测试用例的检查单
下一篇:中,美,印,日四国程序员比较
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站