利用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实现的文件夹清理程序分享
Nov 22 Python
Python随机生成带特殊字符的密码
Mar 02 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
python机器学习之贝叶斯分类
Mar 26 Python
使用pandas read_table读取csv文件的方法
Jul 04 Python
python使用matplotlib绘制热图
Nov 07 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
python提取照片坐标信息的实例代码
Aug 14 Python
python第三方库学习笔记
Feb 07 Python
python按照list中字典的某key去重的示例代码
Oct 13 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 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+javascript模拟Matrix画面
2006/10/09 PHP
PHP令牌 Token改进版
2008/07/18 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
jquery创建div 实现代码
2009/04/27 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
Python中字符编码简介、方法及使用建议
2015/01/08 Python
python3.x实现base64加密和解密
2019/03/28 Python
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
学前教育教师求职自荐信
2013/09/22 职场文书
国贸专业个人求职信分享
2013/12/04 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
董事长秘书工作职责
2014/06/10 职场文书
前台岗位职责
2015/02/13 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
刑事附带民事代理词
2015/05/25 职场文书
时尚女魔头观后感
2015/06/04 职场文书
安全主题班会教案
2015/08/12 职场文书
小学总务工作总结
2015/08/13 职场文书
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
oracle数据库去除重复数据
2022/05/20 Oracle