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 Parserfrom email.header import decode_headerfrom email.utils import parseaddrimport reimport poplibimport tracebackimport mysql.connectorfrom pdfminer.pdfparser import PDFDocument, PDFParserfrom pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter, PDFTextExtractionNotAllowedfrom pdfminer.converter import PDFPageAggregatorfrom pdfminer.layout import LTTextBoxHorizontal, LAParamsfrom 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 <%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()

转载于:https://www.cnblogs.com/zhangheng1/p/9088514.html

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

  1. python pop3_python通过pop3方式登录邮箱(qq,新浪,网易)

    python内置模块登录邮箱(SMTP/POP3) 使用pdfminer解析pdf合同附件,简单的提取一下里面的内容 压缩包已经上传! poplib_emain.py内容(完整版): # coding ...

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

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

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

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

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

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

  5. Python利用POP3/SMTP服务自动发送qq邮件

    自动发送qq邮件的两种方法 第一种:POP3/SMTP服务发送qq邮件 废话不多说,直接上代码. # coding:utf-8 import smtplib from email.mime.text ...

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

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

  7. python运维工程师面试题_新浪软件测试面试题-Linux运维工程师面试真题

    新浪软件测试面试题-Linux运维工程师面试真题 作为Linux运维工程师,进入大公司是开启职业新起点的关键,今天特别分享了其在新浪面试Linux运维及云计算工程师的题目和经历,希望对广大Linux运 ...

  8. 新浪云python开发_python,flask,SAE(新浪云),搭建开发微信公众账号

    将我们的服务器放在新浪云上,搭建微信公众账号,下面的代码将实现获取微信token,实现最简单的消息对话(用户说什么,我们回复什么). 因为网上有的代码有错,所以将这个传上来供大家借鉴 注意,代码中的空 ...

  9. Python爬虫爬取一篇韩寒新浪博客

    网上看到大神对Python爬虫爬到很多有用的信息,觉得很厉害,突然对想学Python爬虫,虽然自己没学过Python,但在网上找了一些资料看了一下,看到爬取韩寒新浪博客的视频,共三集,第一节讲爬取一篇 ...

  10. python 微盘下载_Python爬虫——百度+新浪微盘下载歌曲

    # -*- coding: utf-8 -*- """ Created on Mon Aug 7 09:22:12 2017 @author: JClian " ...

最新文章

  1. sql server 2008学习7 规范化和其他基本设计问题
  2. AngularJS之禅
  3. 一次OutOfMemoryError: GC overhead limit exceeded
  4. 庖丁解InnoDB之UNDO LOG
  5. hexo需要先编辑好html文件吗,教你定制Hexo的landscape打造自己的主题_html/css_WEB-ITnose...
  6. 【B/S】java(4)
  7. 串行通信(二):串口流控
  8. [bzoj] 2694 Lcm || 莫比乌斯反演
  9. 基于Matlab的标记分水岭分割算法
  10. IDEA Unable to import maven project: See logs for details
  11. m基于数字锁相环DPLL的分频器simulink仿真
  12. Lrc2Srt字幕转换精灵
  13. 我用前世的五百次回眸换今生与你一次擦肩而过
  14. freeipa 客户端 Kerberos认证 SSSD关系
  15. 官方AI语音系统电销机器人系统搭建|AI智能|电话机器人源码|2022最新电销外呼系统多服务器版本七牛科大免费识别阿里免费识别科大识别阿里识别
  16. ChatGPT神器免费使用,告别昂贵低效工具
  17. tif文件转为shp文件_从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题
  18. AI数学基础(2)--- 霍夫丁不等式
  19. eclipse的入门
  20. 菱形继承中构造函数调用问题

热门文章

  1. 考研数学一【高数】 第18讲多元函数积分学
  2. 基于vue和springboot的物流仓储管理系统
  3. 2021年软件测试工具总结——安全性测试工具【附官网地址】
  4. linux 更新软件命令 失败,(2015.1.13 更新)联合DSDT和SSDT进行反编译——减少DSDT和SSDT错误的尝试...
  5. IEEE Access模板caption无法换行,换行后标题不居中解决办法
  6. 使用orCAD Library Builder建立TO-220的封装
  7. 转载visio 绘图矢量图素材网站
  8. JSP学生日常记账系统综合课程设计报告
  9. NVIDIA Nsight Eclipse 安装
  10. 为什么在 Windows 7系统下无法显示 STEP 7 MicroWin SP9的帮助文件?