python实现邮件客户端_利用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'+''

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,msg.as_string())

logging.info("Send email successfully!From:[{}],To:[{}],Content:[{}]".format(from_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

以上这篇利用python实现简单的邮件发送客户端示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xml--Schema约束

<?xml version"1.0" encoding"UTF-8"?> <!-- xmlns: xml namespace&#xff1a;名称空间/ 命名空间 targeNamespace&#xff1a;目标名称空间&#xff0c;下面定义的那些元素都与这个名称空间绑定上 elementFormDefault&#xff1a; 元素的格式…

js中实现页面跳转(返回前一页、后一页)

一&#xff1a;JS 重载页面&#xff0c;本地刷新,返回上一页 代码如下:<a href"javascript:history.go(-1)">返回上一页</a> <a href"javascript:location.reload()">重载页面&#xff0c;本地刷新</a> <a href"javascri…

stm32 文件系统dma大小_STM32 DMA使用详解

DMA部分我用到的相对简单&#xff0c;当然&#xff0c;可能这是新东西&#xff0c;我暂时还用不到它的复杂功能吧。下面用问答的形式表达我的思路。DMA有什么用&#xff1f;直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预&…

管理计算机域内置账户改为用户账户,“管理计算机(域)的内置帐户”我给它改了名...

在Windows XP中&#xff0c;Administrator帐户是终极管理员&#xff0c;如果你创建了其他管理员帐户&#xff0c;那么该帐户就会从欢迎屏幕上被隐藏。这里需要注意的是&#xff0c;仅仅是从欢迎屏幕上被隐藏&#xff0c;该帐户仍然存在。如果你仍然需要使用这个帐户&#xff0c…

程序架构--BS,CS

程序架构 C/S(client/server) QQ 微信 LOL 优点&#xff1a;有一部分代码写在客户端&#xff0c;用户体验比较好 缺点&#xff1a;服务器更新&#xff0c;客户端也随着更新&#xff0c;占用资源大 B/S(browser/server) 网页游戏&#xff1a;WebQQ ... 优点&#xff1a;客…

被称为“第五代 AI”的神经形态计算进展到哪一步了?

来源&#xff1a;北京物联网智能技术应用协会AI可以像人脑一样运作吗&#xff1f;几十年来&#xff0c;研究人员一直在问这个问题&#xff0c;这个大家长期求索的问题引起了质疑、嘲笑、轻蔑等不同态度。但是现在&#xff0c;神经形态计算让世界变得更美好的梦想更近了一些。当…

AngularJS学习笔记(一)

一.基本指令 1、ng-app" " 指令初始化一个 AngularJS 应用程序,定义angularJS的使用范围;tips:一个页面里创建多个 ng-app 手动加载即可:var app1 angular.module("app1", []); var app2 angular.module("app2", []); angular.bootstrap(docum…

oc 画一个圆弧_UG建模一个蜗杆的方法,纯手工建模无插件

上次我们画了一个蜗杆&#xff0c;今天就来建模一个涡轮模型&#xff0c;也是非常简单。这次还是无尺寸的随意建模&#xff0c;做出这么一个涡轮&#xff0c;来看看建模方法吧&#xff01;1 首先在XY平面上绘制一个直径100的圆&#xff0c;上下拉伸10mm2 对圆柱上下面倒斜角3mm…

计算机基本网络测试命令实验报告,网络连通性测试与网络命令验证实验报告

网络连通性测试与网络命令验证实验报告西工大计算机网络原理实验报告网络原理实验报告实验名称&#xff1a; 网络连通性测试与网络命令验证 日期&#xff1a; 2015.11&#xff0e;09 班级&#xff1a;学号&#xff1a; 姓名&#xff1a;【一】 预习内容5个常用网络命令&#xf…

Leetcode--11. 盛水最多的容器

给定 n 个非负整数 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多…

《城市大脑全球标准研究报告》发布会将于12月23号在北京举办

城市大脑全球标准研究组《城市大脑全球标准研究报告》发布会将于2020年12月23日下午在北京海淀区城市大脑展览厅举办&#xff0c;发布会除了报告发布&#xff0c;智能产业专家演讲&#xff0c;也将参观海淀城市大脑的发展情况。欢迎新闻媒体、科研机构、科技企业、政府部门的记…

竞态条件与临界区

在同一程序中运行多个线程本身不会导致问题&#xff0c;问题在于多个线程访问了相同的资源。如&#xff0c;同一内存区&#xff08;变量&#xff0c;数组&#xff0c;或对象&#xff09;、系统&#xff08;数据库&#xff0c;web services等&#xff09;或文件。实际上&#xf…

java 实现打印条形码_条码打印软件中如何设置条形码下面的字符间距?

条形码有两部分组成&#xff0c;上面是黑白条图案&#xff0c;用于扫描设备的识别&#xff0c;下面是条形码数据&#xff0c;方便在没有扫描设备的情况下可以手动去搜索相关的信息。一般用条码打印软件制作条形码&#xff0c;下面的条形码数据间距是自动生成的&#xff0c;而在…

计算机科学分为几个部分,计算机由几部分组成各部分的功能是什么

推荐回答一、数值计算计算机广泛地应用于科学和工程技术方面的计算&#xff0c;这是计算机应用的一个基本方面&#xff0c;也是我们比较熟悉的。如&#xff1a;人造卫星轨迹计算&#xff0c;导弹发射的各项参数的计算&#xff0c;房屋抗震强度的计算等。二、数据处理用计算机对…

用跑得最慢的电脑程序,理解最高深的哥德巴赫猜想

五条规则的图灵机可视化。每列像素代表一步计算&#xff0c;步骤从左到右。黑色代表1。最右边表示图灵机的停机。&#xff08;图片来源&#xff1a;Peter Krumins/Quanta Magazine&#xff09;文章来源&#xff1a;环球科学“忙碌的河狸”这个问题的目的是为了找到运行时间最长…

Leetcode--42.接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xff0c;在这种情况下&#xff0c;可以接 6 个单位的雨水&#xff08;蓝色部分表示雨水&#…

(4)Python3笔记 之 流程控制

一、条件控制 # 语法规则 if 变量(或表达式):语句块1 elif 变量(或表达式):语句块2 else:语句块3#示例 score 83 if score > 90:print(优秀) elif score > 60 and score < 90:print(及格) else:print(不及格) 二、循环 1&#xff09;. while循环 i 0 sum 0 while i…

云专网和云专线的区别_传统IDC行业与云计算的区别?

1.传统IDC行业和云计算在服务类型上的区别&#xff1a;传统IDC行业主要是有两种模式&#xff1a;租用和托管租用是自己没有服务器&#xff0c;机房提供服务器、带宽、IP地址、机位、服务器维护等。这种模式是租用。托管是自己购买配置服务器&#xff0c;通过快递、物流等方式把…

计算机插件技术应用原理,计算机软件技术中插件技术的运用

计算机软件技术中插件技术的运用在我国科技水平的不断提升下,计算机软件方面的功能也在持续更新。其中插件技术作为计算机软件中实用性比较强的一项功能,一直被研究分析。下面是小编搜集整理的相关内容的论文&#xff0c;欢迎大家阅读参考。摘要&#xff1a;随着经济和科学技术…

未来30年,这20项技术将颠覆人类生活

来源&#xff1a;嵌入式资讯精选美国公布了一份长达35页的《新兴科技趋势报告》。该报告是在美国过去五年内由政府机构、咨询机构、智囊团、科研机构等发表的32份科技趋势相关研究调查报告的基础上提炼形成的。通过对近700项科技趋势的综合比对分析&#xff0c;最终明确了20项最…