python练习--发送html格式邮件且发送附件;

最近需要些一个根据配置自动获取html正文及附件的工具脚本。随业余时间写了这个脚本,同时也是对邮件结构的一个学习;后续还需要继续完善html内容生成的部分

感觉脚本还可以优化,比如可以加入图片部分,pdf等,另外发送邮件用的默认铭文方式。没有采用加密/SSL等其他方式;

另外xml配置部分的提取还可以使用字典来做。这样可以更优一些;

代码:

xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Email>
    <EmailServerConf>
        <!-- smtp配置 :只支持1个-->
        <smtp  ip="email ip" port="25" user="abc" password="defdd" />
    </EmailServerConf>
    <!-- 发件人:只支持1个 -->
    <From address="[email protected]" />
    <!-- 收件人:支持多个 -->
    <ToEmailList>
        <To address="[email protected]" />
    </ToEmailList>
    <!-- 抄送:支持多个 -->
    <CCEmailList>
        <CC address="[email protected]" />
    </CCEmailList>
    <!-- 邮件主题:只支持1个 -->
    <Subject title="This is for test!" />
    <!-- 邮件正文:只支持1个,html格式,无图片 -->
    <Emailcomment>
        <comment file="C:\Users\aaa\Desktop\Multipart.html" />
    </Emailcomment>
    <!-- 邮件附件:支持多个 -->
    <EmailAttach>
        <attach file="C:\Users\aaa\Desktop\Multipart.html" />
    </EmailAttach>
</Email>
    

python部分:

#! /usr/bin/env python
#coding:utf-8

import os,string,sys
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email import Utils
from email.MIMEBase import MIMEBase
from email import encoders
from xml.dom import minidom
import logging
from email.mime.text import MIMEText

class CommEmail(object):

    emailConf = r"D:\workspace\car\tools\emailconf.xml"

    def __init__(self):

        #init
        self.sIp = ""
        self.sPort = ""
        self.sUser = ""
        self.sPassword = ""
        self.fEmailServerConfFile = ""
        self.fEmailTemplateFile = ""
        self.sEmailOwner = ""
        self.dEmailTo = []
        self.dEmailCC = []
        self.dattach = []
        self.sSubject = ""
        self.emComment = ""
        self.tDate = Utils.formatdate(localtime = 1)
        logging.basicConfig(level=logging.DEBUG,
                            format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,
                            datefmt=‘%a, %d %b %Y %H:%M:%S‘,
                            filename=‘Email.log‘,
                            filemode=‘a‘)

        #from conf-profile to set email-server  configure
        self.fEmailServerConfFile = self.emailConf
        try:
            #tag handle
            xmlFeed = minidom.parse(self.fEmailServerConfFile)
            xmlEmaiSMTP = xmlFeed.getElementsByTagName(‘smtp‘)
            xmlEmailFrom = xmlFeed.getElementsByTagName(‘From‘)
            xmlEmaiTos = xmlFeed.getElementsByTagName(‘To‘)
            xmlEmaiCCs = xmlFeed.getElementsByTagName(‘CC‘)
            xmlEmailSubject = xmlFeed.getElementsByTagName(‘Subject‘)
            xmlEmailComments = xmlFeed.getElementsByTagName(‘comment‘)
            xmlEmailattachs = xmlFeed.getElementsByTagName(‘attach‘)

            #only one smtp-tag
            for smtpConf in xmlEmaiSMTP:
                self.sIp = smtpConf.getAttribute("ip")
                self.sPort = smtpConf.getAttribute("port")
                self.sUser = smtpConf.getAttribute("user")
                self.sPassword = smtpConf.getAttribute("password")

            #To
            for To in xmlEmaiTos:
                self.dEmailTo.append(To.getAttribute("address"))

            #CC
            for cc in xmlEmaiCCs:
                self.dEmailCC.append(cc.getAttribute("address"))

            #From & Subject
            self.sEmailOwner = xmlEmailFrom[0].getAttribute("address")
            self.sSubject = xmlEmailSubject[0].getAttribute("title")

            self.emComment = open(xmlEmailComments[0].getAttribute("file")).read()

            #attach
            for attach in xmlEmailattachs:
                self.dattach.append(attach.getAttribute("file"))

            logging.info("smtp conf ====> ip: "+ self.sIp + " " + "port: " + self.sPort + " " + "user: " + self.sUser + " password: " + self.sPassword )
            logging.info("init end")

        except:
            logging.warning("ERROR: EmailServerConfFile is ERROR !!!")
            logging.warning("exit(1) from __init__")
            exit(1)

    ‘‘‘
    #for email-server test
    def testEmaileServer(self):
        emailHandle = smtplib.SMTP(self.sIp,int(self.sPort))
        #emailHandle.putcmd("vrfy", "[email protected]")
        #emailHandle.getreply()
        emailHandle.login(self.sUser, self.sPassword)
        msg = "To: [email protected] \nFrom: [email protected] \nSubject:testing \n" #header
        msg = "\nthis is test msg\n\n"
        emailHandle.sendmail("[email protected]", "[email protected]", msg)
        emailHandle.quit()
        #logging.INFO(" Email for test was send." )
    ‘‘‘

    #get html commtent

    #email comment & sendmail
    def sendHtmlEmail(self):
        try:
            msg = MIMEMultipart()
            msg["Subject"] = self.sSubject
            msg["From"] = self.sEmailOwner
            msg["To"] = ";".join(self.dEmailTo)
            msg["CC"] = ";".join(self.dEmailCC)
            msg["Date"] = self.tDate         

            #email comment
            emailComment = MIMEText(self.emComment,_subtype="html",_charset=‘base64‘)
            #add eamil attach
            for a in self.dattach:

                t =MIMEBase(‘application‘,‘octet-stream‘)
                t.set_payload(open(a,‘r‘).read())
                encoders.encode_base64(t)
                t.add_header(‘Content-Disposition‘,‘attachment;filename="%s"‘ % os.path.basename(a))
                msg.attach(t)

            msg.attach(emailComment)
            emailHandle = smtplib.SMTP()
            emailHandle.connect(self.sIp,int(self.sPort))
            emailHandle.login(self.sUser, self.sPassword)
            emailHandle.sendmail(msg["From"], msg["To"], msg.as_string())
            emailHandle.quit()
            emailHandle.close()
            logging.info(" Email for test was send." )
            logging.info("makeMIMETextEmail ok")

        except:
            logging.warning("ERROR: makeMIMETextEmail is ERROR !!!")
            logging.warning("exit(1) from makeMIMETextEmail")
            exit(1)

