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