利用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使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
Python实现获取前100组勾股数的方法示例
May 04 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
python flask 如何修改默认端口号的方法步骤
Jul 12 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
python实现while循环打印星星的四种形状
Nov 23 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
pytorch 自定义参数不更新方式
Jan 06 Python
Python类和实例的属性机制原理详解
Mar 21 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
Jul 03 Python
简单了解Python字典copy与赋值的区别
Sep 16 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
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
使用Python的PEAK来适配协议的教程
2015/04/14 Python
Python中异常重试的解决方案详解
2017/05/05 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
Python读取表格类型文件代码实例
2020/02/17 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
教师岗位聘任书范文
2014/03/29 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
离婚协议书怎么写
2015/01/26 职场文书
OpenCV实现常见的四种图像几何变换
2022/04/01 Python