python内置模块登录邮箱(SMTP/POP3)

使用pdfminer解析pdf合同附件,简单的提取一下里面的内容

压缩包已经上传!

poplib_emain.py内容(完整版):

# coding:utf-8

# date:2018/4/19

# PDFParser : pdf解析类

# PDFDocument : pdf 文本存储

# PDFResourceManager : pdf 存储资源类(图片文本)

# PDFPageInterpreter : pdf 处理页面内容将PDFDevice翻译成想要的内容

from email.parser import Parser

from email.header import decode_header

from email.utils import parseaddr

import re

import poplib

import traceback

import mysql.connector

from pdfminer.pdfparser import PDFDocument, PDFParser

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter, PDFTextExtractionNotAllowed

from pdfminer.converter import PDFPageAggregator

from pdfminer.layout import LTTextBoxHorizontal, LAParams

from emails.settings import *

from emails.Logger import *

logger = Logger(logname='log5.txt', loglevel=1, logger='email').getlog()

def deco(func):

def wrapper(self, *args, **kwargs):

try:

return func(self, *args, **kwargs)

except Exception as e:

logger.error('\n%s\n方法 %s发生错误,原因是: %s\n' % ('-' * 100, func.__name__, traceback.format_exc()))

return wrapper

class Email:

name_lis = []

money_lis = []

mingxi_lis = []

def __init__(self):

self.db = mysql.connector.Connect(host=HOST, user=USER, password=PASSWORD, port=PORT, db=DBS)

self.cursor = self.db.cursor()

@deco

def pdf_text(self, path):

'''

pdf解析文本,保存到列表

:param path: pdf位置参数

:return: 文本列表

'''

content_ = []

fp = open(path, 'rb')

# 创建一个pdf分析对象

parse = PDFParser(fp)

# 创建一个pdf文档对象

document = PDFDocument(parse)

# 连接分析器和文档独享

parse.set_document(document)

document.set_parser(parse)

# 提供初始化密码

# 如果没有密码 就创建一个空的字符串

document.initialize()

# 检测文档是否提供txt转换,不提供就忽略

if not document.is_extractable:

raise PDFTextExtractionNotAllowed

# 创建一个资源共享管理对象

rsrcmgr = PDFResourceManager()

# 创建一个PDF设备对象

laparams = LAParams()

# 创建一个PDF解释器对象。

device = PDFPageAggregator(rsrcmgr, laparams=laparams)

# 处理文档中包含的每个页面。

interpreter = PDFPageInterpreter(rsrcmgr, device)

lens = []

for i in document.get_pages():

lens.append(i)

obj = lens.pop()

for page in document.get_pages():

# 使用页面解析器来读取

interpreter.process_page(page)

# 使用聚合器获取内容

layout = device.get_result()

for x in layout:

if isinstance(x, LTTextBoxHorizontal):

content_.append(x.get_text())

return content_

def turn_on_off(self, lines, status, start, end):

'''

检测该行开始是否是特定值开始/结束

如果是设定特定值开始/结束,状态开/关

'''

if lines.startswith(start):

status = True

elif status:

if lines == end:

status = False

return status

def savefile(self, filename, data, path):

try:

filepath = path + filename

print('Save as: ' + filepath)

f = open(filepath, 'wb')

except:

print(filepath + ' open failed')

# f.close()

else:

f.write(data)

f.close()

def decode_str(self, s):

'''

转码

:param s:

:return:

'''

value, charset = decode_header(s)[0]

if charset:

value = value.decode(charset)

return value

def guess_charset(self, msg):

'''

# 先从msg对象获取编码:

:param msg:

:return:

'''

charset = msg.get_charset()

if charset is None:

# 如果获取不到,再从Content-Type字段获取:

content_type = msg.get('Content-Type', '').lower()

pos = content_type.find('charset=')

if pos >= 0:

charset = content_type[pos + 8:].strip()

return charset

@deco

def print_info(self, msg, mypath):

'''

解析邮件

:param msg: 数据对象

:param mypath: pdf文本保存路径

:return: 文本字典,于pdf提取结果

'''

headers = {}

# 邮件的From, To, Subject存在于根对象上:

for header in ['From', 'To', 'Subject', 'Date']:

value = msg.get(header, '')

if value:

if header == 'Date':

headers['date'] = value

if header == 'Subject':

# 需要解码Subject字符串:

value = self.decode_str(value)

headers['Subject'] = value

else:

# 需要解码Email地址:

hdr, addr = parseaddr(value)

name = self.decode_str(hdr)

value = u'%s ' % (name, addr)

if header == 'From':

from_address = value

headers['from'] = from_address

if header == 'To':

to_address = value

headers['to'] = to_address

# headers['date']=''

else:

headers['date'] = ''

for part in msg.walk():

filename = part.get_filename()

content_type = part.get_content_type()

charset = self.guess_charset(part)

if filename:

filename = self.decode_str(filename)

