##language:zh #pragma section-numbers off ##含有章节索引导航的 ZPyUG 文章通用模板 <> ## 默许导航,请保留 <> = email邮件群发 = {{{ 清晨迷雾 reply-to python-cn@googlegroups.com to python-cn`CPyUG`华蟒用户组 date Wed, Jun 3, 2009 at 11:00 subject [CPyUG:88113] email邮件群发源码贴出,共同改进 }}} ##startInc == 代码 == python Email 邮件群发源码,参考了网上的一些实现.希望获得大家的帮助共同改进,如果效率提高比较大的话可以成立开源项目 {{{#!python # -*- coding:utf-8 -*- ''' Created on 2009-5-31 @author: yuminglong 设计已经考虑了多线程,所以很多地方为以后的转变留下了伏笔 ''' import smtplib, sys, time from datetime import datetime from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email.MIMEImage import MIMEImage from email.MIMEMultipart import MIMEMultipart class EmailMachine(): def __init__(self, smtp_server, smtp_user, smtp_pass): #设置服务器信息 self.serverInfo= {} self.serverInfo['server'] = smtp_server self.serverInfo['user'] = smtp_user self.serverInfo['password'] = smtp_pass #初始化email信息 self.EmailInfo = {} #eamil来源地址 def setEmailFrom(self, fromaddr): self.EmailInfo['from'] = fromaddr def getEmailFrom(self): return self.EmailInfo['from'] #email目的地址 def setEmailTo(self, toaddr): self.EmailInfo['to'] = toaddr def getEmailTo(self): return self.EmailInfo['to'] #主题 def setSubject(self, subject): self.EmailInfo['subject'] = subject def getSubject(self): return self.EmailInfo['subject'] #设置内容为文本 def setText(self, text): self.EmailInfo['body'] = text self.EmailInfo['isHtml'] = False #设置内容为html def setHtml(self,html): self.EmailInfo['body'] = html self.EmailInfo['isHtml'] = True #获得发送的内容 def getBody(self): return self.EmailInfo['body'] #获取发送内容的格式 def isHtml(self): return self.EmailInfo['isHtml'] #建立服务器连接,返回连接 def connect(self, smtp_server= '', smtp_user = '', smtp_pass =''): if smtp_server == '': smtp_server = self.serverInfo['server'] if smtp_user == '': smtp_user = self.serverInfo['user'] if smtp_pass == '': smtp_pass = self.serverInfo['password'] if not (smtp_server and smtp_user and smtp_pass): sys.stderr.write('登录验证信息不完整,终止运行') sys.exit(0) self.server = smtplib.SMTP(smtp_server) self.server.set_debuglevel(1) try: self.server.login(smtp_user, smtp_pass) except: sys.stderr.write("SMTP服务器登录失败,请检查用户名和密码!") sys.exit(0) return self.server #关闭邮件服务连接 def close(self): self.server.quit() #记录日志 def save_log(self, address, issuccess): if issuccess: file = open('success.txt','a') else: file = open('fail.txt','a') file.write('%s' % address) #获取发送Email的地址 def getAddrs(self, filename ='address.txt'): file = open(filename) if file: return file.readlines() #获得sendmail的msg的字符串 def getMsg(self, subject, body, isHtml = False): #设定root信息 msgRoot = MIMEMultipart('related') msgRoot['Subject'] = subject msgRoot['From'] = self.getEmailFrom() msgRoot['To'] = self.getEmailTo() msgRoot.preamble = 'This is a multi-part message in MIME format.' msgAlternative = MIMEMultipart('alternative') msgRoot.attach(msgAlternative) if isHtml: msgText = MIMEText(body,'html','utf-8') else: msgText = MIMEText(body, 'plain', 'utf-8') msgAlternative.attach(msgText) return msgRoot.as_string() #发送邮件 def sendMail(self,subject='', body='', isHtml=False): if subject or body: isHtml = self.isHtml() if subject == '': subject = self.getSubject() if body == '': body = self.getBody() try: if not self.server: connect() msg = self.getMsg(subject, body, isHtml); self.server.sendmail(self.getEmailFrom(), self.getEmailTo(), msg) self.save_log(self.getEmailTo(), True) print "发送成功 : " +self.getEmailTo() except: self.save_log(self.getEmailTo(),False) print "发送失败: " +self.getEmailTo() #测试样例 def main(self): self.connect() self.setEmailFrom('example@yeah.net') self.setSubject("测试邮件python") self.setText(""" 这是一封群发邮件,测试使用,请勿回复! """) addrs = self.getAddrs() for addr in addrs: sys.stdout.write('正在发送到 %s ...\n' % addr) self.setEmailTo(addr) self.sendMail() time.sleep(10) self.close() if __name__ == '__main__': mail = EmailMachine('smtp.yeah.net','example','*********') mail.main() }}} ##endInc ---- '''反馈''' 创建 by -- ZoomQuiet [<>]