利用python实现简单的邮件发送客户端示例

 更新时间:2017年12月23日 22:23:27   投稿:jingxian  
下面小编就为大家分享一篇利用python实现简单的邮件发送客户端示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

脚本过于简单,供学习和参考。主要了解一下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实现简单的邮件发送客户端示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 机器学习10大经典算法详解

    机器学习10大经典算法详解

    这篇文章主要为大家详细介绍了机器学习10大经典算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 使用Python 统计文件夹内所有pdf页数的小工具

    使用Python 统计文件夹内所有pdf页数的小工具

    这篇文章主要介绍了Python 统计文件夹内所有pdf页数的小工具,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 一文掌握python中的时间包

    一文掌握python中的时间包

    这篇文章主要介绍了python中的时间包,主要包括datetime时间包,获取当前时间,获取时间间隔及时间对象转时间字符串的相关知识,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 详解python数据结构之队列Queue

    详解python数据结构之队列Queue

    这篇文章主要介绍了python数据结构之队列Queue,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • Python实现字符串反转的9种方法(最全)

    Python实现字符串反转的9种方法(最全)

    本文主要介绍了Python实现字符串反转的9种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Matplotlib绘图基础之画布详解

    Matplotlib绘图基础之画布详解

    Matplotlib 库是一个用于数据可视化和绘图的 Python 库,这篇文章主要为大家介绍了下Matplotlib绘制的图形中的第一个重要的元素--画布,感兴趣的可以了解下
    2023-07-07
  • python中类的相互调用的实践

    python中类的相互调用的实践

    本文主要介绍了python中类的相互调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python 随机生成10位数密码的实现代码

    python 随机生成10位数密码的实现代码

    这篇文章主要介绍了python 随机生成10位数密码的实现代码,在文中给大家提到了生成随机密码要实现的功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • 利用python对mysql表做全局模糊搜索并分页实例

    利用python对mysql表做全局模糊搜索并分页实例

    这篇文章主要介绍了利用python对mysql表做全局模糊搜索并分页实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python机器学习之基于Pytorch实现猫狗分类

    Python机器学习之基于Pytorch实现猫狗分类

    看了许多关于PyTorch的入门文章,大抵是从torchvision.datasets中自带的数据集进行训练,导致很难把PyTorch运用于自己的数据集上,真正地灵活运用PyTorch,本文详细介绍了怎么利用Pytorch实现猫狗分类,需要的朋友可以参考下
    2021-06-06

最新评论