data = part.get_payload(decode=True)

if filename != None or filename != '':

if '.pdf' in filename:

print('Accessory: ' + filename)

headers['url'] = mypath + filename

self.savefile(filename, data, mypath)

with open('pdf.txt', 'wb')as f:

f.write(''.join(self.pdf_text(mypath + filename)).encode('utf-8'))

openfile = open('pdf.txt', 'r', encoding='utf-8')

names = money = mingxi = False

for line in openfile:

if names:

self.name_lis.append(line.strip())

# print(line.strip())

names = self.turn_on_off(line, names, '甲方(借款人):', '鉴于:\n')

if money:

self.money_lis.append(line.strip())

# print(line, )

money = self.turn_on_off(line, money, '第一条 借款金额、期限及利息、借款类型、借款提现', '第二条 还款\n')

if mingxi:

self.mingxi_lis.append(line.strip())

# print(line.strip())

mingxi = self.turn_on_off(line, mingxi, '2.4 还款计划明细\n',

'甲方还款日如发生变化的,甲方同意服务方以录音电话或电子邮件并辅助以短信的方\n')

headers['names'] = ''.join(self.name_lis)

headers['money'] = ''.join(self.money_lis)

headers['mingxi'] = ''.join(self.mingxi_lis)

else:

headers['names'] = ''

headers['money'] = ''

headers['mingxi'] = ''

headers['url'] = ''

email_content_type = ''

content = ''

if content_type == 'text/plain':

email_content_type = 'text'

if content_type == 'text/html':

email_content_type = 'html'

if charset:

try:

content = part.get_payload(decode=True).decode(charset)

except:

content = '英文'

headers['contents'] = ','.join(re.findall(u'[\u4e00-\u9fa5]+', content)).replace('宋体', '')

# print(headers)

return headers

@deco

def save_file(self):

email = str(input('请输入账号:'))

password = str(input('请输入授权码:'))

if '@163.' in email:

pop3_server = 'pop3.163.com'

elif '@126.' in email:

pop3_server = 'pop3.126.com' # 网易授权服务器地址

elif '@qq.com' in email: # 腾讯

pop3_server = 'pop.qq.com'

elif '@sina.com' or '@2008.sina' or '@51uc.com' in email: # 新浪

pop3_server = 'pop.sina.com'

elif '@188.com' in email:

pop3_server = 'pop3.188.com'

else:

logger.info('不支持此邮箱%s,或程序出错' % email)

print('暂不支持此邮箱')

exit()

mypath = PATH

# 连接到POP3服务器:

print(pop3_server)

logger.info('传入的账号是%s' % email)

server = poplib.POP3_SSL(pop3_server)

# 可以打开或关闭调试信息:

server.set_debuglevel(1)

# 可选:打印POP3服务器的欢迎文字:

print(server.getwelcome().decode('utf-8'))

# 身份认证:

server.user(email)

server.pass_(password)

try:

sql = "create table if not exists email_sina(username char(255) not null,froms char(255) not null,tos char(255) not null,subject char(255) not null primary key,dates char(255),fu_url char(255),contents char(255),names varchar(1000),money varchar(1000),detail varchar(1000))"

self.cursor.execute(sql)

self.db.commit()

print('创建email_sina表')

except Exception as e:

print('%s表已经存在了email_sina')

# stat()返回邮件数量和占用空间:

# print('Messages: %s. Size: %s' % server.stat())

# list()返回所有邮件的编号:

resp, mails, octets = server.list()

# 获取最新一封邮件, 注意索引号从1开始:

index = len(mails)

for i in range(1, index + 1):

resp, lines, octets = server.retr(i)

# lines存储了邮件的原始文本的每一行,

# 可以获得整个邮件的原始文本:

try:

msg_content = b'\r\n'.join(lines).decode('utf-8')

except:

continue

# 稍后解析出邮件:

msg = Parser().parsestr(msg_content)

dic = self.print_info(msg, mypath)

# print(dic)

try:

self.cursor.execute("replace into email_sina(`username`,`froms`,`tos`,`subject`,`dates`,`fu_url`,`contents`,`names`,`money`,`detail`) "

"values('"+email+"','"+dic['from']+"','"+dic['to']+"','"+dic['Subject']+"','"+dic['date']+"','"+dic['url']+"','"+dic['contents']+"','"+dic['names']+"','"+dic['money']+"','"+dic['mingxi']+"')") #ON DUPLICATE KEY UPDATE from=values('"+dic['from']+"'),to=values('"+dic['to']+"'),subject=values('"+dic['Subject']+"'),date=values('"+dic['date']+"'),fu_url=values('"+dic['url']+"'),contents=values('"+dic['contents']+"')")

self.db.commit()

print(dic['Subject'],'插入')

except Exception as e:

print(e)

self.db.rollback()

continue

server.close()

logger.info('账号解析完成')

self.db.close()

if __name__ == '__main__':

Email().save_file()

