利用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中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
python使用__slots__让你的代码更加节省内存
Sep 05 Python
Python基础之文件读取的讲解
Feb 16 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
Python流程控制 while循环实现解析
Sep 02 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 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的面试题集
2006/11/19 PHP
PHP 加密解密内部算法
2010/04/22 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
详解vue添加删除元素的方法
2018/06/30 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
Vue父子传递实例讲解
2020/02/14 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
Python中获取网页状态码的两个方法
2014/11/03 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
Django实现跨域的2种方法
2019/07/31 Python
Python测试模块doctest使用解析
2019/08/10 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
管理学专业个人求职信范文
2013/12/13 职场文书
家长给老师的道歉信
2014/01/13 职场文书
有创意的广告词
2014/03/18 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
5道关于python基础 while循环练习题
2021/11/27 Python
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技