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实现简单的邮件发送客户端示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值