发送邮件使用第三方 SMTP 服务,例如QQ,但是需要QQ的授权码才能发送。
所有数据都放在服务器上,需要下载下来,生成csv文件后发送给个人。贴代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import os.path
import time
import pymysql
import xlwt
#生成excel文件名
def createxcel(filename):
try:
v_file_name = filename+'.xls'
#数据库对应地址及用户名密码,指定格式,解决输出中文乱码问题
conn = pymysql.connect("***","***","***","***")
#cursor获得python执行Mysql命令的方法,也就是操作游标
cur = conn.cursor()
v_sql="select id,bi_title,bi_url,bi_date from cral_list where is_send=0"
cur.execute(v_sql)
#fetchall()则是接收全部的返回结果行
rows = cur.fetchall()
if not rows:
cur.close()
conn.close()
return False
v_cnt = len(rows)
#生成excel文件
book=xlwt.Workbook()
# 如果对一个单元格重复操作,会引发
# returns error:
# Exception: Attempt to overwrite cell:
# sheetname=u'sheet 1' rowx=0 colx=0
# 所以在打开时加cell_overwrite_ok=True解决
sheet1=book.add_sheet('Sheet1',cell_overwrite_ok=True)
#表头标题
sheet1.write(0,0,'id')
sheet1.write(0,1,'标题')
sheet1.write(0,2,'网址')
sheet1.write(0,3,'爬取时间')
#每一列写入excel文件,不然数据会全在一个单元格中
for i in range(len(rows)):
for j in range(4):
sheet1.write(i+1,j,rows[i][j])
book.save(v_file_name)
cur.close()
conn.close()
return v_file_name
except:
return False
# 第三方 SMTP 服务
def sendemail(filename):
mail_host="smtp.qq.com" #设置服务器
mail_user="***" #用户名
mail_pass="***"
sender = '***@qq.com'
# receivers = ['***@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
receivers = getmailers()
message = MIMEMultipart()
message['From'] = Header("爬虫服务器", 'utf-8')
message['To'] = Header("管理员", 'utf-8')
#邮件正文内容
message.attach(MIMEText('这是由系统管理员发送的数据……', 'plain', 'utf-8'))
subject = '恭喜,今天您又有新的招标数据啦'
message['Subject'] = Header(subject, 'utf-8')
att1 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="{}"'.format(filename)
message.attach(att1)
try:
smtpObj = smtplib.SMTP_SSL(mail_host, 465)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
smtpObj.quit()
updatecral_list()
print("邮件发送成功")
except:
print('邮件发送失败')
#获得当天未发送的数据并生成表格
def getbiddingdatatoexcel():
#检索为发送的数据-》生成表格-》返回表格名称
date = time.strftime("%Y_%m_%d",time.localtime())
filename = "biddingdata_{}".format(date)
return createxcel(filename)
def updatecral_list():
db = pymysql.connect("***","bi","***","***")
cursor = db.cursor()
usql = "update cral_list set is_send=1"
cursor.execute(usql)
cursor.close()
db.close()
def getmailers():
db = pymysql.connect("192.***","bi","***","***")
cursor = db.cursor()
findsql = "select maillist from cral_sendemail"
cursor.execute(findsql.encode('utf-8').decode('utf-8'))
result = cursor.fetchone()
db.close()
if result:
m = result[0]
return m.split(";")
else:
return '***@qq.com'
cursor.close()
db.close()
def main():
filename = getbiddingdatatoexcel()
if filename:
sendemail(filename)
if __name__ =='__main__':
try:
main()
print("处理完成")
except:
print("没能成功发送邮件!")