利用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远程桌面协议RDPY安装使用介绍
Apr 15 Python
介绍Python中的文档测试模块
Apr 28 Python
python如何为被装饰的函数保留元数据
Mar 21 Python
numpy中矩阵合并的实例
Jun 15 Python
python实现公司年会抽奖程序
Jan 22 Python
python实现蒙特卡罗方法教程
Jan 28 Python
深入浅析Python中的迭代器
Jun 04 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
python 用 xlwings 库 生成图表的操作方法
Dec 22 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
浅析Python中的随机采样和概率分布
Dec 06 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的access操作类
2008/04/09 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
javascript 定义新对象方法
2010/02/20 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
python中黄金分割法实现方法
2015/05/06 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
python 字符串只保留汉字的方法
2018/11/16 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
linux面试题参考答案(9)
2015/01/07 面试题
幼儿园教师个人反思
2014/01/30 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书