利用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 相关文章推荐
python3抓取中文网页的方法
Jul 28 Python
深入理解python try异常处理机制
Jun 01 Python
python3实现暴力穷举博客园密码
Jun 19 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
Jul 06 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
详解如何为eclipse安装合适版本的python插件pydev
Nov 04 Python
python flask框架实现重定向功能示例
Jul 02 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
Win10下python 2.7与python 3.7双环境安装教程图解
Oct 12 Python
Python多线程的退出控制实现
Aug 10 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 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中cookie和session的区别实例分析
2014/08/28 PHP
php实现的日历程序
2015/06/18 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
python3.4爬虫demo
2019/01/22 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
python处理“
2019/06/10 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
幼儿教育感言
2014/02/05 职场文书
高一化学教学反思
2014/02/05 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
平安建设工作方案
2014/06/02 职场文书
公民授权委托书
2014/10/15 职场文书
活动宣传稿范文
2015/07/23 职场文书