自动发邮件的实现

最近在学python,感觉很爽。完全彻底的面向对象化,极其灵活的动态绑定,还有内置的三大数据结构(Tuple,List, Dict),真是让人爱不释手。

既然要学,就得写点什么,从简单的开始。

自从我的大部分工作转移到Linux上以后,我发现自己越来越不想碰鼠标了,总希望所有的事情都可以在终端下很方便的完成,发个邮件也不例外。于是我就经常使用mail命令来发邮件。

用过的人应该都知道,如果单纯的使用mail命令发邮件的话,在其内置的交互环境中写邮件正文的时候是不能修改上一行的。所以大家通常都是先把邮件正文写入文件,例如/tmp/tmpmail,然后用 mail -s "hello" somebody@sample.com < /tmp/tmpmail 来发送邮件。这样比较麻烦,所以就想把这个过程封装一下,正好试试强大的python。

代码很简单,所以也没什么注释,直接上了。

 1 #!/usr/bin/env python
 2 # Filename: mail.py
 3 
 4 import sys
 5 import os
 6 import tempfile
 7 
 8 key_word_mailto = "# [ MailTo ]:"
 9 key_word_title  = "# [  Title ]:"
10 template_mail   = \
11 """# Welcome to use carl's mail tool
12 # Edit this tempfile and save&quit, it'll be mailed automatic
13 #
14 %(kw_mailto)s %(addr)s
15 %(kw_title)s %(title)s
16 #
17 # then you can add content here:
18 %(content)s
19 
20 
21 # END FILE
22 """
23 
24 def mk_tempfile(mail):
25     fname = tempfile.mktemp()
26     tf = file(fname, 'w')
27     mail["kw_mailto"] = key_word_mailto
28     mail["kw_title"] = key_word_title
29     tf.write(template_mail % mail)
30     return fname
31 
32 def open_edit(fname):
33     os.system("vim %s +8" % fname)
34 
35 def parse_tempfile(fname):
36     tf = file(fname, 'r')
37     mail = {}
38     content_lines = []
39     while True:
40         line = tf.readline()
41         if len(line) == 0:
42             break;
43         if line.startswith("#"):
44             if line.startswith(key_word_title):
45                 mail["title"] = line.split(key_word_title)[1].strip()
46             elif line.startswith(key_word_mailto):
47                 mail["addr"] = line.split(key_word_mailto)[1].strip()
48             else:
49                 pass
50         else:
51             content_lines.append(line)
52     mail["content"] = "".join(content_lines)
53     tf.close()
54     return mail
55 
56 def mail_it(mail):
57     fname = tempfile.mktemp()
58     tf = file(fname, 'w')
59     tf.write(mail["content"])
60     tf.close()
61     mail["contentfile"] = fname
62     commit = raw_input("mail it ? [y/n]:")
63     if commit == "y":
64         os.system('mail -s "%(title)s" %(addr)s < %(contentfile)s' % mail)
65     else:
66         print "Did not mail it. [%s]" % mail["contentfile"]
67 
68 def do_work(argv):
69     if len(argv) == 0:
70         print "you have to specify the address"
71         exit(0)
72     mail = {}
73     mail["addr"] = argv[0]
74     if len(argv) > 1:
75         mail["title"] = argv[1]
76     else:
77         mail["title"] = raw_input("Title: ")
78     mail["content"] = ""
79     tf = mk_tempfile(mail)
80     open_edit(tf)
81     mail = parse_tempfile(tf)
82     #print mail
83     mail_it(mail)
84     
85 
86 if __name__ == "__main__":
87     do_work(sys.argv[1:])

OK,贴几张效果图。

首先,敲命令 cmail somebody@example.com(cmail 是~/bin/cmail指向该代码的软链接),回车后会有提示要求输入邮件标题

输入完成后再回车,则出现下面的界面,呵呵,vim的编辑界面,这样就可以直接用我们最熟悉的vim来编辑邮件正文了。如果在这里想改收件人或者邮件标题也是可以的,直接修改对应的地方就可以了。

写完之后保存退出,然后会有提示问是否要mail it,输入y,邮件就自动发出去了。

 

虽然没啥技术含量,但对一vimer来说还是挺方便的,是吧。

本文转载自:http://www.cnblogs.com/hehongbo/archive/2011/12/11/2284184.html

posted @ 2012-05-16 14:35  icamel  阅读(586)  评论(0编辑  收藏  举报