• python使用电子邮件模块smtplib的方法(发送图片 附件)实用可行


    Smptp类定义:smtplib.SMTP(host[,port[,local_hostname[,,timeout]]]),作为SMTP的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可以向服务器发送相关请求,比如登陆,校验,发送,退出等。host参数为远程smtp主机地址,比如stmp.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("18801457794@139.com",'123456').
    SMTP.sendmail(from_addr,to_addrs,msg[,mail_options,rcpt_options])方法,实现邮件的发送功能,参数依次为发件人,收件人,邮件内容,例如:SMTP.sendmail("python@163.com",'404408853@qq.com',body),其中body内容定义如下:
    """From:python@163.com
    To:404408853@qq.com
    Subject:test mail
    test mail body"""
    SMTP.starttls([keyfile[,certfile]])方法,启用TLS(安全传输)模式,所有SMTP指令都讲加密传输,例如使用gmail的stmp服务器时需要启动此项才能正常发送邮件
    SMTP.quit()方法,端口smtp服务器的连接

    下面通过实例列子来了解python是怎么发送邮件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    [root@localhost smtplib]# cat simple1.py
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import smtplib
    import string
    HOST = "smtp.139.com" #定义smtp主机
    SUBJECT = "test" #定义邮件主题
    TO = "404408853@qq.com" #定义邮件收件人
    FROM = "18801457794@139.com" #定义邮件发件人
    text = "python test mail" #邮件的内容
    BODY=string.join(( #组装sendmail方法的邮件主体内容,各段以" "进行分隔
      "From:%s" %FROM,
      "To:%s" %TO,
      "Subject:%s"%SUBJECT,
      "",
      text
    )," ")
        
    server = smtplib.SMTP() #创建一个SMTP对象
    server.connect(HOST,"25") #通过connect方法连接smtp主机
    server.starttls() #启动安全传输模式
    server.login("18801457794@139.com","123456") #邮件账户登录校验
    server.sendmail(FROM,TO,BODY) #邮件发送
    server.quit() #断开smtp连接

    执行这段代码,我们将受到一封邮件

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/usr/bin/env python
    #coding:utf-8
    import smtplib
    from email.mime.text import MIMEText #导入MIMEText类
    HOST = "smtp.139.com"
    SUBJECT = u"官网流量数据报表"
    TO = "404408853@qq.com"
    FROM = "18801457794@139.com"
    msg = MIMEText("""
      <table width="800" border="0" cellspacing="0" cellpadding="4">
        <tr>
          <td bgcolor="#CECFAD" height="20" style="font-size:14px">*官网数据<a href="monitor.domain.com">更多</a></td>
        </tr>
        <td bgcolor="#EFEBDE" height="100" style="font-size:13px">
        1)日访问量:<font color=read>152433</font>访问次数:23651 页面浏览量:45123 点击数:545122 数据流量:504Mb<br>
        2)状态码消息<br>
          500:105 404;3264 503;214<br>
        3)访客浏览器信息<br>
          IE:50% firefox:10% chrome:30% other:10%<br>
        4)页面信息<br>
          /index.php 42153<br>
          /view.php 21451<br>
        </td>
        </tr>
      </table>""","html","utf-8")
    msg['Subject'] = SUBJECT
    msg['FROM'] = FROM
    msg['To'] = TO
    try:
      server = smtplib.SMTP()
      server.connect(HOST,'25')
      server.starttls()
      server.login('18801457794@139.com','123456')
      server.sendmail(FROM,TO,msg.as_string())
      server.quit()
      print "邮件发送成功"
    except Exception,e:
      print "失败:" + str(e)

    运行代码结果如图,

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #!/usr/bin/env python
    #coding: utf-8
    import smtplib,string
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    HOST ="smtp.139.com" #定义smtp主机
    SUBJECT = "金美美平台系统状态报表" #定义邮件主题
    TO = "404408853@qq.com,302803690@qq.com" #定义邮件收件人
    FROM = "18801457794@139.com" #定义邮件发件人
    TO_list = TO.split(TO)
    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 #返回msgImage对象
      
    msg = MIMEMultipart('related') #创建MIMEMultipart对象,采用related定义内嵌资源的邮件体
    msgtext = MIMEText("""
    <table width="600" border="0" cellspacing="0" cellspacing="4">
      <tr bgcolor="#CECFAD" height="20" style="font-size:14px">
      <td colspan=2>以下是211.157.111.41系统状态图</td>
      </tr>
      <tr bgcolor="#EFEBDE" height="100" style="font-size:13px">
      <td>
      <img src="cid:io"></td><td>
      <img src="cid:load"></td>
      </tr>
      <tr bgcolor="#EFEBDE" height="100" style="font-size:13px">
      <td>
      <img src="cid:mem"></td><td>
      <img src="cid:disk"></td>
      </tr>
      </table>""","html","utf-8") #<img>标签的src属性是通过Content-ID来引用的
      
    msg.attach(msgtext) #MIMEMultipart对象附加MIMEText的内容
    msg.attach(addimg("img/bytes_io.png","io")) #使用MIMEMultipart对象附加MIMEImage的内容
    msg.attach(addimg("img/os_load.png","load"))
    msg.attach(addimg("img/os_mem.png","mem"))
    msg.attach(addimg("img/os_disk.png","disk"))
      
    msg['Subject'] = SUBJECT
    msg['FROM']=FROM
    msg['To'] = TO
    try:
      server = smtplib.SMTP()
      server.connect(HOST,"25")
      server.starttls()
      server.login('18801457794@139.com','123456')
      server.sendmail(FROM,TO_list,msg.as_string())
      server.quit()
      print "邮件发送成功!"
    except Exception,e:
      print "失败:"+ str(e)

    代码运行效果如图

  • 相关阅读:
    下午不想写代码了,写个shelve的模块使用(简单实用的小型数据库)。
    io,pickle,json,一把梭哈,把这三个模块都讲了。
    import 和 __import__的区别
    namedtuple工厂函数,创造一个像实例对象的元祖(感觉到了Python的奇妙与可爱之处)。
    写一下base64字节码转换工具。
    Python加密模块的hashlib,hmac模块介绍。
    简述Orderdict,defaultdcit,ChainMap以及MappingProxyType
    工作中碰到的小问题,如何对列表内的字典排序,以及operator.itemgetter介绍。
    最近在写一个虚拟币搬砖脚本,几条建议备注下。
    Python的re,正则表达式,希望这次比较能让我记住里面的80%以上。(未完成,待继续)
  • 原文地址:https://www.cnblogs.com/AmilyWilly/p/7203944.html
Copyright © 2020-2023  润新知