Python使用Gmail發郵件

有時候需要備份些東西到郵箱,能夠讓腳本定時自動運行當然是最好! 抽時間用python寫了這么個腳本,使用python-libgmail庫 ( sudo apt-get install python-libgmail )

需求

發送郵件的代碼都是現成的調用,主要是在易用性上做了些優化:

1、發送一句話,不需要正文,比如給郵件列表發個“求助。。。。。(如題)”之類的:

 msend -t  list@domain.com -s "求助,圖形界面進不了,哈哈”

2、發個文件到自已的郵箱,一般用 -f "file1;file2;file3;dir2;dir3" ,發懶的時候不寫 -f 也能用

 msend -t my@gmail.com -f readme.txt
    msend -t my@gmail.com *.txt

3、發個文件或目錄到某個郵箱,需要ZIP一下,(當然2和3可以混用)

 msend -t friend@domain.com -z ./pics/

基本上:

1、目標郵箱和主題必須寫上; 2、如果有文件附件,可以不指定主題,腳本會把文件數當主題名(gmail的title里會顯示正文的) 3、程序會自動判斷文件和目錄,如果是目錄就會遍歷 4、不管是文件還是目錄,如果前綴指定了-z,就壓縮后發送 5、沒有前綴的參數一律當文件名 如果有需要,可以下載玩玩,運行msend不帶參數就有用法,應該很明白了。

(還有什么稀奇古怪的想法?歡迎提出來!)

    Usage:
        msend -t user@domain.com -s title
        msend -t user@domain.com {-s title | -f file | -z file}

Full command:
    msend --to=user@domain.com --subject=title [--msg=body] [--files="file1;dir2"] [--zip="file1;dir2"]

Example: ( edit ~/.msend for default sender account )
    msend -t user@domain.com -s "just a test"
    msend -t user@domain.com -s "send all pic" -f ./mypics/
    msend -t user@domain.com -s "send files as zip" -z ./mytext/
    msend -t user@domain.com -s "send both" -f mytext -z mytext</pre> 


代碼

#!/usr/bin/env python

-- coding: utf8 --

import os ,sys import getopt import libgmail

class GmailSender(libgmail.GmailAccount) : def init(self,myacct,passwd): self.myacct = myacct self.passwd = passwd

    proxy = os.getenv("http_proxy")
    if proxy :
        libgmail.PROXY_URL = proxy

    try:
        self.ga = libgmail.GmailAccount(myacct,passwd)
        self.ga.login()
    except libgmail.GmailLoginFailure,err:
        print "Login failed. (Check $HOME/.msend?)\n",err
        sys.exit(1)
    except Exception,err:
        print "Login failed. (Check network?)\n",err
        sys.exit(1)

def sendMessage(self,to,subject,msg,files):
    if files :
        gmsg = libgmail.GmailComposedMessage(to,subject,msg,filenames=files)
    else:
        gmsg = libgmail.GmailComposedMessage(to, subject, msg )

    try :
        if self.ga.sendMessage(gmsg):
            return 0
        else:
            return 1
    except Exception,err :
        print err
        return 1

class TOOLS : def extrPath(path): list=[] for root,dirs,files in os.walk(path): for f in files: list.append("%s/%s"%(root,f)) return list

extrPath = staticmethod(extrPath)

if name == "main":

to=subject=zip=None
msg=""
files=[]
zip=[]

# getopt
try:
    opts,args = getopt.getopt(sys.argv[1:],
            't:s:m:f:d:z:',
            [ 'to=', 'subject=', 'msg=', 'files=',"dir=","zip=" ])
except getopt.GetoptError,err:
    print str(err)
    sys.exit(2)

for o,a in opts:
    if o in [[--to","-t]]:
        to = a
    elif o in [[--msg","-m]]:
        msg = a + "\n====================\n"
    elif o in [[--subject","-s]]:
        subject = a
    elif o in [[--files","-f]]:
        if a.find(';') > 0:
            files += a.split(';')
        else:
            files += a.replace('\n',' ').split(' ')
    elif o in [[--dir","-d]]:
        if a.find(';') > 0:
            files += a.split(';')
        else:
            files += a.replace('\n',' ').split(' ')
    elif o in [[--zip","-z]]:
        if a.find(';') > 0:
            zip += a.split(';')
        else:
            zip += a.replace('\n',' ').split(' ')

# extrPath
files += args

if len(files)>0:
    msg += "\n=====FILE=====\n"
for f in files:
    if os.path.isfile(f):
        msg += "%s\n"%f
    elif os.path.isdir(f):
        files.remove(f)
        ret = TOOLS.extrPath(f)
        files += ret;
        msg += "\n=====FOLDER[%s]=====\n"%f
        msg += "\n".join(ret)

for f in zip:
    name=f.replace('/','_')
    cmd = "zip -r /tmp/%s.zip %s 1>/tmp/%s.log 2>&1"%(name,f,name)
    os.system(cmd)
    msg += "\n=====ZIP[%s]=======\n"%f
    msg += open("/tmp/%s.log"%name).read()
    os.unlink("/tmp/%s.log"%name)
    zip.remove(f)
    zip.append("/tmp/%s.zip"%name)

files += zip
#print msg
#sys.exit(0)
if not subject and len(files)>0:
    subject="Send %d files."%len(files)

if not to or not subject:
    print """
Usage:
    msend -t user@domain.com -s title
    msend -t user@domain.com {-s title | -f file | -z file}

Full command:
    msend --to=user@domain.com --subject=title [--msg=body] [--files="file1;dir2"] [--zip="file1;dir2"]

Example: ( edit ~/.msend for default sender account )
    msend -t user@domain.com -s "just a test"
    msend -t user@domain.com -s "send all pic" -f ./mypics/
    msend -t user@domain.com -s "send files as zip" -z ./mytext/
    msend -t user@domain.com -s "send both" -f mytext -z mytext

""" sys.exit(3)

conf = "%s/%s" % ( os.getenv("HOME"), ".msend" )
if not os.path.exists(conf):
    open(conf,"wb").write("yourname@gmail.com  yourpassword")
    print """\n  Edit $HOME/.msend first.\n"""
    sys.exit(3)

myacct,passwd = open( conf ).read().split()
gs = GmailSender( myacct,passwd )
if gs.sendMessage(to,subject,msg,files):
    print "FAIL"
else:
    for f in zip:
        os.unlink(f)
    print "OK"</pre> 


 本文由用戶 黑燈舞 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!