首页 > 编程 > Python > 正文

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

2019-11-25 15:28:45
字体:
来源:转载
供稿:网友

脚本过于简单,供学习和参考。主要了解一下smtplib库的使用和超时机制的实现。使用signal.alarm实现超时机制。

#!/usr/bin/env python# -*- coding: utf-8 -*-import timeimport sysimport loggingimport smtplibimport socket import signalimport ConfigParserfrom datetime import datetimefrom email import encodersfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.utils import parseaddr, formataddrCONF_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 emailtesteb = emailtest.EmailObject("******@******.com","test content")eb.send_email()tips:increase timeout:  eb.timeout = 10increase 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实现简单的邮件发送客户端示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表