利用SMTP发送预警邮件(Python版)

  |   0 评论   |   588 浏览

背景

在日常的任务运行中,免不了会遇到异常情况,需要通过某种方式进行预警,以及时处理,利用SMTP发送预警邮件是其中一中方式

代码

#!/usr/bin/python
#  coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.utils import formatdate
from email.header import Header
import sys
import os
import re
from optparse import OptionParser
from optparse import OptionGroup

# 初始化邮件
encoding = 'utf-8'
def get_mail(options, username):
    mail = MIMEMultipart()
    mail['Subject'] = Header(options.subject, encoding)
    mail['From'] = username
    mail['To'] = ','.join(re.split('[,|;]', options.to))
    if options.cc is not None:
        mail['Cc'] = ','.join(re.split('[,|;]', options.cc))
    mail['Date'] = formatdate()
    if options.content != '':
        mail.attach(MIMEText(options.content.encode(encoding), 'plain', encoding))
    if options.attach is not None:
        add_attach(mail, options.attach)
    return mail

def add_attach(mail, attach):
    files = re.split('[,|;]', attach)
    for num in range(0, len(files)):
        attach_file = files[num]
        if os.path.exists(attach_file):
            att = MIMEText(open(attach_file, 'rb').read(), 'base64', 'utf-8')
            att["Content-Type"] = 'application/octet-stream'
            # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
        filename = attach_file
        if '/' in attach_file:
            filename = attach_file[attach_file[ : : -1].index('/') + 1:]
        att["Content-Disposition"] = 'attachment; filename="' + filename + '"'
        mail.attach(att)

if __name__ == "__main__":
    usage = "Usage: %prog [options]"
    parser = OptionParser(usage=usage)
    parser.add_option('-t', '--to', help='receiver')
    parser.add_option('-c', '--cc', default=None, help='carbon copy')
    parser.add_option('-s', '--subject', help='subject')
    parser.add_option('-C', '--content', default='', help='content')
    parser.add_option('-a', '--attach', default=None, help='attach files')
    options, args = parser.parse_args(sys.argv[1:])

    if options.to == None or options.subject == None:
        print "to && cc can't be null"
        parser.print_help()
        sys.exit(-1)


    # 设置默认字符集为UTF8 不然有些时候转码会出问题
    default_encoding = 'utf-8'
    if sys.getdefaultencoding() != default_encoding:
        reload(sys)
        sys.setdefaultencoding(default_encoding)

    # 发送邮件的相关信息,根据你实际情况填写
    smtpHost = 'smtp.exmail.qq.com'
    # smtpPort = '25'
    sslPort = '465'
    username = 'admin@cxy7.com'
    password = 'XXXXXXXXXXXXX'

    mail = get_mail(options, username)
    try:
        # 连接smtp服务器,明文/SSL/TLS三种方式,根据你使用的SMTP支持情况选择一种
        # 普通方式,通信过程不加密
        # smtp = smtplib.SMTP(smtpHost, smtpPort)
        # smtp.ehlo()
        # smtp.login(username, password)

        # tls加密方式,通信过程加密,邮件数据安全,使用正常的smtp端口
        # smtp = smtplib.SMTP(smtpHost,smtpPort)
        # smtp.set_debuglevel(True)
        # smtp.ehlo()
        # smtp.starttls()
        # smtp.ehlo()
        # smtp.login(username,password)

        # 纯粹的ssl加密方式,通信过程加密,邮件数据安全
        smtp = smtplib.SMTP_SSL(smtpHost,sslPort)
        smtp.ehlo()
        smtp.login(username,password)

        # 发送邮件
        smtp.sendmail(username, options.to, mail.as_string())
        smtp.close()
        print 'OK'
    except Exception as e:
        print e

用法

Usage: send_mail.py [options]

Options:
  -h, --help            show this help message and exit
  -t TO, --to=TO        receiver
  -c CC, --cc=CC        carbon copy
  -s SUBJECT, --subject=SUBJECT
                        subject
  -C CONTENT, --content=CONTENT
                        content
  -a ATTACH, --attach=ATTACH
                        attach files

测试

[root@cxy7 manage]# python send_mail.py -t admin@cxy7.com -s 备份DB -a 1.txt,2.txt 
发送邮件成功

查看邮箱,已经发过来了

image.png