zoukankan      html  css  js  c++  java
  • 一个python的邮件发送脚本,自动,定时,可以附件发送,抄送,附有说明文件

    #!/bin/env python
    # -*- coding: utf-8 -*-
    
    
    import datetime
    import smtplib
    import os,sys
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.mime.base import MIMEBase
    from optparse import OptionParser
    
    
    
    
    EMAILHOME=sys.path[0]
    #sender name and password
    sendername=""
    senderpass=""
    #list of all receiver (include cc-receiver)
    receiverlist=[]
    receivertmplist=[]
    receivercctmplist=[]
    
    
    
    
    #get the username and pasword
    #no try catch here
    def getUserAndPass(senderfile):
        upf=open(senderfile)
        username=upf.readline()
        password=upf.readline()
        upf.close()
        return (username.strip(os.linesep),password.strip(os.linesep))
    
    
    
    
    #get the receiver list
    #return the list with no ''
    def getReceiverList(filename):
        lif=open(filename)
        li=lif.readlines()
        lif.close()
        for x in range(len(li)):
            li[x]=li[x].strip().strip(os.linesep)
        while '' in li:
            li.remove('')
        return (li)
    
    
    
    
    #get content of the mail
    def getContent(filename):
        contenttmp=''
        if os.path.exists(filename):
            contentf=open(filename)
            contenttmp=contentf.read()
            contentf.close()
        return contenttmp
    
    
    
    
    
    
    
    
    #parameters process
    parser = OptionParser()
    
    
    parser.add_option('-s', '--sender', dest='sender',
            help='file for sender of the mail', default=None)
    parser.add_option('-r', '--receiver', dest='receiver',
            help='list file for receivers of the mail',default=None)
    parser.add_option('-p', '--cc', dest='cc',
            help='list file for receivers of carbon copy', default=None)
    parser.add_option('-t', '--title', dest='title',
            help='title of the email,string', default='Auto email')
    parser.add_option('-c', '--content', dest='content',
            help='content of the mail,must be a file',default=None)
    parser.add_option('-a', '--attach', dest='attach',
            help='attachment of the file',default=None)
    parser.add_option('-n', '--nameattach', dest='nameattach',
            help='name for attachment of the file',default=None)
    parser.add_option('-l', '--server', dest='server',
            help='log in to the server',default='smtp.163.com')
    parser.add_option('-i', '--info', dest='info',
            help='information of the content,string,but not file',default='Auto email')
    parser.add_option('-f', '--form', dest='form',
            help='form of the content,html or plain',default='plain')
    
    
    (options, args) = parser.parse_args()
    
    
    
    
    #get sender infor
    if not options.sender:
        if os.path.exists(EMAILHOME+r'/sender.list'):
            (sendername,senderpass)=getUserAndPass(EMAILHOME+r'/sender.list')
            if sendername.strip()=="" or senderpass.strip()=="":
                print ("no sender!")
                exit(0)
        else:
            print ("no sender!")
            exit(0)
    else:
        if os.path.exists(options.sender):
            (sendername,senderpass)=getUserAndPass(EMAILHOME+r'/sender.list')
            if sendername.strip()=="" or senderpass.strip()=="":
                print ("no sender!")
                exit(0)
        else:
            print ("the file for sender list does not exists!")
            exit(0)
    
    
            
    #get list of all receiver
    if not options.receiver:
        if os.path.exists(EMAILHOME+r'/receiver.list') or os.path.exists(EMAILHOME+r'/receivercc.list'):
            if os.path.exists(EMAILHOME+r'/receiver.list'):
                receivertmplist= getReceiverList(EMAILHOME+r'/receiver.list')
            if os.path.exists(EMAILHOME+r'/receivercc.list'):
                receivercctmplist= getReceiverList(EMAILHOME+r'/receivercc.list')
            receiverlist=receivertmplist+receivercctmplist
            if len(receiverlist)==0:
                print ("no receiver!")
                exit(0)
        else:
            print ("no receiver list file!")
            exit(0)
    else:
        if os.path.exists(options.receiver) or os.path.exists(options.cc):
            if os.path.exists(options.receiver):
                receivertmplist= getReceiverList(options.receiver)
            if os.path.exists(options.cc):
                receivercctmplist= getReceiverList(options.cc)
            receiverlist=receivertmplist+receivercctmplist
            if len(receiverlist):
                print ("no receiver from the list file!")
                exit(0)
        else:
            print ("receiver list file does not exist!")
            exit(0)
    
    
    if  options.attach and not options.nameattach:
        print ("give a name to the attachment!")
        exit(0)
        
    
    
    #make a mail    
    mailall=MIMEMultipart()    
        
    #content of the mail    
    if options.content:
        mailcontent =getContent(options.content)
        mailall.attach(MIMEText(mailcontent,options.form,'utf-8'))
    elif options.info:
        mailcontent = str(options.info)
        mailall.attach(MIMEText(mailcontent,options.form,'utf-8'))
    
    
    #attachment of the mail    
    if options.attach:
        mailattach =getContent(options.attach)
        if mailattach !='':
            contype = 'application/octet-stream'
            maintype,subtype=contype.split('/',1)
            attfile=MIMEBase(maintype,subtype)
            attfile.set_payload(mailattach)
            attfile.add_header('Content-Disposition','attachment',options.nameattach)
            print ("attach file prepared!")
            mailall.attach(attfile)
    
    
    #title,sender,receiver,cc-receiver,
    mailall['Subject']=options.title
    mailall['From']=sendername
    mailall['To']=str(receivertmplist)
    if len(receivercctmplist) !=0:
        mailall['CC']=str(receivercctmplist)
    
    
    
    
    #get the text of mailall
    fullmailtext=mailall.as_string()
    print ("prepare fullmailtext ok.")
    mailconnect = smtplib.SMTP(options.server)
    try:
        mailconnect.login(sendername,senderpass)
    except Exception as e:
        print ("error when connect the smtpserver with the given username and password !")
        print (e)
        exit(0)
    
    
    print ("connect ok!")
    
    
    try:
        mailconnect.sendmail(sendername, receiverlist, fullmailtext)
    except Exception as e:
        print ("error while sending the email!")
    finally:
        mailconnect.quit()
    
    
    print ('email to '+str(receiverlist)+' over.')
    
    print ('***'*80)
    
    
    
    	
    

    说明:

    #mail.py使用方法:


    1,本脚本同目录下文件介绍:
    sender.list:邮件发送者邮箱和密码,第一行账号(如example@example.com),第二行密码(必须项,不能为空)
    receiver.list:邮件接收者列表,每行一个收件人(如example@example.com)
    receivercc.list:邮件抄送者列表,每行一个收件人(如example@example.com)




    调用方法举例1:
    把发件人和收件人信息(sender.list和receiver.list)填好后,在mail.py所在目录执行
    python mail.py  -s sender.list -r receiver.list






    2,其它帮助信息获得方法:
    在mail.py所在目录执行:python mail.py -h
    显示:
    Options:
      -h, --help            show this help message and exit
      -s SENDER, --sender=SENDER                                     //配置本脚本发件人信息存放的文件的路径  如 /tmp/tmp/list.list
                            file for sender of the mail
      -r RECEIVER, --receiver=RECEIVER                               //配置本脚本收件人列表存放的文件的路径  如 /tmp/tmp/list.list
                            list file for receivers of the mail
      -p CC, --cc=CC        list file for receivers of carbon copy   //配置抄送收件人列表存放的文件的路径  如 /tmp/tmp/list.list
      -t TITLE, --title=TITLE                                        //配置邮件的标题,字符串(不能有空格)
                            title of the email,string
      -c CONTENT, --content=CONTENT                                  //配置邮件的内容,文件路径(和-i冲突时,-i参数无效)
                            content of the mail,must be a file
      -a ATTACH, --attach=ATTACH                                     //配置邮件的附件,文件路径(有附件时,必须配置-n参数)
                            attachment of the file
      -n NAMEATTACH, --nameattach=NAMEATTACH                         //配置邮件的附件名称,字符串(不能有空格)(有附件时,必须配置本参数)
                            name for attachment of the file
      -l SERVER, --server=SERVER                                     //配置邮件的服务器,默认是smtp.163.com
                            log in to the server
      -i INFO, --info=INFO  information of the content,string,but not file //配置邮件的内容,字符串(不能有空格)(和-c冲突时,本参数无效)
      -f FORM, --form=FORM  form of the content,html or plain        //配置邮件的内容的类型,默认是plain
      
    调用方法举例2:
    在mail.py所在目录执行:
    python mail.py  -s /root/tmp/sender.list -r /root/tmp/receiver.list -p /root/tmp/receivercc.list  -t test_the_py -c /root/tmp/content.log -a /root/tmp/attch.log -n attachname1.log 


    将会把/root/tmp/content.log作为文件内容,
    把/root/tmp/attch.log作为附件,
    把attachname1.log作为附件名称,
    把test_the_py作为邮件标题的邮件;
    从/root/tmp/sender.list文件里的发件人,
    发送到/root/tmp/receiver.list和/root/tmp/receivercc.list文件里的收件人列表。  

  • 相关阅读:
    Network (poj1144)
    C. Hongcow Builds A Nation
    ZYB loves Xor I(hud5269)
    D. Chloe and pleasant prizes
    Game(hdu5218)
    约瑟夫环的递推方法
    Misaki's Kiss again(hdu5175)
    Exploration(hdu5222)
    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/yangxiaolan/p/5968330.html
Copyright © 2011-2022 走看看