1435天前2018-10-25 11:34:57 |    抢沙发  748 
在运维中,运维脚本会有何种异常和业务处理异常,那么这些异常信息怎么才可以及时的通知到我们呢?自动发邮件通知我们是一个非常不错的选择。那么接下来请跟随静心一起来看一下python怎么利用smtplib模块发送smtp邮件吧。

mail

至于什么是smtp我就不讲了,我这里主要讲一下怎么使用第三方的smtp服务进行发邮件吧,因为这样比较省事儿,你也不用特意去自己搭建一个sendmail服务器。

利用第三方SMTP服务发邮件:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

#发送邮件
def send_mail(da):
  # 第三方 SMTP 服务
  mail_host="smtp.exmail.qq.com"  #设置服务器
  mail_user="username@32e.top"    #用户名
  mail_pass="password"   #口令
  sender = 'test@32e.top'    #发件箱地址,这个可以任意指定
  receivers = ['jinxin@32e.top']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
  #邮件正文
  message = MIMEText(da['content'], 'plain', 'utf-8')
  #邮件标题
  message['From'] = Header(da['title'], 'utf-8')
  #发件人名称
  message['To'] =  Header("系统通知邮件", 'utf-8')
  #副标题
  subject = da['chlid_title']
  message['Subject'] = Header(subject, 'utf-8')
  try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
    smtpObj.login(mail_user,mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    # print "邮件发送成功"
    f=file("./error.txt","a+")
    f.write(time.strftime("%Y-%m-%d %H:%M:%S")+" 邮件发送成功\r\n")
    f.close()
  except smtplib.SMTPException:
    # print "Error: 无法发送邮件"
    f=file("./error.txt","a+")
    f.write(time.strftime("%Y-%m-%d %H:%M:%S")+" 无法发送邮件\r\n")
    f.close()

#使用方法
mail_data = {
          "title":"我是邮件标题",
          "chlid_title":'我是邮件副标题...',
          "content":"我是邮件正文"
        }
send_mail(mail_data)
上面就是整个python发送邮件的整个函数以及调用过程,当然发送的邮件内容是txt纯文本的。

如果您需要发送html邮件的话也是很简单的,Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html

把上面代码中的:

message = MIMEText(da['content'], 'plain', 'utf-8')

改成:

message = MIMEText(da['content'], 'html', 'utf-8')
其他保持不变,这样发送出去的内容就是html格式的啦。

什么?你还想带附件?没问题请参考下面代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
 
sender = 'test@32e.top'
receivers = ['jinxing@32e.top']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
 
#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("我是邮件标题", 'utf-8')
message['To'] =  Header("我是发件人", 'utf-8')
subject = '我是副标题'
message['Subject'] = Header(subject, 'utf-8')
 
#邮件正文内容
message.attach(MIMEText('我是用python发送邮件的正文……', 'plain', 'utf-8'))
 
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)
 
# 构造附件2,传送当前目录下的 test2.txt 文件
att2 = MIMEText(open('test2.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="test2.txt"'
message.attach(att2)
 
try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"
解释:发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

对了这里再介绍一下在html邮件中怎么添加图片把,一般添加图片的方式有两种,一种是直接加外链图片,一种是直接把图片保存在邮件里面。我这里介绍后者。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
 
sender = 'test@32e.top'
receivers = ['jingxin@32e.top']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
 
msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("我是邮件标题", 'utf-8')
msgRoot['To'] =  Header("我是发件人名称", 'utf-8')
subject = '我是邮件标题'
msgRoot['Subject'] = Header(subject, 'utf-8')
 
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)
 
 
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="https://www.32e.top">博文家链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))
 
# 指定图片为当前目录
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
 
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)
 
try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, msgRoot.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"
好了python发送邮件就介绍到这里哦,希望对您有所帮助。


发表评论

暂无评论

登录

忘记密码 ?

切换登录

注册

扫一扫二维码分享