Python小试牛刀--封装mailx
最近在学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来说还是挺方便的,是吧。