2.3 发送电子邮件模块 smtplib

2.3 发送电子邮件模块 smtplib

电子邮件是最流行的互联网应用之一,在系统管理领域,我们常常使用邮件来发送告警信息,业务质量报表等,方便运维人员第一时间了解业务的服务状态,本节通过Python的smtplib模块来实现邮件的发送功能,模拟一个smtp客户端,通过与smtp服务器交互来实现邮件发送的功能,这可以理解成Foxmail的发邮件功能,在第一次使用之前我们需要配置smtp主机地址,邮箱账号及密码等信息,默认自带smtplib模块,无需额外安装

2.3.1 smtplib模块的常用类与方法

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@163com","demo@domail.com",body),其中body内容定义如下:
"""From: python_2014@163.com
To: demo@domail.com
Subject: test mail
test mail body"""
SMTP.starttls([keyfile[,certfile]])方法,启用TLS(安全传输)模式,所有SMTP指令都将加密传输,例如使用gmail的smtp服务时需要开启此项才能正常发送邮件,如SMTP.starttls()
SMTP.quit()方法,断开smtp服务器的连接

下面通过一个简单示例帮助大家理解,目的是使用163邮箱向qq邮箱发送测试邮件,代码如下:

[root@mankel ~] vim test-11-26.py
#!/usr/bin/python3
import smtplib

HOST = "smtp.163.com"
SUBJECT = "Test email from Python"
TO = "xxx@qq.com"
FROM = "xxx@163.com"
text = "python rules them all!"
BODY = '\r\n'.join([
    "From: %s" % FROM,
    "TO: %s" % TO,
    "Subject: %s" % SUBJECT,
    "",
    text])
server = smtplib.SMTP()
server.connect(HOST,"25")
server.starttls()
server.login("xxx@163.com","smtp授权码")
server.sendmail(FROM,[TO],BODY)
server.quit()

我们将收到一封这样的邮件:
在这里插入图片描述

2.3.2 定制个性化的邮件格式方式

通过邮件传输简单的文本已经无法满足我们的需求,比如我们时常会定制业务质量报表,在邮件主体中会包含HTML,图像,声音以及附件格式等,下面介绍几个python中常用的MIME实现类:

1).email.mime.multipart.MIMEMultipart([_subtype[,bounday[,_subparts[,_params]]]]),作用是生成包含多个部分的邮件体的MIME对象,参数_sbutype指定要添加到"Content-type:multipart/sbutype"报头的可选的三种子类型,分别为mixed,related,alternative,默认值为mixed,定义mixed实现构建一个带附件的邮件体;定义relatef实现构建内嵌资源的邮件体;定义alternative则实现构建纯文本与超文本共存的邮件体
2).email.mime.audio.MIMEAudio(_audiodata[,_subtype[,_encoder[,_params]]]),创建包含音频文件数据的邮件体,_audiodata包含原始二进制音频数据的字节字符串
3).email.mime.image.MIMEImage(_imagedata[,_subtype[,_encoder[,
_params]]]),创建包含图片数据的邮件体,_imagedata是包含原始图片数据的字节字符串
4).email.mime.text.MIMEText(_text[,_subtype[,_charset]]),创建包含文本数据的邮件体,_text是包含消息负载的字符串,_subtype指定文本类型,支持plain(默认值)或HTML类型的字符串

2.3.3 定制常用邮件格式示例详解

前面两个小节接扫了Python的smtplib和email模块的常用方法,那么两者在邮件定制到发送过程中是如何分工的?我们可以将email.mime理解成smtplib模块邮件内容主体的扩展,从原先默认只支持纯文本格式扩展到HTML,同时支持附件,音频,图像等格式,smtplib只负责邮件的投递即可,下面介绍在日常运营工作中邮件应用的几个示例

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

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

#!/use/bin/python3
import smtplib
from email.mime.text import MIMEText  #导入MIMEText类

