自动发邮件的实现
最近在学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