基于Python的数据导出和邮件发送

基于Python的数据导出和邮件发送,第1张

由于运维工作需要,经常需要将一些数据从数据库中导出,发送给运营和需求部门,天天去手动查询,又有点太费时间了,于是研究学习了Python的基本功能,通过Python脚本和Linux 的crontab命令实现了每天自动化的数据查询和邮件发送。

定义了以下几个代码模块实现了配置文件读取、日志记录、数据库连接访问查询、导出到xlsx和带附件的邮件发送功能。
1、demopy 示例文件
2、configyml 配置文件
3、common_logpy 实现日志记录
4、common_dbpy 实现数据库连接和访问
5、common_xlsxpy 实现数据表格的处理
6、common_emailpy 实现带附件的邮件发送

我也遇到了这个问题,我的解决方法是,先将列表按照时间排序后再抓取,每次抓取完记录最后一条的url,下载再抓取时,遇到这个url,抓取就自动退出。如果解决了您的问题请采纳!如果未解决请继续追问!

import xlrd
import os,time
#引入邮件相关库
import smtplib
from emailmimetext import MIMEText
from emailheader import Header
import base64
#处理从excel中读取的float类型数据的类
#目前集成两种处理:(1)float到int型的转换(2)float到str型的转换,后续有需要可以增加方法以集成其他类型的转换
class judgeFloat:
def floatToInt(self,variable):
variable="%d"%variable
return variable
def floatToStr(self,variable):
variable=xlrdxldate_as_tuple(variable,0)
variable=list(variable)
if variable[1]<10:
variable[1]='0'+str(variable[1])
variable=str(variable[0])+str(variable[1])+str(variable[2])
return variable
#确定文档是否修改的函数:获取文档的修改时间与本地时间对比,不一致要求用户确认是否继续执行,一致则直接执行
def openFile(filename,address):
filetime=timestrftime("%Y/%m/%d",timelocaltime(osstat(address+filename)st_mtime))
local=timestrftime("%Y/%m/%d",timelocaltime())
if filetime!=local:
single=input("文档今天还没有修改过,请确认是否继续?确认请输入1后点击回车,否则输入2点击回车。")
if single==1:
pass
elif single==2:
exit()
else:
print '您的输入有误!脚本即将结束。'
timesleep(5)
exit()
else:
pass
#写邮件的函数
def mailWrite(filename,address):
header='<html><head><meta >

小猪在公司做出纳,干的活却包括了出纳、会计、结算专员等工作,周末都要被无奈在家加班,主要还没有加班费,简直是被公司严重压榨。每个月初都要给每个工长发预付款账单邮件,月中发结算款账单。重复性机械工作。
一个及格线上的程序员,最起码的觉悟就是将重复性的机械工作自动化,于是,在我花了一个多小时,帮她给一部分工长发了一次邮箱后,默默的回来写了这个脚本。
所以,设计要点就是一个字——
恩,就酱。

经过我观察,邮件内容分为两种,这里先说第一种,“结算款”:
(1) 邮件内容(content)不变,为固定的txt文本
(2) 附件(attch)为每个工长的结算账单(excel文件xlsx),此文件命名为总账单中自动分割出来的名字(暂时不懂怎么分割出来的==),格式为:

(3) 邮件主题(Subject)为附件名(不带后缀名)
(4) 邮件接收对象(工长)的名单及其邮箱地址基本不变,偶尔变动
(5)

(1) 将工长及其邮箱地址存为CSV文件的两列,python中将其读取为字典形式,存储以供后续查询邮箱地址。

(2) 遍历文件夹中的附件(xlsx类型文件),对其进行两种 *** 作,一方面将其名字(不带路径和后缀)提取出来,作为邮件主题(Subject),并对Subject进一步划分,得到其中的人名(工长);另一方面,将其传入MIMEbase模块中转为邮件附件对象。

(3) 由上述得到的人名(name),在字典形式的通讯录中,查找相应的地址(value),即为收件人名称和地址
(4) 利用python中的email模块和smtp模块,登录自己的邮箱账号,再对每个附件,得到的收件人名和地址,添加附件,发送邮件。done

