#!/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文件里的收件人列表。  

一个python的邮件发送脚本,自动,定时,可以附件发送,抄送,附有说明文件的更多相关文章

  1. python实现邮件发送完整代码(带附件发送方式)

    实例一:利用SMTP与EMAIL实现邮件发送,带附件(完整代码) __author__ = 'Administrator'#coding=gb2312 from email.Header import ...

  2. ROS 5.x自动定时备份并发送到邮箱(实用)

    博主使用ROS已经有很长一段时间了,但经常会忘记备份配置与数据库,加上ROS本身自带的User-Man数据库并不是非常稳定,1年中总会出现1-2次数据丢失的情况.所以费了一定功夫才找到真正可用自动备份 ...

  3. python 邮件发送 脚本

    import smtplib from email.header import Header from email.mime.text import MIMEText from_addr = 'XXX ...

  4. python SMTP邮件发送(转载)

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  5. 【Python脚本】Python创建删除文件-----------我的第一个Python脚本

    Python相对C++和Java来说,是解释性语言,非常适合来编写脚本. 很久之前就开始学习Python的语法了,今天写了第一个Python的脚本,来简化我的一些日常工作. 我平时学习的时候喜欢新建一 ...

  6. Python SMTP邮件发送

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块: email负责构造邮件 ...

  7. ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数

    一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数. 若用的是fish s ...

  8. 编写一个python脚本功能-备份

    版本一 解决方案当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的实施.版本一例10.1 备份脚本——版本一 #!/usr/bin/python # Filename: backu ...

  9. SQL2008实现数据库自动定时备份——维护计划

    在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员 每天守到晚上1点去备份数据库.要实现数据库的 ...

随机推荐

  1. Android app AOP添加埋点技术总结

    目标:通过面向切面编程来实现对源代码无侵入的埋点.     方式 能力 缺点 学习曲线   XPosed 运行期hook 能hook自己应用进程的方法: 能hook别的应用的方法: 能hook系统方法 ...

  2. Android 框架学习之 第一天 okhttp & Retrofit

    最近面试,一直被问道新技术新框架,这块是短板,慢慢补吧. 关于框架的学习,分几个步骤 I.框架的使用 II.框架主流使用的版本和Android对应的版本 III.框架的衍生使用比如okhttp就会有R ...

  3. date命令总结

    date命令是显示或设置系统时间与日期 date(选项)(参数) -d<字符串>:显示字符串所指的日期与时间.字符串前后必须加上双引号: -s<字符串>:根据字符串来设置日期与 ...

  4. 教你摸清 Linux PC 的性能底细?

    导读 基准测试是一项测试或一系列测试,用来确定某个计算机硬件运行起来的状况有多好.在许多情况下,“基准测试”实际上等同于“压力测试”.通过测试硬件的极限,然后可以将测得的结果与其他硬件测得的结果作一番 ...

  5. Flink &ndash; Trigger,Evictor

    org.apache.flink.streaming.api.windowing.triggers;   Trigger public abstract class Trigger<T, W e ...

  6. FOR ALL ENTRIES IN 与 INNER JOIN 写在一个SQL上影响效率

    SELECT likp~vbeln likp~lfart lips~werks likp~kunnr INTO CORRESPONDING FIELDS OF TABLE it_likps FROM ...

  7. linux内核设计模式

    原文来自:http://lwn.net/Articles/336224/ 选择感兴趣内容简单翻译了下: 在内核社区一直以来的兴趣是保证质量.我们需要保证和改善质量是显而易见的.但是如何做到却不是那么简 ...

  8. LNK1179 无效或损坏的文件: 重复的 COMDAT“_IID_IDispatchEx”

    fatal error LNK1179: invalid or corrupt file: duplicate comdat  "XXX" LNK1179 无效或损坏的文件: 重复 ...

  9. windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放

    http://blog.csdn.net/wangrenzhu2011/article/details/7732907 (转) 实现方法: 对Manipulation进行抽象化 使不同容器可共用多点缩 ...

  10. Bundle文件的创建和使用(二)

    1.概念: An NSBundle object represents a location in the file system that groups code and resources tha ...