Python发邮件合集

本文详细介绍了使用Python进行邮件自动化的各种技巧,包括邮件格式设置、正文显示、表格展示、附件添加及日期定制等功能,适合希望提升邮件发送效率的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

# -*- coding: utf-8 -
#! /usr/bin/env python 
'''
Created on 2017-10-10
@author: Backup and share


python发邮件合集:

目录:
0.【自定义-显示格式等设置】
1.在实例msg中加入【邮件正文显示-静态文本】
2.在实例msg中加入【邮件正文显示-文档中文本】
3.在实例msg中加入【邮件正文显示-表格-自定义表头】
4.在实例msg中加入【邮件正文显示-表格-CSV文件第一行当表头】
5.在实例msg中加入【邮件-带附件】
6.在实例msg中加入【邮件-带附件-CSV转Excel-合并2个csv文件到一个excel的不同sheet】
    -附件名带中文时设置gb2312编码
7.在实例msg中加入【邮件-带附件-文件名带昨天日期】
8.【邮件发送设置】

注:
1.正文部分:单独1+2可显示,单独3可显示;1+2+3时只显示了3
2.2和4中文件不用同一个

'''

#下边三行解决编码问题
import sys 
reload(sys)
sys.setdefaultencoding('utf-8')

#下边三行满足发邮件基本功能
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib

#下边三行设置发邮件格式
from email.header import Header
from email.utils import parseaddr,formataddr
import datetime

import pandas as pd



#创建一个带附件的实例
msg = MIMEMultipart()



#****************************0.【自定义-显示格式等设置】******************************************#
#自定义发送显示
def _format_addr(s):
    name,addr = parseaddr(s)
    print name
    print addr
    return formataddr((\
        Header(name,'utf-8').encode(),\
        addr.encode("utf-8") if isinstance(addr,unicode) else addr))

#自定义显示发送日期
def _dateshow():
    now=datetime.datetime.now()
    delta=datetime.timedelta(days=-1)
    n_days=now+delta
    sendtime = n_days.strftime('%Y-%m-%d')
    print sendtime
    return sendtime

#自定义显示邮件主题
def _format_subject(s):
    subshow,dateshow = parseaddr(s)
    return formataddr((\
        Header(subshow,'utf-8').encode(),\
        dateshow.encode("utf-8") if isinstance(dateshow,unicode) else dateshow))



#******************1.在实例msg中加入【邮件正文显示-静态文本】*****************************#
text = "昨天的活动数据(dayall.csv)+累积的活动数据[存在部分重复](weekall.csv)。\n\n\
昨天的数据如下:\n\n"
part1 = MIMEText(text,'plain','utf-8')
msg.attach(part1)
# 【\n】: 邮件正文中-显示时换行 
# 【\】:.py文件中-当前行和下一行文本为相连的一句字符串



#******************2.在实例msg中加入【邮件正文显示-文档中文本】***************************#
#打开目标文档后读取并保存至fmsg这个多行str变量里。并创建正文文本
f = open('/data/share/all/result/dayall1.csv','r')
fmsg = ''' '''
while True:
    line = f.readline()
    fmsg += line+'\n'
    if not line:
        break
f.close()
part2 = MIMEText(fmsg,'plain','utf-8')
msg.attach(part2)



#******************3.在实例msg中加入【邮件正文显示-表格-自定义表头】**********************************#
#注意:此模块需在代码顶部添加:import pandas as pd
a = pd.read_csv('/data/share/radio/result/radio1.csv')
d = ''
#align="center"加在上边的tr中表正文居中,加在下边的tr中表头居中,加在td中此列居中
for i in range(len(a)):
    d = d + """
    <tr align="center">
      <td>""" + str(a.iloc[i][0]) + """</td>
      <td>""" + str(a.iloc[i][1]) + """</td>
      <td width="120">""" + str(a.iloc[i][2]) + """</td>
      <td width="%d">""" + str(a.iloc[i][3]) + """</td> %len( str(a.iloc[i][3]))
    </tr>"""
html = """\
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<div id="container">
<p><strong>星空电台数据-埋点(最后一行是当日用户增长数据):</strong></p>
<div id="content">
<table width="80%" border="2" bordercolor="black" cellspacing="0" cellpadding="0">
<tr>
  <td><strong>时间</strong></td>
  <td><strong>埋点</strong></td>
  <td><strong>uv</strong></td>
  <td><strong>pv</strong></td>
</tr>"""+d+"""
</table>
</div>
</div>
</div>
</body>
</html>
    """