在设计过程中有几点需要注意
(1) 有时一个邮件地址对应两个人名,此时应该在CSV文件中分为两行存储,而不是将两个人名存为同一个键;
(2)有账单xlsx文件,通讯录里却没存储此人记录,程序应该打印提示没有通讯记录的人名,且不能直接退出,要保证员工看到此提示,此第一版程序还有解决此问题;
(3)此程序发送的邮件内容为纯文本,若要求邮件内容有不同格式(如部分加粗,部分红色),还有小部分需要每次更改的地方(如邮件内容包含当前月份),如何解决?(这就是第二种邮件内容,“预算款”);
(4)重名的,暂时还没碰到,程序中也没给出解决方案。

第一版到此,20180830,待更新
第二版更新,20180904

第三版更新,20180909

转战CSDN博客,更多博客见传送门《 xiaozhou的博客主页 》

提供以下两种方式:

利用smtplib,email库

coding:utf-8
import smtplib
from emailmimetext import MIMEText
from emailmimemultipart import MIMEMultipart
import sys
reload(sys)
syssetdefaultencoding("utf8")
# 配置收发件人
recvaddress = ['receiveemail@sinacom','receiveemail@qqcom']
# 163的用户名和密码
sendaddr_name = 'your_email@163com'
sendaddr_pswd = 'your_password'
class SendMail:
def __init__(self,recver=None):
"""接收邮件的人:list or tuple"""
if recver is None:
selfsendTo = recvaddress
else:
selfsendTo = recver
def send(self,sub,content,attachcontent):
"""发送邮件"""
selfmsg = MIMEMultipart()
#设置发送邮件
selfmsg['from'] = sendaddr_name
try:
#设置邮箱服务器
smtp = smtplibSMTP('smtp163com',25)
#登录
smtplogin(sendaddr_name,sendaddr_pswd)
#设置发送主题
selfmsg['Subject'] = sub
#设置邮件内容
selfmsgattach(MIMEText(content))
#设置邮件附件,将附件的内容attachcontent,写到filename的文件中,作为附件发送
att1 = MIMEText(attachcontent, 'base64', 'gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="testattachtxt"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
selfmsgattach(att1)
#发送邮件
smtpsendmail(selfmsg['from'], selfsendTo, selfmsgas_string())
smtpclose()
print(u"发送邮件成功")
except Exception,e:
print(u'发送邮件失败:'+str(e))
raise
#调用
s = SendMail()
subject = "主题"
content = "这里是邮件内容"
attachcontent = "这里是附件哦"
ssend(subject,content,attachcontent)

2利用webpy自带的email模块

首先要安装webpy的依赖库

pip install webpy

#coding:utf-8
import web
##### email服务器配置 #####
webconfigsmtp_server = 'smtpsinacom'
webconfigsmtp_port = 25
webconfigsmtp_username = '你的email前缀,@前的字符串'
webconfigsmtp_password = '你的密码'
webconfigsmtp_starttls = True
send_from="youremail@sinacom"
receiveemailaddr = ["receiveemail@qqcom","receiveemail@163com"]
subject=u'这里是主题'
message=u'这里是邮件的内容' 
def sendemail(sendfrom,sendto,subject,message,cc=None, bcc=None,headers=({'User-Agent': 'webpysendmail', 'X-Mailer': 'webpysendmail',})):
try:
 websendmail(send_from,sendto,subject,message,cc=cc,bcc=bcc)
 print "邮件发送成功"
except Exception,e:
print(str(e))
#调用
sendemail(send_from,receiveemailaddr,subject,message)

邮箱有开放的API:直接编写程序,通过接口拿到邮箱内容数据,用相应字段接收即可,后面就是将内容保存到目标数据库了。

没有API开放接口:可以使用编写爬虫程序来获得,也就是用程序模仿人为登录、查看邮件内容,然后在打开的网页里提取出需要的内容,并保存到数据库,注意一点,编写爬虫时需要考虑到邮箱提供方的反爬限制,只有充分研究之后才能提出比较好的爬虫系统方案,建议用python来做,网上爬虫案例很好、很多,望君采纳。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13380983.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-25
下一篇 2023-07-25

发表评论

登录后才能评论

评论列表(0条)

保存