利用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 相关文章推荐
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
sublime python3 输入换行不结束的方法
Apr 19 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
python日期与时间戳的各种转换示例
Feb 12 Python
解决tensorflow读取本地MNITS_data失败的原因
Jun 22 Python
Python实现手势识别
Oct 21 Python
python安装第三方库如xlrd的方法
Oct 31 Python
python 爬虫如何实现百度翻译
Nov 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
第六节--访问属性和方法
2006/11/16 PHP
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
JS中的phototype详解
2017/02/04 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
python列表去重的二种方法
2014/02/14 Python
Python实现类继承实例
2014/07/04 Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
keras.layer.input()用法说明
2020/06/16 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
Linux的主要特性
2016/09/03 面试题
工商管理本科毕业生求职信范文
2013/10/05 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
Redis入门基础常用操作命令整理
2022/06/01 Redis