每天都学一点

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

05 05月
作者:林健|分类:Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#!/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 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:邮件发送者邮箱和密码,第一行账号(如[email protected]),第二行密码(必须项,不能为空)
receiver.list:邮件接收者列表,每行一个收件人(如[email protected])
receivercc.list:邮件抄送者列表,每行一个收件人(如[email protected])




调用方法举例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文件里的收件人列表。


    浏览1 评论0
    返回
    目录
    返回
    首页
    openssl用法详解 route使用详解

    发表评论