python pop3_python通过pop3方式登录邮箱(qq,新浪,网易)相关推荐

  1. 网易163vip邮箱、163.net邮箱、新浪vip邮箱、QQ邮箱,哪款更符合商务邮件的需求

    在现代商务沟通中,邮箱成为职场人士沟通交流的工具,那究竟哪种邮箱更符合商务往来的需求,TOM小编做了一个测评,将网易163vip邮箱,163.net邮箱,新浪vip邮箱,QQ邮箱等市面上常见的邮箱作对 ...

  2. 从入门到入土:Python爬虫学习|实例练手|爬取新浪新闻搜索指定内容|Xpath定位标签爬取|代码注释详解

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  3. VIP网易邮箱,163VIP邮箱,新浪vip等邮箱的对比分析

    关键词:vip邮箱.vip126邮箱.188vip邮箱.sina vip 邮箱.163.net邮箱 随着使用电子邮箱的人越来越多,邮箱不只存在免费邮箱,还存在VIP邮箱,比如:VIP网易邮箱,163v ...

  4. 天气预报js调用代码(QQ,新浪,265)

    天气预报js调用代码(qq,新浪,265) 本文章提供四款不同的调用天气预报的天气代码,包括我们可以调用中国气象台的天气预报,qq天气,新浪天气,265天气等方法啊.都非常方便等. 中国气象台 < ...

  5. 在foxmail和outlook中设置QQ邮箱、gmail邮箱、新浪邮箱、微软邮箱、网易邮箱等的方法...

    怎么用邮件客户端如outlook和foxmail来设置各种邮箱<?xml:namespace prefix = "o" ns = "urn:schemas-micr ...

  6. python 编程环境 微信_微信开发之新浪SAE上配置WeRoBot微信机器人,python,Mac环境...

    本文将带你了解微信开发新浪SAE上配置WeRoBot微信机器人,python,Mac环境,希望本文对大家学微信有所帮助. 废话不多说,直接上过程. 注册新浪sae,选择创建云应用,创建新应用,填好相关 ...

  7. Python爬虫与信息提取(八)将新浪热搜排名导入数据库

    python爬取新浪热搜排名并导入数据库 上一篇文章简单介绍了如何使用python爬取新浪微博的热搜排名: 爬虫实例:爬取新浪微博热搜排名 如果了解清楚原理的话是非常容易懂的,但是这样单纯的进行查询结 ...

  8. python pop3_Python使用POP3和SMTP协议收发邮件的示例代码

    先来了解一下收/发邮件有哪些协议: SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议.相当于中转站,将邮件发送到客户端. POP3协议 POP3 ...

  9. 这里是通过QQ邮箱 sina新浪邮箱 163邮箱的简单发送Email

    1.首先去官网下载发送Email的相应的jar文件如 smtp.jar mailapi.jar等 2.去QQ  sina 163中的设置里开启POP3/IMAP/SMTP/Exchange/CardD ...

最新文章

  1. php sql中regexp,[NCTF2019]SQLi(regexp注入)
  2. electron 安装import_Electron: 从零开始写一个记事本app
  3. web -httpd
  4. nyoj 1261 音痴又音痴的LT(离散化+树状数组求K小数)
  5. IPC经典入侵,比3389实用(图)
  6. 第六章插图以及代码文件和插图之间的对应关系
  7. inet_pton, inet_ntop
  8. u8薪资管理_用友U8习题集
  9. 玩了10小时赛博朋克2077,我觉得很失望
  10. Java 8 ConcurrentHashMap源码中竟然隐藏着两个BUG
  11. Ubuntu12.04编译vlc-android详细流程
  12. linux gnu ld,GNU LD用法
  13. 贝叶斯网络python实现_在Python中使用贝叶斯网络的实例
  14. 燕无锡计算机学校,第二十七届中国儿童青少年计算机表演赛无锡赛区决赛成绩-无锡少年宫.doc...
  15. MATLAB输出白色背景图片
  16. 计算机word文档无法预览,电脑打开Word文档内容显示不全或显示空白怎么解决
  17. 错误:error LNK2005 解决方法
  18. Windows DNS服务器策略
  19. gltf中的bufferViews,accessors和buffers
  20. 低频125KHZ|134.2KHZ安卓手持机|RFID智能终端CK-LH100-SYS性能与应用方案

热门文章

  1. Java中float_java中float什么意思?
  2. 红队渗透靶场之W1R3S靶场(超详细!)
  3. 操作系统上机4:抽烟者问题
  4. 计算机软考 教材 基本,计算机软考教材
  5. JS 中的 assign 方法究竟是 “深克隆” 还是 “浅克隆”?
  6. 警查审问四名嫌疑人,其中三人说真话,一人说谎。
  7. E生保长期医疗险详细解读
  8. Zbrush 人体手部模型雕刻太好用了,大大提高效率
  9. Thread Environment Block(TEB)
  10. RGB、YUV和HSV颜色空间模型