context = MIMEText(html,_subtype='html',_charset='utf-8')  #解决乱码
msg.attach(context)



#******************4.在实例msg中加入【邮件正文显示-表格-CSV文件第一行当表头】**********************************#
#注意:此模块需在代码顶部添加:import pandas as pd
a = pd.read_csv('/data/share/radio/result/radio1.csv',header=None)
d = """ 
    <tr align="center">
      <th>""" + str(a.iloc[0][0]) + """</th>
      <th>""" + str(a.iloc[0][1]) + """</th>
      <th>""" + str(a.iloc[0][2]) + """</th>
      <th>""" + str(a.iloc[0][3]) + """</th>
    </tr>"""
for i in range(len(a)-1):
    d = d + """ 
    <tr align="center">
      <td>""" + str(a.iloc[i+1][0]) + """</td>
      <td>""" + str(a.iloc[i+1][1]) + """</td>
      <td width="120">""" + str(a.iloc[i+1][2]) + """</td>
      <td width="120">""" + str(a.iloc[i+1][3]) + """</td>
    </tr>"""
html = """\
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<div id="container">
<p><strong>星空电台数据-埋点(最后一行是当日用户增长数据):</strong></p>
<div id="content">
<table border="2" bordercolor="black" cellspacing="3" cellpadding="3" >
"""+d+"""
</table>
</div>
</div>
</div>
</body>
</html>
    """
context2 = MIMEText(html,_subtype='html',_charset='utf-8')  #解决乱码
msg.attach(context2)



#******************5.在实例msg中加入【邮件-带附件】**************************************#
#构造附件1
att1 = MIMEText(open('/data/share/all/result/dayall.csv', 'rb').read(), 'base64', 'gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="dayall.csv"'#这里的filename可以任意写,写什么名字,邮件中显示>什么名字(注意带后缀)
msg.attach(att1)



#******************6.在实例msg中加入【邮件-带附件-CSV转Excel-合并2个csv文件到一个excel的不同sheet】**************************************#
#csv转dataframe转excel

# 创建一个输出文件
aim = pd.ExcelWriter('/data/share/all/result/xlsx/merge合并.xlsx')

# csv -to dataframe -to excel
data = pd.read_csv('/data/share/all/result/xlsx/dayall1.csv',sep=',')
data.to_excel(aim,'dayall昨天数据',index=False)

#load csv -to dataframe -to excel
data = pd.read_csv('/data/share/all/result/xlsx/weekall1.csv',sep=',')
data.to_excel(aim,'weekall累积数据',index=False)

aim.save()

#构造附件3 <excel附件>
att3 = MIMEText(open('/data/share/all/result/xlsx/merge合并.xlsx', 'rb').read(), 'base64', 'gb2312')
att3["Content-Type"] = 'application/octet-stream'
att3["Content-Disposition"] = 'attachment; filename=%s' % "merge合并.xlsx".encode('gb2312') #附件名带中文时设置gb2312编码
msg.attach(att3)



#******************7.在实例msg中加入【邮件-带附件-文件名带昨天日期】**************************************#
#构造附件4
att4 = MIMEText(open('/data/share/all/result/xlsx/merge.xlsx', 'rb').read(), 'base64', 'gb2312')
att4["Content-Type"] = 'application/octet-stream'
att4.add_header('Content-Disposition','attachment',filename = (u'merge%s.xlsx' % _dateshow())) #显示:merge2017-10-16.xlsx
msg.attach(att4)



#****************************8.【邮件发送设置】******************************************#

#发件人
asender = 'XXXX'

#收件人
areceiver = 'XX,XXX' #多个收件人在''中用,分隔
acc = 'X' #抄送

#加邮件头
msg['from'] = _format_addr(u'xx部门 <%s>' % asender)
msg['to'] = areceiver
msg['cc'] = acc
msg['subject'] = _format_subject(u'XX数据 <%s>' % _dateshow())
#发送邮件
try:
    server = smtplib.SMTP()
    server.connect('smtp.exmail.qq.com')
    server.login(asender,'pwd')
    server.sendmail(asender, msg['to'].split(',') + msg['cc'].split(','), msg.as_string())
    server.quit()
    print '发送成功'
except Exception, e:
    print str(e)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值