程序添加邮件功能

Posted by ccsong on October 8, 2016

作用

自动发送邮件功能适合在无人监督情况下及时通知程序运行结果,可以将结果以网页的结果发送或者以附件,内嵌的图片方式发送。 SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。需要了解网页的基本结构。

Pyh:需要通过第三方安装

Pyh: pip install PyH-0.1.1.tar

代码:以163邮箱发件,内嵌的方式显示。

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
from email.mime.multipart import MIMEMultipart,MIMEBase
from pyh import PyH, h1, h2, div

#Description : Get Current Date
def GetDate():
	return datetime.datetime.now().strftime("%Y-%m-%d")
  
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))
	
class RecommendEmail:
    def __init__(self):
        # Send Email Init
        self.from_user = 'xxxxxxx@163.com'
        self.from_password  = 'xxxxx'
        self.server = 'smtp.163.com'
    
    #Description : 设定 HTML,自定义设置
    def EmailHTML(self):
        page = PyH('Every Day result')
        ............
        content=.....
        return content
        
    # Description : Send Email Module
    # Input	   : ghtml - Email content HTML
    def PushEmail(self, ghtml):
        #From Email
        from_addr = self.from_user	
        password  = self.from_password
        smtp_server = self.server
        from_name = u'MyRobot.cs <%s>' % from_addr       
        to_addr = '278974835@qq.com'			
       
        msg = MIMEMultipart()
        #msg = MIMEText( ghtml, 'html', 'utf-8')
        msg['From'] = _format_addr(from_name)
        msg['To'] = _format_addr(u'cs <%s>' % to_addr)
        gtitle = u'[%s]data' % GetDate()
        msg['Subject'] = Header( gtitle, 'utf-8').encode()
                
        # 邮件正文是MIMEText:
        msg.attach(MIMEText(ghtml, 'html', 'utf-8'))
          
        # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
        count_image=0
        for filename in os.listdir("/Users/squirrel/python/sendemail/png"):
            if count_image<3:
                with open(u'/Users/squirrel/python/sendemail/png/%s' % filename, 'rb') as f:
            # 设置附件的MIME和文件名
                    mime = MIMEBase('image', 'jpg', filename=filename)
                    # 加上必要的头信息:
                    mime.add_header('Content-Disposition', 'attachment', filename=filename)
                    mime.add_header('Content-ID', '<%s>' % count_image)
                    mime.add_header('X-Attachment-Id', '%s' % count_image)
                    # 把附件的内容读进来:
                    mime.set_payload(f.read())
                    # 用Base64编码:
                    encoders.encode_base64(mime)
                    # 添加到MIMEMultipart:  附件部分
                    msg.attach(mime)  #显示出来   
            count_image+=1
                            
        try:
            server = smtplib.SMTP(smtp_server, 25)
            server.set_debuglevel(1)
            server.login(from_addr, password)
            server.sendmail(from_addr, [to_addr], msg.as_string())
            server.quit()
            print "邮件发送成功"
        except smtplib.SMTPException as e:
            print ("Error: 无法发送邮件",e)
            
if __name__ == '__main__':
    gHandle = RecommendEmail()
    ghtml = gHandle.EmailHTML()    
    gHandle.PushEmail(ghtml)

参考


Creative Commons License
This work is licensed under a CC A-S 4.0 International License.