利用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 13 Python
python基础知识小结之集合
Nov 25 Python
Python3 中把txt数据文件读入到矩阵中的方法
Apr 27 Python
Python中的单继承与多继承实例分析
May 10 Python
python实现屏保计时器的示例代码
Aug 08 Python
PYQT5实现控制台显示功能的方法
Jun 25 Python
python调试神器PySnooper的使用
Jul 03 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
Python参数传递实现过程及原理详解
May 14 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 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数据库密码的找回的步骤
2011/01/12 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
php微信公众号开发之简答题
2018/10/20 PHP
javascript引用对象的方法代码
2007/08/13 Javascript
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
Django分页功能的实现代码详解
2019/07/29 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
keras slice layer 层实现方式
2020/06/11 Python
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
师范应届生语文教师求职信
2013/10/29 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
优秀教师工作感言
2014/02/16 职场文书
大学共青团员个人自我评价
2014/04/16 职场文书
2015大学生求职信范文
2015/03/20 职场文书
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python
Java数组详细介绍及相关工具类
2022/04/14 Java/Android
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers