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

Ejemplo de cliente de envío de correo electrónico simple utilizando python

El script es demasiado simple, proporciona información para el aprendizaje y la referencia. Principalmente, se aprende sobre el uso de la biblioteca smtplib y la implementación del mecanismo de tiempo de espera. Se utiliza signal.alarm para implementar el mecanismo de tiempo de espera.

#!/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 alert"
    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 have 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("Cambio de servidor a {}".format(self.cpl[0]))
      self.send_email()
    else:
      logging.warning("No se pudo usar ningún servidor, intente configurar más servidores (actualmente es {}) o aumentar el tiempo de espera [{}]!".format(self.cp.sections(), self.timeout))
      exit()
  def send_email(self):
    # Manejo de señal  
    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("¡Correo electrónico enviado con éxito! De:[{}], A:[{}], Contenido:[{}]".format(from_addr, to_addr, self.content))
      server.quit()
      exit()
    except AssertionError:
      self.retry -= 1
      logging.info("Comienza a reenviar el correo electrónico por la {}ª vez".format(3-self.retry))
      self.send_email()
    except smtplib.SMTPAuthenticationError,e:
      logging.error("Autenticación de servidor [{}] fallida".format(smtp_server))
      self._change_server()
'''
ejemplo:
from emailtest import emailtest
eb = emailtest.EmailObject("******@******.com,"contenido de prueba")
eb.send_email()
consejos:
aumentar timeout:
  eb.timeout = 10
aumentar veces de retry:
  eb.retry = 5
'''

A continuación, se muestra un ejemplo de archivo de configuración:

[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

La siguiente ejemplo de cliente de envío de correo simple implementado en Python que comparto con todos ustedes es todo el contenido que tengo. Espero que les sea útil como referencia y espero que todos den más apoyo a la tutoría de gritos.

Te gustará