利用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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
Python中特殊函数集锦
Jul 27 Python
Python实现 多进程导入CSV数据到 MySQL
Feb 26 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
Python3 模块、包调用&amp;路径详解
Oct 25 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
python的slice notation的特殊用法详解
Dec 27 Python
pytorch 求网络模型参数实例
Dec 30 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
Django执行源生mysql语句实现过程解析
Nov 12 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
开源SNS系统-ThinkSNS
2008/05/18 PHP
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
Vue.use源码分析
2017/04/22 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
Python 描述符(Descriptor)入门
2016/11/20 Python
python与php实现分割文件代码
2017/03/06 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Python如何获取文件路径/目录
2020/09/22 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
教师找工作推荐信
2013/11/23 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
安全标准化实施方案
2014/02/20 职场文书
技术合作协议书范本
2014/04/18 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
个人承诺书格式
2014/06/03 职场文书
安全负责人任命书
2014/06/06 职场文书
购房个人委托书范本
2014/10/11 职场文书
初中团支书竞选稿
2015/11/21 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书