利用python实现简单的邮件发送客户端示例


Posted in Python onDecember 23, 2017

脚本过于简单,供学习和参考。主要了解一下smtplib库的使用和超时机制的实现。使用signal.alarm实现超时机制。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import sys
import logging
import smtplib
import socket 
import signal
import ConfigParser
from datetime import datetime
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

CONF_PATH = "/etc/zabbix/alarm_email.conf"
logging.basicConfig(level=logging.INFO,
          format='%(asctime)s [%(levelname)s]: %(message)s',
          filename='/var/log/zabbix/send_alarm_email.log')
class EmailObject:
  def __init__(self,to_addr,content):
    self.timeout = 10
    self.retry = 3
    self.cp = self._parse_config()
    self.cpl = self._parse_config().sections()
    self.conf = dict(self.cp.items(self.cpl[0])) 
    # common how to use one
    self.to_addr = to_addr
    self.content = content
  # get ConfigParser,for section selection
  def _parse_config(self):
    cp = ConfigParser.ConfigParser()
    cp.read(CONF_PATH)
    return cp
  # set base config
  def _conf_parse(self):
    self.subject = "zabbix告警"
    self.from_addr = self.conf["from_addr"]
    self.password = self.conf["password"]
    self.smtp_server = self.conf["smtp_server"]
  def _msg_parse(self):
    #msg = self.content.split("*")
    #state = "alarm" if msg[0] == "PROBLEM" else "ok"
    #severity = msg[1]
    #head_time = map(int,msg[2].split("."))
    #tail_time = map(int,msg[3].split(":"))
    ## if not host?
    #event_type = "host." + msg[4]
    #reason = msg[5].replace("_"," ")
    #alarm_id = int(msg[6])
    #message = msg
    return self.content
  def _change_server(self):
    # if len = 1 and this fun is called,means that all servers hava been tried
    if(len(self.cpl) > 1):
      self.cpl.pop(0)
      self.retry = 3
      self.conf = dict(self.cp.items(self.cpl[0]))
      logging.info("Change server to {}".format(self.cpl[0]))
      self.send_email()
    else:
      logging.warning("No server could be used,try to config more server(now is {}) or increase the timeout [{}]!".format(self.cp.sections(),self.timeout))
      exit()
 
  def send_email(self):
    # signal handle  
    def handler(signum,frame):
      if self.retry > 0:
        raise AssertionError
      else:
        self._change_server()
    self._conf_parse()
    from_addr = self.from_addr 
    password = self.password
    smtp_server = self.smtp_server
    timeout = self.timeout
    to_addr = self.to_addr
    msg = MIMEText(self.content,'plain','utf-8')
    msg['Subject'] = Header(self.subject, 'utf-8')
    msg['From'] = 'AlarmEmail'+'<'+from_addr+'>'  
    msg['To'] = "******@******.com"
    
    try:
      signal.signal(signal.SIGALRM,handler)
      signal.alarm(timeout)
      server = smtplib.SMTP_SSL(smtp_server,465)
      server.login(from_addr, password)
      server.sendmail(from_addr,to_addr, msg.as_string())
      logging.info("Send email successfully!From:[{}],To:[{}],Content:[{}]".format(from_addr,to_addr,self.content))
      server.quit()
      exit()
    except AssertionError:
      self.retry -= 1
      logging.info("Begin to resend email for the {}th times".format(3-self.retry))
      self.send_email()
    except smtplib.SMTPAuthenticationError,e:
      logging.error("Server [{}] authentication failed".format(smtp_server))
      self._change_server()
'''
example:
from emailtest import emailtest

eb = emailtest.EmailObject("******@******.com","test content")
eb.send_email()
tips:
increase timeout:
  eb.timeout = 10
increase retry times:
  eb.retry = 5
'''

配置文件参考如下:

[default]
from_addr = ******@******.com
password = ******
smtp_server = smtp.******.com
[163]
from_addr = ******@163.com
password = ******
smtp_server = smtp.163.com
[qq]
from_addr = ******@qq.com
password = ******
smtp_server = smtp.qq.com

以上这篇利用python实现简单的邮件发送客户端示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用BeautifulSoup库解析HTML基本使用教程
Mar 31 Python
Python 对象中的数据类型
May 13 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 Python
Python开发简易五子棋小游戏
May 02 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 #Python
python的numpy模块安装不成功简单解决方法总结
Dec 23 #Python
windows 下python+numpy安装实用教程
Dec 23 #Python
Python实现字典的遍历与排序功能示例
Dec 23 #Python
Python实现字典按照value进行排序的方法分析
Dec 23 #Python
Python使用Matplotlib实现雨点图动画效果的方法
Dec 23 #Python
简单了解什么是神经网络
Dec 23 #Python
You might like
分享一个PHP数据流应用的简单例子
2012/06/01 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
js自定义事件代码说明
2011/01/31 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
Python中字典的setdefault()方法教程
2017/02/07 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
Python3离线安装Requests模块问题
2019/10/13 Python
Python创建数字列表的示例
2019/11/28 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
会计专业毕业生自荐书
2014/06/25 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
python编程实现清理微信重复缓存文件
2021/11/01 Python