利用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实现的破解字符串找茬游戏算法示例
Sep 25 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
python中eval与int的区别浅析
Aug 11 Python
Python 实现opencv所使用的图片格式与 base64 转换
Jan 09 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
公认8个效率最高的爬虫框架
Jul 28 Python
python hmac模块验证客户端的合法性
Nov 07 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
python对输出的奇数偶数排序实例代码
Dec 04 Python
python中的列表和元组区别分析
Dec 30 Python
python实现批量提取指定文件夹下同类型文件
Apr 05 Python
粗暴解决CUDA out of memory的问题
May 22 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 批量删除数据的方法分析
2009/10/30 PHP
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
提高php编程效率技巧
2015/08/13 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
PHP中16个高危函数整理
2019/09/19 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
机修工岗位职责
2013/11/24 职场文书
毕业生大学生活自我总结
2014/01/31 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
酒店节能降耗方案
2014/05/08 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
一年级小学生评语大全
2014/12/25 职场文书
客房部经理岗位职责
2015/02/02 职场文书
教师工作决心书
2015/02/04 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书