利用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 相关文章推荐
django批量导入xml数据
Oct 16 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 Python
Django实现表单验证
Sep 08 Python
对Python中Iterator和Iterable的区别详解
Oct 18 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
python列表生成器迭代器实例解析
Dec 19 Python
django中related_name的用法说明
May 20 Python
为什么称python为胶水语言
Jun 16 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 Python
python正则表达式re.search()的基本使用教程
May 21 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 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生成EXCEL的东东
2006/10/09 PHP
php中设置多级目录session的问题
2011/08/08 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
php自动加载代码实例详解
2021/02/26 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
GreyBox技术总结(转)
2010/11/23 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
2013/04/01 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
Python读取mp3中ID3信息的方法
2015/03/05 Python
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
python实现随机漫步方法和原理
2019/06/10 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
商场总经理岗位职责
2014/02/03 职场文书
课程改革实施方案
2014/03/16 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
党员演讲稿
2014/09/04 职场文书
单位工作证明
2014/10/07 职场文书
行政助理岗位职责
2015/02/10 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书
Jsonp劫持学习
2021/04/01 PHP
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript