一个python的邮件发送脚本,自动,定时,可以附件发送,抄送,附有说明文件 (本脚本是python的2.7.x环境下可用)

原创 2013年01月21日 16:07:08

20140915更新(先补充说明本脚本是python的2.7.x环境下可用)_______________________________________________________________________________________________________________________

有热心网友反映本邮件脚本无法正常发送邮件,经调试发现163的服务器对发件人进行了校验,貌似是为了防止冒充他人发邮件。哈哈,2014年初的时候还没加呢。。。嗯,当然要升级本了,在本页用红色标注了。

在sendername=""后增加一行:

sendername_all=""

在:(sendername,senderpass)=getUserAndPass(EMAILHOME+r'/sender.list')和(sendername,senderpass)=getUserAndPass(options.sender)之后加一行:

sendername_all = sendername + "@" + ".".join(options.server.split(".")[1:])


修改两个位置使用sendername为sendername_all

mailall['From']=sendername_all

mailconnect.sendmail(sendername_all, receiverlist, fullmailtext)

这5处在本页已经标红




PS(2013-03-27):最近这个脚本用到了公司的另个项目中,才发现有个bug:发件人配置之后,无法起作用。现在查明是 (sendername,senderpass)=getUserAndPass(EMAILHOME+r'/sender.list')应该为 (sendername,senderpass)=getUserAndPass(options.sender),来让邮件配置起作用。另外本脚本运行稳定,配置成功时,发邮件成功率99.9%以上,呵呵,保守点哈,因为没发现发送失败的情况。



最近需要完成一个定时发送报表的工作,所以我查询了网上各种用python发送邮件的信息,自己经过深度加工,完成了这个可以灵活定制参数的py文件,希望可以帮助到大家。


这里先上说明吧:

————————————————————————————————————————————————————————————————————————

说明:

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


3,如有任何问题欢迎联系我:
QQ:38壹37零43二

————————————————————————————————————————————————————————————————————————

以下是mail.py中的所有代码:

#!/bin/env python
# -*- coding: utf-8 -*-

import datetime
import smtplib
import os,sys
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from optparse import OptionParser



EMAILHOME=sys.path[0]
#sender name and password
sendername=""
sendername_all=""
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')
        sendername_all = sendername + "@" + ".".join(options.server.split(".")[1:])
        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(options.sender)
        sendername_all = sendername + "@" + ".".join(options.server.split(".")[1:])
        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)==0:
            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_all
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,e:
    print "error when connect the smtpserver with the given username and password !"
    print e
    exit(0)

print "connect ok!"

try:
    mailconnect.sendmail(sendername_all, receiverlist, fullmailtext)
except Exception,e:
    print "error while sending the email!"
finally:
    mailconnect.quit()

print 'email to '+str(receiverlist)+' over.'
print '***'*80


相关文章推荐

使用python自动发送邮件

通过python编写的脚本能实现邮件的自动发送功能。 以后就可以全自动的推送自己的广告软文了。嘿嘿嘿。。。。。 现在记录一下这个功能。 注意如果使用qq的smtp转发功能的话,需要在设置...

python定时邮件发送

邮件发送--试用一个邮箱定时给另一个邮箱发送邮件--程序启动后,本地时间为整点时自动使用"zw772686607@163.com"邮箱向 "772686607@qq.com"邮箱发送"d://log....

python邮件自动发送

case 1:纯文本和HTML文件发送 # -*- coding: UTF-8 -*- import smtplib import traceback from email.mime.text i...

【Python学习笔记】-自动发送邮件脚本

自动发送邮件功能是我们经常要用到的,比如每天定时统计报表信息,然后自动发送给运营人员,协助运营人员进行业务数据分析。本文是用Python写的一个自动发送邮件的脚本,调用函数时,直接把发件人邮箱地址、密...

Python 发送邮件脚本

在一些场景中经常需要发送邮件, 像是持续集成和运维报警等. 而使用Python脚本能够很快捷方便得实现发送各种邮件的需求.这里就通过Python基于SMTP(Simple Mail Transfer ...
  • l2show
  • l2show
  • 2017年02月26日 14:41
  • 1861

Python发送邮件(常见四种邮件内容)

转自:http://lizhenliang.blog.51cto.com/7876557/1875330 在写脚本时,放到后台运行,想知道执行情况,会通过邮件、SMS(短信)、飞信、微信等方式通知...

python发送邮件(带附件)、发送给多人、抄送给多人的示例

python发送邮件(带附件)、发送给多人、抄送给多人的示例 #!/usr/bin/env python # -*-encoding: utf-8 -*- import smtplib ...

Python网络编程:E-mail服务(八) 实现抄送和密送功能

本文介绍如何实现SMTP邮件的抄送和密送功能

Python 发送带有中文附件的邮件

之前在网上找了半天没找到解决方案,后来通过看

通过python发送带附件(支持多个附件)的邮件

目的:实现通过邮件,自动发送自动化脚本执行结果给对应的人 记录点:1 发送账号的密码设置,通过QQ发送的时候,目前QQ邮件的smtp设置的时候,都是通过授权码来进行账号认证,如果直接在脚本中写入QQ邮...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个python的邮件发送脚本,自动,定时,可以附件发送,抄送,附有说明文件 (本脚本是python的2.7.x环境下可用)
举报原因:
原因补充:

(最多只允许输入30个字)