利用python实现简单的邮件发送客户端示例
作者:jingxian 发布时间:2022-06-19 18:25:07
标签: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
来源:http://blog.csdn.net/u012013290/article/details/78867506
0
投稿
猜你喜欢
- 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
- 介绍 append()语法list.append( element )参数element:任何类型的元素列表「末尾」添加元素nam
- Python中进行Base64编码和解码要用base64模块,代码示例:#-*- coding: utf-8 -*-import base6
- 用途:将UTF-8编码汉字转换为GB2312码,兼容英文和数字版权:虽说是原创,其实也参考了別人的部分算法asp源代码:<% 
- 本文实例为大家分享了python实现大文本文件分割的具体代码,供大家参考,具体内容如下开发环境Python 2实现效果通过文件拖拽或文件路径
- 需要先装pywin32,windows下调用winapi的接口## _*_ coding:UTF-8 _*___author__ =
- 本书的作者Douglas Crockford是JavaScript开发社区最知名的权威,JavaScript的发明人Brendan Eich
- 初学tensorflow,如果写的不对的,请更正,谢谢!tf.reshape(tensor, shape, name=None)函数的作用是
- 本文实例为大家分享了Python实现名片管理系统的具体代码,供大家参考,具体内容如下目标综合应用已经学习过的知识点:变量流程控制函数模块系统
- 需要在两个文件中实现:首先,在talker.asp(在线名单)中做如下处理:<%p1=trim(application("v
- 来与大家分享。稍加改造就可以实现更强大的功能了。用下面的代码就可以简单的批量导出picasa相册的外链了。代码如下:<%@LANGUA
- 本文实例讲述了Python实现抓取HTML网页并以PDF文件形式保存的方法。分享给大家供大家参考,具体如下:一、前言今天介绍将HTML网页抓
- 在pytorch框架中,关于日志的保存,其中一种方式就是借鉴使用了tensorboard的库。所以我们需要在环境中安装tensorboard
- 上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围
- 效果如下所示简介在当今信息时代,金融市场是一个引人注目的话题。作为普通人,我们也可以通过使用 Python 和 wxPython 库编写一个
- 在读取文件时候比如读取 xxx.csv 时候 可能报编码错误类似于'xxx' codec can't decode
- reflect反射首先,我们要区分两个概念——“标识名”和&
- 本文实例讲述了php7 图形用户界面GUI 开发。分享给大家供大家参考,具体如下:一、下载指定系统扩展http://pecl.php.net
- 1、异常简介从软件方面来说,错误是语法或是逻辑上的,当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了
- 可以用函数 json.dumps()将 Python 对象编码转换为字符串形式。例如:import json python_obj = [[