email邮件群发

清晨迷雾 <[email protected]>
reply-to        [email protected]
to      python-cn`CPyUG`华蟒用户组 <[email protected]>
date    Wed, Jun 3, 2009 at 11:00
subject [CPyUG:88113] email邮件群发源码贴出,共同改进

代码

python Email 邮件群发源码,参考了网上的一些实现.希望获得大家的帮助共同改进,如果效率提高比较大的话可以成立开源项目

   1 # -*- coding:utf-8 -*-
   2 '''
   3 Created on 2009-5-31
   4 
   5 @author: yuminglong
   6 设计已经考虑了多线程,所以很多地方为以后的转变留下了伏笔
   7 
   8 '''
   9 import smtplib, sys, time
  10 from datetime import datetime
  11 from email.MIMEBase import MIMEBase
  12 from email.MIMEText import MIMEText
  13 from email.MIMEImage import MIMEImage
  14 from email.MIMEMultipart import MIMEMultipart
  15 
  16 class EmailMachine():
  17 
  18    def __init__(self, smtp_server, smtp_user, smtp_pass):
  19        #设置服务器信息
  20        self.serverInfo= {}
  21        self.serverInfo['server'] = smtp_server
  22        self.serverInfo['user'] = smtp_user
  23        self.serverInfo['password'] = smtp_pass
  24        #初始化email信息
  25        self.EmailInfo = {}
  26    #eamil来源地址
  27    def setEmailFrom(self, fromaddr):
  28        self.EmailInfo['from'] = fromaddr
  29 
  30    def getEmailFrom(self):
  31        return self.EmailInfo['from']
  32    #email目的地址
  33    def setEmailTo(self, toaddr):
  34        self.EmailInfo['to'] = toaddr
  35 
  36    def getEmailTo(self):
  37        return self.EmailInfo['to']
  38    #主题
  39    def setSubject(self, subject):
  40        self.EmailInfo['subject'] = subject
  41 
  42    def getSubject(self):
  43        return self.EmailInfo['subject']
  44   #设置内容为文本
  45    def setText(self, text):
  46        self.EmailInfo['body'] = text
  47        self.EmailInfo['isHtml'] = False
  48   #设置内容为html
  49    def setHtml(self,html):
  50        self.EmailInfo['body'] = html
  51        self.EmailInfo['isHtml'] = True
  52    #获得发送的内容
  53    def getBody(self):
  54        return self.EmailInfo['body']
  55    #获取发送内容的格式
  56    def isHtml(self):
  57        return self.EmailInfo['isHtml']
  58    #建立服务器连接,返回连接
  59    def connect(self, smtp_server= '', smtp_user = '', smtp_pass =''):
  60        if smtp_server == '': smtp_server = self.serverInfo['server']
  61        if smtp_user == '': smtp_user = self.serverInfo['user']
  62        if smtp_pass == '': smtp_pass = self.serverInfo['password']
  63 
  64        if not (smtp_server and smtp_user and smtp_pass):
  65            sys.stderr.write('登录验证信息不完整,终止运行')
  66            sys.exit(0)
  67 
  68        self.server = smtplib.SMTP(smtp_server)
  69        self.server.set_debuglevel(1)
  70        try:
  71            self.server.login(smtp_user, smtp_pass)
  72        except:
  73            sys.stderr.write("SMTP服务器登录失败,请检查用户名和密码!")
  74            sys.exit(0)
  75        return self.server
  76    #关闭邮件服务连接
  77    def close(self):
  78        self.server.quit()
  79    #记录日志
  80    def save_log(self, address, issuccess):
  81        if issuccess:
  82            file = open('success.txt','a')
  83        else:
  84            file = open('fail.txt','a')
  85        file.write('%s' % address)
  86    #获取发送Email的地址
  87    def getAddrs(self, filename ='address.txt'):
  88        file = open(filename)
  89        if file:
  90            return file.readlines()
  91    #获得sendmail的msg的字符串
  92    def getMsg(self, subject, body, isHtml = False):
  93        #设定root信息
  94        msgRoot = MIMEMultipart('related')
  95        msgRoot['Subject'] = subject
  96        msgRoot['From'] =  self.getEmailFrom()
  97        msgRoot['To'] = self.getEmailTo()
  98        msgRoot.preamble = 'This is a multi-part message in MIME format.'
  99 
 100        msgAlternative = MIMEMultipart('alternative')
 101        msgRoot.attach(msgAlternative)
 102        if isHtml:
 103            msgText = MIMEText(body,'html','utf-8')
 104        else:
 105            msgText = MIMEText(body, 'plain', 'utf-8')
 106        msgAlternative.attach(msgText)
 107        return msgRoot.as_string()
 108    #发送邮件
 109    def sendMail(self,subject='', body='', isHtml=False):
 110        if subject or body:
 111            isHtml = self.isHtml()
 112        if subject == '':
 113            subject = self.getSubject()
 114        if body == '':
 115            body = self.getBody()
 116        try:
 117            if not self.server:
 118               connect()
 119            msg = self.getMsg(subject, body, isHtml);
 120            self.server.sendmail(self.getEmailFrom(), self.getEmailTo(), msg)
 121            self.save_log(self.getEmailTo(), True)
 122            print "发送成功 : " +self.getEmailTo()
 123        except:
 124            self.save_log(self.getEmailTo(),False)
 125            print "发送失败: " +self.getEmailTo()
 126    #测试样例
 127    def main(self):
 128        self.connect()
 129        self.setEmailFrom('[email protected]')
 130        self.setSubject("测试邮件python")
 131        self.setText("""
 132                        这是一封群发邮件,测试使用,请勿回复!
 133                        """)
 134        addrs = self.getAddrs()
 135        for addr in addrs:
 136            sys.stdout.write('正在发送到  %s ...\n' % addr)
 137            self.setEmailTo(addr)
 138            self.sendMail()
 139            time.sleep(10)
 140        self.close()
 141 
 142 if __name__ == '__main__':
 143    mail = EmailMachine('smtp.yeah.net','example','*********')
 144    mail.main()


反馈

创建 by -- ZoomQuiet [2009-06-03 14:07:12]

MiscItems/2009-06-03 (last edited 2009-12-25 07:09:05 by localhost)