zoukankan      html  css  js  c++  java
  • python运维开发常用模块(6)发送电子邮件模块smtplib

    1.模块常用方法

    SMTP类定义:smtplib.SMTP([host[,port[,local_hostname[, timeout]]]]),作为SMTP的构造函数,功能是与smtp服务器建立连接, 在连接成功后,就可以向服务器发送相关请求,比如登录、校验、发 送、退出等。host参数为远程smtp主机地址,比如smtp.163.com;port为 连接端口,默认为25;local_hostname的作用是在本地主机的FQDN(完 整的域名)发送HELO/EHLO(标识用户身份)指令,timeout为连接或 尝试在多少秒超时。

    SMTP类具有如下方法:

    SMTP.connect([host[,port]])方法,连接远程smtp主机方法, host为远程主机地址,port为远程主机smtp端口,默认25,也可以直接 使用host:port形式来表示,

    例如: SMTP.connect(“smtp.163.com” , “25”)。 ·

    SMTP.login(user,password)方法,远程smtp主机的校验方法, 参数为用户名与密码,

    例如: SMTP.login(“python_2014@163.com” , “sdjkg358”)。

    SMTP.sendmail(from_addr,to_addrs,msg[,mail_options, rcpt_options])方法,实现邮件的发送功能,参数依次为是发件人、收 件人、邮件内容,

    例如: SMTP.sendmail(“python_2014@163.com” , “demo@domail.com” , body),其中body内容定义如下:

    """From: python_2014@163.com To: demo@domail.com Subject: test mail test mail body

    2.最简单的邮件代码

    #!/usr/bin/python
    #_*_coding:utf-8_*_
    #****************************************************************#
    # ScriptName: smtplib01.py
    # Author: BenjaminYang
    # Create Date: 2019-05-18 08:55
    # Modify Author: BenjaminYang
    # Modify Date: 2019-05-18 08:55
    # Function: 
    #***************************************************************#
    import smtplib
    import string
    HOST="smtp.163.com" #定义smtp主机
    SUBJECT="python send email"
    TO="1331xxxxxxx@163.com" #定义邮件的收件人
    FROM="1331xxxxxxx@163.com" #定义邮件发件人
    text="Python rules them all" #邮件内容
    BODY=string.join((  #组装sendmail方法的邮件主体内容,各段以"
    "进行分隔
        "From:  %s" % FROM,
        "To:  %s" % TO,
        "Subject:  %s" % SUBJECT,
        "",
        text
        ), "
    ")
    
    server=smtplib.SMTP() #创建一个SMTP()对象
    server.connect(HOST,"25")
    server.starttls()  #启动安全传输模式
    server.login("1331xxxxxxx@163.com","yourpwd") #邮箱账号登录校验
    server.sendmail(FROM,TO,BODY) #邮件发送
    server.quit()  #断开smtp连接

    执行后将会收到如下的邮件

    3.定制个性化的邮件格式方法

    通过邮件传输简单的文本已经无法满足我们的需求,比如我们时
    常会定制业务质量报表,在邮件主体中会包含HTML、图像、声音以及 附件格式等,MIME(Multipurpose Internet Mail Extensions,多用途互联 网邮件扩展)作为一种新的扩展邮件格式很好地补充了这一点,更多 MIME知识见http://zh.wikipedia.org/wiki/MIME。下面介绍几个Python中 常用的MIME实现类:

    ·email.mime.multipart.MIMEMultipart([_subtype[,boundary[, _subparts[,_params]]]]),作用是生成包含多个部分的邮件体的MIME 对象,参数_subtype指定要添加到"Content-type:multipart/subtype"报头 的可选的三种子类型,分别为mixed、related、alternative,默认值为 mixed。定义mixed实现构建一个带附件的邮件体;定义related实现构建 内嵌资源的邮件体;定义alternative则实现构建纯文本与超文本共存的邮 件体。

    ·email.mime.audio.MIMEAudio(_audiodata[,_subtype[, _encoder[,**_params]]]),创建包含音频数据的邮件体,_audiodata包 含原始二进制音频数据的字节字符串。 

    ·email.mime.image.MIMEImage(_imagedata[,_subtype[, _encoder[,**_params]]]),创建包含图片数据的邮件体,_imagedata是 包含原始图片数据的字节字符串。 

    ·email.mime.text.MIMEText(_text[,_subtype[,_charset]]),创建 包含文本数据的邮件体,_text是包含消息负载的字符串,_subtype指定 文本类型,支持plain(默认值)或html类型的字符串。

    可以将email.mime理 解成smtplib模块邮件内容主体的扩展,从原先默认只支持纯文本格式扩 展到HTML,同时支持附件、音频、图像等格式,smtplib只负责邮件的 投递即可。下面介绍在日常运营工作中邮件应用的几个示例。 

    示例1:实现HTML格式的数据报表

    邮件纯文本的邮件内容已经不能满足我们多样化的需求,本示例通过 引入email.mime的MIMEText类来实现支持HTML格式的邮件,支持所有
    HTML元素,包含表格、图片、动画、CSS样式、表单等。本示例使用 HTML的表格定制美观的业务流量报表,实现代码如下:

    【/home/test/smtplib/simple2.py】

    #_*_coding:utf-8_*_
    #****************************************************************#
    # ScriptName: smtplib02.py
    # Author: BenjaminYang
    # Create Date: 2019-06-01 20:04
    # Modify Author: BenjaminYang
    # Modify Date: 2019-06-01 20:04
    # Function: 
    #***************************************************************#
    
    #!/usr/bin/python
    import smtplib
    from email.mime.text import MIMEText # 导入MIMEText类
    HOST="smtp.163.com"  #定义smtp主机
    Subject=u"官网流量数据表"  #定义邮件主题
    To="1331xxxxxxx@163.com" #定义收件人
    From="1331xxxxxxx@163.com" #定义发件人
    #创建一个MIMEText对象,分别指定HTML内容、类型(文本或 html)、字符编码
    msg=MIMEText("""           
            <talbe  width="800" border="0" cellspacing="0" cellpadding="4">
             <tr>        
                <td bgcolor="#CECFAD" height="14px">*官网数据 
                <a href="monitor.domain.com">更多>></a>
                </td>      
             </tr><br>     
             <tr>        
                <td bgcolor="#EFEBDE" height="13px">        
                1)日访问量:<font color=red>152433</font>  访问次数:23651 页面浏览量: 45123 点击数:545122  数据流量:504Mb<br>        
                2)状态码信息<br>        &nbsp;&nbsp;500:105  404:3264  503:214<br>        
                3)访客浏览器信息<br>        &nbsp;&nbsp;IE:50%  firefox:10% chrome:30% other:10%<br>        
                4)页面信息<br>        &nbsp;&nbsp;/index.php 42153<br>        &nbsp;&nbsp;/view.php 21451<br>        &nbsp;&nbsp;/login.php 5112<br>        
                </td>      
            </tr>    
            </table>""","html","utf-8") 
    msg['Subject']=Subject #邮件主题
    msg['From']=From       #邮件发件人,邮件头部可见
    msg['To']=To           #邮件收件人,邮件头部可见
    try:
        server=smtplib.SMTP()  #创建一个SMTP()对象
        server.connect(HOST,"25")  #通过connect方法连接smtp主机
        server.starttls()          #启动安全传输模式
        server.login("1331xxxxxxx@163.com","yourpwd") #邮箱登录账号
        server.sendmail(From,To,msg.as_string()) #邮件发送
        server.quit()  #断开smtp连接
        print "邮件发送成功!"
    except Exception, e:
        print "失败:"+str(e)

    示例2:实现图文格式的服务器性能报表邮件

    示例1通过MIMEText类来实现HTML格式的邮件,当要求包含图片 数据的邮件内容时,需要引用MIMEImage类,若邮件主体由多个MIME 对象组成,则同时需引用MIMEMultipart类来进行组装。本示例通过 MIMEText与MIMEImage类的组合来实现图文格式的服务器性能报表邮 件的定制,实现代码如下:

     【/home/test/smtplib/simple3.py】

    #_*_coding:utf-8_*_
    #****************************************************************#
    # ScriptName: smtplib03.py
    # Author: BenjaminYang
    # Create Date: 2019-06-01 22:53
    # Modify Author: BenjaminYang
    # Modify Date: 2019-06-01 22:53
    # Function: 
    #***************************************************************#
    
    #!/usr/bin/python
    import smtplib
    from email.mime.multipart import MIMEMultipart #导入MIMEMultipart类 
    from email.mime.text import MIMEText          #导入MIMEText类 
    from email.mime.image import MIMEImage        #导入MIMEImage类 
    HOST="smtp.163.com"     #定义smtp主机
    SUBJECT=u"业务性能数据报表" #定义邮件主题 
    TO="1331xxxxxxx@163.com"    #定义邮件收件人
    FROM="1331xxxxxxx@163.com"  #定义邮件发件人 
    def addimg(src,imgid):   #添加图片函数,参数1:图片路径,参数2:图片id 
        fp=open(src,"rb")  #打开文件 
        msgImage=MIMEImage(fp.read()) #创建MIMEImage对象,读取图片内容并作为 参数 
        fp.close()      #关闭文件
        msgImage.add_header("Content-ID",imgid) #指定图片文件的Content-ID, <img> 标签src用到
        return msgImage
    msg=MIMEMultipart("related")                                               
    #标签src用到return msgImage 返回msgImage对象 msg = MIMEMultipart('related')创建MIMEMultipart对象,采用related定义内嵌 资源的邮件体 
    #创建一个MIMEText对象,HTML元素包括表格<table>及图片 <img>
    msgtext = MIMEText("""   
        <table width="600" border="0" cellspacing="0" cellpadding="4">     
            <tr bgcolor="#CECFAD" height="14px">        
                <td colspan=2>*官网性能数据  <a href="monitor.domain.com">更多>></a> </td>
            </tr>      
            <tr bgcolor="#EFEBDE" height="13px">        
                <td> <img src="cid:io"></td>
                <td> <img src="cid:key_hit"></td>      
            </tr>      
            <tr bgcolor="#EFEBDE" height="13px">         
                <td><img src="cid:mem"></td>
                <td><img src="cid:swap"></td>      
            </tr>   
        </table>""","html","utf-8")
    msg.attach(msgtext)  
    msg.attach(addimg("img/bytes_io.png","io"))  
    msg.attach(addimg("img/myisam_key_hit.png","key_hit"))
    msg.attach(addimg("img/os_swap.png","swap"))
    msg.attach(addimg("img/os_mem.png","mem"))
    
    msg['Subject']=SUBJECT 
    msg['From']=FROM
    msg['To']=TO
    try:
        server=smtplib.SMTP()
        server.connect(HOST,"25")
        server.starttls()
        server.login("1331xxxxxxx@163.com","yourpwd")  #邮箱账号登录效验
        server.sendmail(FROM,TO,msg.as_string())  
        server.quit() 
        print '邮件发送成功!'
    except Exception,e:
        print "失败:"+str(e)

    示例3:实现带附件格式的业务服务质量周报邮件

    本示例通过MIMEText与MIMEImage类的组合,实现图文邮件格 式。另通过MIMEText类再定义Content-Disposition属性来实现带附件的 邮件。我们可以利用这些丰富的特性来定制周报邮件,如业务服务质量 周报。实现代码如下: 

     【/home/test/smtplib/simple4.py】

    #_*_coding:utf-8_*_
    #****************************************************************#
    # ScriptName: smtplib03.py
    # Author: BenjaminYang
    # Create Date: 2019-06-01 22:53
    # Modify Author: BenjaminYang
    # Modify Date: 2019-06-01 22:53
    # Function: 
    #***************************************************************#
    
    #!/usr/bin/python
    import smtplib
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart #导入MIMEMultipart类 
    from email.mime.text import MIMEText          #导入MIMEText类 
    from email.mime.image import MIMEImage        #导入MIMEImage类 
    HOST="smtp.163.com"     #定义smtp主机
    SUBJECT=u"业务性能数据报表" #定义邮件主题 
    TO="342037867@qq.com"    #定义邮件收件人
    FROM="1331xxxxxxx@163.com"  #定义邮件发件人 
    def addimg(src,imgid):   #添加图片函数,参数1:图片路径,参数2:图片id 
        fp=open(src,"rb")  #打开文件 
        msgImage=MIMEImage(fp.read()) #创建MIMEImage对象,读取图片内容并作为 参数 
        fp.close()      #关闭文件
        msgImage.add_header("Content-ID",imgid) #指定图片文件的Content-ID, <img> 标签src用到
        return msgImage
    msg=MIMEMultipart()                                               
    #标签src用到return msgImage 返回msgImage对象 msg = MIMEMultipart('related')创建MIMEMultipart对象,采用related定义内嵌 资源的邮件体 
    #创建一个MIMEText对象,HTML元素包括表格<table>及图片 <img>
    msgtext = MIMEText(
            "<font color=red>官网业务周平均延时图表:<br><img src="cid:weekly" border="1"><br>详细内容见附件。</font>"
            ,"html","utf-8")
    
    msg.attach(msgtext)   #MIMEMultipart对象附加MIMEText的内容 
    msg.attach(addimg("img/weekly.jpg","weekly"))
    
    #创建一个MIMEText对象,附加week_report.xlsx文档
    attach = MIMEText(open("doc/week_report.xlsx","rb").read(),'base64','utf-8') 
    attach["Content-Type"] = 'application/octet-stream'#指定文件格式类型 
    #指定Content-Disposition值为attachment则出现下载保存对话框,保存的默认文件名使用filename指定
    #由于qqmail使用gb18030页面编码,为保证中文文件名不出现乱码,对文件名进行编码转换
    attach["Content-Disposition"] = "attachment;filename="业务服务质量周报(12 周).xlsx"".decode("utf-8").encode("gb18030")
    
    msg.attach(attach)   #MIMEMultipart对象附加MIMEText的内容 
    msg['Subject']=SUBJECT 
    msg['From']=FROM
    msg['To']=TO
    try:
        server=smtplib.SMTP()
        server.connect(HOST,"25")
        server.starttls()
        server.login("1331xxxxxxx@163.com","yourpwd")  #邮箱账号登录效验
        server.sendmail(FROM,TO,msg.as_string())  
        server.quit() 
        print '邮件发送成功!'
    except Exception,e:
        print "失败:"+str(e)

  • 相关阅读:
    进程间通信 之 管道
    单调递增连续最长子序列
    使用EasyUI实现加入和删除功能
    android file.createnewfile ioexception
    60个可爱的云图案设计,激发你的灵感
    关于Platinum库的MediaRender具体C++代码实现探讨
    《程序员的第一年》---------- 学会抛出异常 你的程序人生才幸福
    LA 3027 Corporative Network 并查集记录点到根的距离
    Struts2 学习第一步准备工作
    Android编程心得-图片自适应心得
  • 原文地址:https://www.cnblogs.com/benjamin77/p/10884793.html
Copyright © 2011-2022 走看看