English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Einfaches Beispiel eines E-Mail-Client-Clients mit Python implementieren

Der Skript ist zu einfach und dient zur Lern- und Referenzzwecken. Es wird hauptsächlich die Verwendung der smtplib-Bibliothek und die Implementierung des Timeout-Mechanismus verstanden. Der Timeout-Mechanismus wird mit signal.alarm implementiert.

#!/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 Warnung"
    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 und diese Funktion aufgerufen wird, bedeutet das, dass alle Server ausprobiert wurden
    if(len(self.cpl) > 1) :
      self.cpl.pop(0)
      self.retry = 3
      self.conf = dict(self.cp.items(self.cpl[0]))
      logging.info("Server geändert auf {}".format(self.cpl[0]))
      self.send_email()
    else:
      logging.warning("Kein Server konnte verwendet werden,versuchen Sie mehr Server zu konfigurieren(now is {}) oder die Timeout-Zeit zu erhöhen [{}]!".format(self.cp.sections(),self.timeout))
      exit()
  def send_email(self):
    # Signalbehandlung  
    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("E-Mail erfolgreich gesendet!Von:[{}],An:[{}],Inhalt:[{}]".format(from_addr,to_addr,self.content))
      server.quit()
      exit()
    except AssertionError:
      self.retry -= 1
      logging.info("Beginne mit dem Wiedersenden von E-Mails für das {}te Mal".format(3-self.retry))
      self.send_email()
    except smtplib.SMTPAuthenticationError,e:
      logging.error("Server [{}] Authentifizierung fehlgeschlagen".format(smtp_server))
      self._change_server()
'''
Beispiel:
von emailtest import emailtest
eb = emailtest.EmailObject("******@******.com,"test content")
eb.send_email()
Hinweis:
Erhöhen Sie die Timeout-Zeit:
  eb.timeout = 10
Erhöhen Sie die Anzahl der Wiederholungen:
  eb.retry = 5
'''

Die Konfigurationsdatei ist wie folgt:

[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

Dieses Beispiel eines einfachen E-Mail-Client-Programms, das mit Python implementiert wurde, ist alles, was der Herausgeber Ihnen mitteilen möchte. Es wird hoffentlich eine Referenz für Sie sein, und wir hoffen, dass Sie die Anleitung weiterempfehlen.

Gefällt mir