if __name__ == "__main__":
    a = CommEmail()
    a.makeMIMETextEmail()

smtp协议参考文章:

这个东西这里只用来了解,没有详细学习;有问题可以参考下列文章:

http://blog.csdn.net/kerry0071/article/details/28604267

http://blog.csdn.net/bripengandre/article/details/2191048

邮件结构简述:

a、邮件结构可以通过查看邮件源码看到。可以看到邮件其实也是类似http请求一样。有包头,body等;在python中的对应类和方法大多数也是采用hash字典来操作;

b、python中各MIME类的继承结构:

MIMEBase
    |-- MIMENonMultipart
        |-- MIMEApplication
        |-- MIMEAudio
        |-- MIMEImage
        |-- MIMEMessage
        |-- MIMEText
    |-- MIMEMultipart

c、各种多媒体格式可以通过MIMEBse类来构造。在头部加入application/octet-stream ,即2进制文件。其实就是MIMEApplication类,让客户端自己根据附件的扩展名判断需要用什么来解析;

参考文章:

http://blog.csdn.net/handsomekang/article/details/9811355  ------ 各种类型附件发送方法

时间: 2024-10-13 01:37:29

python练习--发送html格式邮件且发送附件;的相关文章

django-29.发送html格式邮件

上一篇已经通过send_mail()函数发送纯文本的邮件,发送成功了,如果我们想发送一个html格式的邮件,如何实现呢?发送html格式的邮件实际上还是调用send_mail()函数 ,只需多加一个html_message参数 html_message参数 从上一篇的send_mail()函数里面可以看出,里面有个参数html_message默认是为None,部分源码如下 mail = EmailMultiAlternatives(subject, message, from_email, re

python 2.7 利用smtplib发送、抄送邮件以及发送html表格

开发语言: python2.7 包:smtplib 导入包: import smtplib 定义一个函数: def send_mail(to_list, cc_list, html, sub):     me = mail_user     msg = MIMEText(html, _subtype='html', _charset='utf-8')  # 格式化邮件内容为html,编码为utf-8     msg['Subject'] = sub    # 邮件主题     msg['From

SQL Server中发送HTML格式邮件的方法

SqlSever 配置邮箱的方法就不说了,自行百度搜索.发送邮件可以非常方便帮助运维人员做统计或者发送给客户定制的订单等. 以下列举使用sqlserver 发送邮件的3个示例: A. 发送电子邮件 此示例使用电子邮件地址 [email protected] 向 Dan Wilson 发送电子邮件.该邮件的主题为 Automated Success Message.邮件正文包含一句话 'The stored procedure finished successfully'. EXEC msdb.d

python 发送html格式邮件到qq

# -*- coding: utf-8 -*- __author__ = 'Alon' __date__ = '2017/8/14 18:38' import sys reload(sys) sys.setdefaultencoding('utf8') import smtplib import time from datetime import datetime from email.mime.text import MIMEText from email.mime.multipart imp

[Java] JavaMail 发送 html 格式、带附件的邮件

本案例演示发送 html 格式,可带附件的邮件发送.发送纯文本邮件的例子可参照上一篇博文JavaMail 简单案例. EmailHelper, Email 的帮助类,向帮助类提供 SMTP 服务器域名.用户名.密码.发送人邮箱.收件人邮箱.邮件主题.html 格式的内容(可选).附件(可选),便可发送一份邮件. SendEmailDemo, 演示发送邮件. import java.util.Properties; import javax.activation.DataHandler; impo

python学习笔记[3]-邮件的发送

本文摘抄自:http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html 一.相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:    1.smtplib模块 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])   SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行

python实现邮件的发送

今天尝试实现了利用python,编写程序来发送邮件,以下为实现过程: 一:关于邮件传输的简介 SMTP (Simple Mail Transfer Protocol) 邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器.SMTP协议只能用来发送邮件,不能用来接收邮件.大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议.SMTP协议的默认TCP端口号是25. SMTP协议的一个重要特点是它能够

python学习笔记(SMTP邮件发送)

想着给框架添加邮件发送功能.所以整理下python下邮件发送功能 首先python是支持邮件的发送.内置smtp库.支持发送纯文本.HTML及添加附件的邮件 之后是邮箱.像163.qq.新浪等邮箱默认关闭SMTP服务,需要我们手动打开 打开后通过发件人邮箱.授权密码 通过发件人的SMTP服务发送 代码如下: 1 #!/usr/bin/env python 2 # -*- coding: utf_8 -*- 3 4 from email.mime.text import MIMEText 5 fr

用python 发送一个smtp邮件

用python写一个简单的邮件,需要发送的邮件内容自定义,可用于监控警告邮件发送. #!/usr/bin/env python import smtplib    //内置smtp库 import string HOST = "smtp.163.com"    //定义用于发送邮件的主机,这里用网易163 SUBJECT = "Test email from Python"    //定义邮件标题 TO = "[email protected]"