利用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抓taobao图片爬虫
Oct 26 Python
python传递参数方式小结
Apr 17 Python
Python中threading模块join函数用法实例分析
Jun 04 Python
详解在Python程序中自定义异常的方法
Oct 16 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
对numpy中向量式三目运算符详解
Oct 31 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
Puppeteer使用示例详解
Jun 20 Python
python:目标检测模型预测准确度计算方式(基于IoU)
Jan 18 Python
python代码中怎么换行
Jun 17 Python
python 利用zmail库发送邮件
Sep 11 Python
python实现图片转字符画的完整代码
Feb 21 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
新手入门常用代码集锦
2007/01/11 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
javascript读写json示例
2014/04/11 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
2018/10/09 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
Python FTP操作类代码分享
2014/05/13 Python
Python中的高级函数map/reduce使用实例
2015/04/13 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
Python简单基础小程序的实例代码
2019/04/28 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
HTML5拖拽文件到浏览器并实现文件上传下载功能代码
2013/06/06 HTML / CSS
游戏商店:Eneba
2020/04/25 全球购物
Linux中如何用命令创建目录
2016/12/02 面试题
建筑设计学生的自我评价
2014/01/16 职场文书
婚前协议书怎么写
2014/04/15 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server
详细介绍python类及类的用法
2021/05/31 Python
总结python多进程multiprocessing的相关知识
2021/06/29 Python
Java版 简易五子棋小游戏
2022/05/04 Java/Android