HOST = "smtp.163.com"    #定义SMTP主机
SUBJECT = u"官网流量数据报表"  #定义邮件主题
TO = "xxx@qq.com"   #定义邮件接收人
FROM = "xxx@163.com"  #定义邮件发件人
msg = MIMEText("""   #创建一个MIMEText对象,分别指定HTML内容,类型,字符编码
        <table width="800" border="0" cellspacing="0" cellpadding="4">
          <tr>
            <td bgcolor="#CECFAD" hight="20" style="font=size:140px">*官网数据 <a href="monitor.domain.com">更多>></a></td>
          </tr>
          <tr>
            <td bgcolor="#EFEBDE" height="100" style="font-size:13px">
            1)日访问量:<font color=red>152433</font> 访问次数:23651  页面浏览量:45123 点击数:545122 数据流量:504Mb<br>
            2)状态码信息<br>
            &nbsp;&nbsp;500:105  404:3364 503:214<br>
            3)访客浏览器信息<br>
            &nbsp;&nbsp;ID: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("xxxx@163.com","smtp授权码")  #邮箱账号登录校验,这里提供授权码
    server.sendmail(FROM,TO,msg.as_string())
    server.quit()
    print("邮件发送成功")
except Exception as e:
    print("失败:"+str(e))

代码运行如下,将业务日志分析结果定期推送给管理员,以方便管理员了解业务的服务情况
在这里插入图片描述

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

示例1通过MIMEText类来实现HTML格式的邮件,当要求包含图片数据的邮件内容时,需要引用MIMEImage类来进行组装,本示例通过MIMEText与MIMEImage类的组合来实现图文格式的服务器性能报表邮件的定制,实现代码如下:

#!/use/bin/python3
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 = "xxxx@qq.com"   #定义邮件收件人
FROM = "xxxx@163.com"  #定义邮件发件人

def addimg(src,imgid):   #添加图片函数,参数一:图片路径,参数二:图片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("""   #创建一个MIMEText对象,HTML元素包括表格<table>及图片<img>
    <table width="600" border="0" cellspacing="0" cellpadding="4">
      <tr bgcolor="#CECFAD" height="20" style="font-size:14px">
        <td colspan=2>*官网性能数据 <a href="monitor.domain.com">更多>></a></td>
      </tr>
      <tr bgcolor="#EFEBDE" height="100" style="font-size:13px">
        <td>
        <img src="cid:io"></td><td>
        <img src="cid:cpu"></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/io.png","io"))  #使用MIMEMultipart对象附加MIMEImage的内容
msg.attach(addimg("img/cpu.png","cpu"))
msg.attach(addimg("img/mem.png","mem"))
msg.attach(addimg("img/disk.png","disk"))
msg['Subject'] = SUBJECT   #邮件主题
msg['FROM'] = FROM   #邮件发件人,邮件头可见
msg['TO'] = TO   #邮件收件人,邮件头可见
try:
    server = smtplib.SMTP()   #创建一个SMTP对象
    server.connect(HOST,"25")  #通过connect方法连接smtp主机
    server.starttls()   #启动安全传输模式
    server.login("xxxx@163.com","smtp授权码")  #邮箱账号登录校验
    server.sendmail(FROM,TO,msg.as_string())  #邮件发送
    server.quit()  #断开smtp连接
    print("邮件发送成功")
except Exception as e:
        print("失败:"+str(e))

代码运行如下图所示,将业务服务器性能数据定期推送给管理员,以方便管理员了解业务的服务情况
在这里插入图片描述

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

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

#!/usr/bin/python3
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.header import Header  #国际化标题
from email.mime.base import MIMEBase  #表示任意对象
from email import encoders     #邮箱编码器

HOST = "smtp.163.com"     #定义smtp主机
SUBJECT = u"官网业务服务质量周报"  #定义邮件主题
TO = "xxx@qq.com"    #定义邮件接收人
FROM = "xxx@163.com"  #定义邮件发件人

def addimg(src,imgid):  #添加图片函数,参数1:图片路径;参数2:图片id
    fp = open(src,'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
    msgImage.add_header('content-ID',imgid)  #指定图片文件的content-ID,<img>标签src用到
    return msgImage

msg = MIMEMultipart('related')   #创建MIMEMultipart对象,采用related定义内嵌资源的邮件体

#创建一个MIMEText对象,HTML元素包括文字与图片<img>
msgtext = MIMEText("<font color=red>官网业务周平均延时图表:<br><img src=\"cid:weekly\" border=\"1\"><br>详细内容见附件。</font>","html","utf-8")
msg.attach(msgtext)   #对象附加MIMEText的内容
msg.attach(addimg("img/test.png","weekly")) #使用MIMEMultipart对象附加MIMEImage的内容

#创建一个MIMEText对象,附加test,xlsx文档
att1 = MIMEBase("application", "octet-stream")  
att1.set_payload(open("doc/test.xlsx","rb").read())
#设置编码格式,附件重命名成:业务服务质量周报(12周).xlsx
att1.add_header("Content-Disposition","attachment",filename=Header("业务服务质量周报(12周).xlsx").encode())
encoders.encode_base64(att1)

msg.attach(att1)   #MIMEMultipart对象附加MIMEText附件内容
msg['Subject'] = SUBJECT  #邮件主题
msg['FROM'] = FROM   #邮件发件人
msg['TO'] = TO   #邮件收件人
try:
    server = smtplib.SMTP()  #创建一个SMTP对象
    server.connect(HOST,"25")   #通过connect方法连接smtp主机
    server.starttls()   #启动安全传输模式
    server.login("xxx@163.com","smtp授权码")  #邮件账号登录校验
    server.sendmail(FROM,TO,msg.as_string())  #邮件发送
    server.quit()
    print("邮件发送成功")
except Exception as e:
    print("失败:"+str(e))

代码运行如下所示,实现了发送业务服务质量周报的邮件功能
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 导入smtplib模块和MIME模块 ```python import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication ``` 2. 设置发件人、收件人、主题和正文 ```python sender = '发件人邮箱地址' receiver = '收件人邮箱地址' subject = '邮件主题' body = '邮件正文' ``` 3. 创建MIMEMultipart对象并设置发件人、收件人和主题 ```python message = MIMEMultipart() message['From'] = sender message['To'] = receiver message['Subject'] = subject ``` 4. 创建MIMEText对象并设置正文 ```python text = MIMEText(body) message.attach(text) ``` 5. 创建MIMEApplication对象并设置附件 ```python with open('附件文件路径', 'rb') as f: attachment = MIMEApplication(f.read(), _subtype='pdf') attachment.add_header('Content-Disposition', 'attachment', filename='附件文件名.pdf') message.attach(attachment) ``` 6. 连接SMTP服务器并登录,发送邮件 ```python smtp_server = 'SMTP服务器地址' smtp_port = 25 # SMTP服务器端口号 smtp_user = 'SMTP服务器用户名' smtp_password = 'SMTP服务器密码' smtp = smtplib.SMTP(smtp_server, smtp_port) smtp.login(smtp_user, smtp_password) smtp.sendmail(sender, receiver, message.as_string()) smtp.quit() ``` 完整代码示例: ```python import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication sender = '发件人邮箱地址' receiver = '收件人邮箱地址' subject = '邮件主题' body = '邮件正文' message = MIMEMultipart() message['From'] = sender message['To'] = receiver message['Subject'] = subject text = MIMEText(body) message.attach(text) with open('附件文件路径', 'rb') as f: attachment = MIMEApplication(f.read(), _subtype='pdf') attachment.add_header('Content-Disposition', 'attachment', filename='附件文件名.pdf') message.attach(attachment) smtp_server = 'SMTP服务器地址' smtp_port = 25 # SMTP服务器端口号 smtp_user = 'SMTP服务器用户名' smtp_password = 'SMTP服务器密码' smtp = smtplib.SMTP(smtp_server, smtp_port) smtp.login(smtp_user, smtp_password) smtp.sendmail(sender, receiver, message.as_string()) smtp.quit() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值