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