通过smtplib发邮件的客户端class
喜欢实现n多的功能,赶紧做个备份,避免以后需要再折腾。
定义邮件title(mailsub),以,或;分隔的附加文件列表(filelist),正文文本(和textype结合,可发送htm格式)等;
那个msg['To'] 和最后sendmail里面的收件人地址可以考虑分开,随便对msg['To']赋值,这样可以实现隐藏收件人的信息;
class PySendMail: def __init__(self,user='mailuser',userpass='mailpass',smtpserver='x.x.x.x',fro='mailuser '): '''注意对于某些smtp server,fro必须附有类似,可以让smtp server识别为正确存在的帐号; ''' self.user = user self.userpass = userpass self.smtpserver = smtpserver self.fro = fro def sendmail(self,mailto='',mailsub='',attachtext='',textype='plain',dctype='application/octet-stream',filelist='',login=1,debug=0): '''filelist: 邮件附件文件列表,可以以","或者";"分隔; attachtext: 邮件的文本正文; textype: text 或者 html, 处理邮件正文; dctype: 默认附件类型为application/octet-stream; mailto: 要发送的邮件地址列表,可以以","或者";"分隔 login: 如果设置为1,smtp将采用指定的用户密码登陆,默认为1; debug: 设置为1,开启debug,默认为0; ''' import smtplib import mimetypes from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email.Utils import COMMASPACE, formatdate from email import Encoders from email.MIMEImage import MIMEImage #处理邮件地址列表 addrlist1 = re.split('\s*[,|;]\s*',mailto) addrlist = [] for addr in addrlist1: if re.match('\s*\S+@\S+\.\S+',addr): addrlist.append(addr) msg = MIMEMultipart() msg['From'] = self.fro msg['To'] = COMMASPACE.join(addrlist) msg['Date'] = formatdate(localtime=True) msg['Subject'] = mailsub #处理文本: maintype = 'text' if textype == 'plain' or textype == 'html': txtsubtype = textype fpld = MIMEBase (maintype, txtsubtype) fpld.set_payload(attachtext) Encoders.encode_base64(fpld) msg.attach(fpld) #处理附件: mailfilelist = [] if filelist: mailfilelist = re.split('\s*[,|;]\s*',filelist) for adfile in mailfilelist: ctype, encoding = mimetypes.guess_type(adfile) if ctype is None or encoding is not None: ctype = dctype maintype, subtype = ctype.split('/', 1) try: fsock=open(adfile,'rb') fpld = MIMEBase (maintype, subtype) fpld.set_payload(fsock.read()) Encoders.encode_base64(fpld) fsock.close #if ctype != 'text/plain': fpld.add_header('Content-Disposition', 'attachment',filename=re.split('/',adfile)[-1]) msg.attach(fpld) except IOError: print 'cant open file: %s ' %adfile #邮件发送 smtp = smtplib.SMTP(self.smtpserver) if debug: smtp.debuglevel = 5 if login: smtp.login(self.user,self.userpass) smtp.sendmail(self.fro, addrlist, msg.as_string() ) smtp.close()