业务场景

客户要求写一个程序能够自动登录他的邮箱,然后读取邮件中的求职者简历,并将该类型的邮件转为pdf以及获取关键信息和附件。

实现方式

1、使用imaplib库访问医院HR邮箱,获取邮件并使用email将邮件信息解析为html信息
2、筛选出简历信息后使用pdfkit将邮件内容转为pdf
3、使用etree读取html并通过find找寻关键信息存
主要逻辑:
1、业务方法resume_collect调用getMail获取邮件list进行解析
2、获取邮件方法getMail使用imaplib登录邮箱获取邮件信息通过解析邮件首部方法parseHeader、解析邮件/信体方法parseBody将邮件元数据转为易解析的html和text信息
3、解析邮件首部方法parseHeader通过email库解析邮件的主题、发件人、收件人等首部信息
4、解析邮件/信体方法parseBody通过email库解析邮件的信体以及附件内容

获取邮件getMail方法

def getMail(self, host, username, password, port=993):try:serv = imaplib.IMAP4_SSL(host, port)except Exception, e:serv = imaplib.IMAP4(host, port)serv.login(username, password)# MAP4 ID extension 通信规则 RFC 2971 协议 上传ID信息imaplib.Commands['ID'] = ('AUTH')args = ("name", "XXXX", "contact", "XXXX@163.com", "version", "1.0.0", "vendor", "myclient")typ, dat = serv._simple_command('ID', '("' + '" "'.join(args) + '")')# 选择邮箱serv.select("INBOX")# 搜索邮件内容typ, data = serv.search(None, 'ALL')email_list = []for num in data[0].split()[::-1]:typ, data = serv.fetch(num, '(RFC822)')text = data[0][1]message = email.message_from_string(text)  # 转换为email.message对象subject_name = self.parseHeader(message)  # 解析邮件首部body, attach = self.parseBody(message)  # 解析邮件/信体email_list.append({'subject_name': subject_name, 'body': body, 'attach': attach})serv.close()serv.logout()return email_list

解析邮件首部parseHeader方法

def parseHeader(self, message):""" 解析邮件首部 """subject = message.get('subject')h = email.Header.Header(subject)dh = email.Header.decode_header(h)if dh[0][0] and dh[0][1]:subject = unicode(dh[0][0], dh[0][1])else:if dh[0][0]:subject = unicode(dh[0][0])else:if dh[0][1]:subject = unicode(dh[0][1])else:subject = u'无法解析改标题'# 主题return subject# 发件人# print 'From:', email.utils.parseaddr(message.get('from'))[1]# 收件人# print 'To:', email.utils.parseaddr(message.get('to'))[1]# 抄送人# print 'Cc:', email.utils.parseaddr(message.get_all('cc'))[1]

解析邮件/信体parseBody方法

def parseBody(self, message):""" 解析邮件/信体 """body = []attach = []# 循环信件中的每一个mime的数据块for part in message.walk():# 这里要判断是否是multipart,是的话,里面的数据是一个message 列表if not part.is_multipart():charset = part.get_charset()# print 'charset: ', charsetcontenttype = part.get_content_type()# print 'content-type', contenttypename = part.get_param("name")  # 如果是附件,这里就会取出附件的文件名if name:# 有附件# 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC.rar?=这样的文件名fh = email.Header.Header(name)fdh = email.Header.decode_header(fh)fname = fdh[0][0]attach_data = part.get_payload(decode=True) # 解码出附件数据,然后存储到文件中attach.append((fname, attach_data))else:# 不是附件,是文本内容body.append(part.get_payload(decode=True))  # 解码出文本内容,直接输出来就可以了。return body, attach

主体业务resume_collect方法

本例是一个从邮箱获取简历邮件的实现,其他的用法可以根据情况修改主体业务方法
由于实际业务内容太多,所以只拆了主要骨架出来,看起来不是很连贯,不过也不影响理解,具体解析方式还得自己打断点看解析的邮件内容是什么样的。

# 从收件服务器的用户的邮箱中获取邮件信息
def resume_collect(self, server_config):email_list = self.getMail(server_config.server, server_config.user, server_config.password)for rec in email_list:if '51job' in rec['body'][0]:try:channel = '前程无忧'html_obj = etree.HTML(unicode(rec['body'][1], "utf-8"))info_xmls = html_obj.xpath('//td/strong')name = info_xmls[0].text.replace('\r\n', '').replace(' ', '')# 此处通过etree在html中搜寻过滤有效内容except:channel = '前程无忧'name = rec['subject_name']down_link = '由于邮件页面改变,当前解析脚本已无法解析,请联系开发人员修复'elif '智联' in rec['body'][0]:try:channel = '智联招聘'html_obj = etree.HTML(unicode(rec['body'][1], "utf-8"))name = html_obj.xpath('//table/tbody/tr/td/div[@class="call-tip"]/b')[0].text# 此处通过etree在html中搜寻过滤有效内容except:channel = '智联招聘'name = rec['subject_name']down_link = '由于邮件页面改变,当前解析脚本已无法解析,请联系开发人员修复'else:name = rec['subject_name']if name:if rec.get('attach', []):# 获取附件for attach_rec in rec['attach']:datas = base64.encodestring(attach_rec[1])# 把邮件html转为pdf存入附件try:for html_rec in rec['body']:if 'html' in html_rec or '<div>' in html_rec:datas = base64.encodestring(pdfkit.from_string(str(unicode(html_rec, "utf-8")), False, options={'encoding': 'UTF-8'}))breakexcept:pass

python获取邮件并转为pdf相关推荐

  1. PYTHON 获取邮件发送时间

    今天在自己写得shit山上继续堆. 问题如下:用python获取邮件的发送时间. CSDN就是这个地方不太好:大牛基本上没有,假如有大牛也不屑于解决这种问题. python有一个模块email,但是里 ...

  2. 使用python批量将word转为pdf

    前言 最近遇到一个问题,打印大量的word,自知word在不同打印店格式可能会发生变化,于是就想去将其转为pdf,在百度上去搜索,无奈搜不到相关程序,于是就使用英语去搜索,".doc to ...

  3. 利用python将图片格式转为PDF

    之前在朋友圈发现有人要将图片转为PDF,想着自己记录一下啊,不知道以后能不能用的上 需要的两个库(pillow,pypdf2) pip install xxx 就好了 代码部分 import os f ...

  4. PYTHON如何自动处理邮件(三)——python获取邮件体

    list会返回一个邮件列表,是一个有三个元素的列表.其中第二个元素是所有邮件的序号. 比如说:你邮箱里有10个邮件,那么列表就是1-10. TIP:如果你是老程序员.老C或者老python,列表第一位 ...

  5. python获取邮件内容_python 接收邮件获取邮件内容

    收取邮件有两种协议,POP3和IMAP,POP3相对于IMAP功能较少无法对邮件进行更深层次的操作,因此本文使用IMAP协议收取邮件.python提供了很多收邮件的模块,本文使用imaplib来接收邮 ...

  6. python 读取邮件内容_python获取邮件内容(邮件内容为html)

    用python获取邮件内容比较简单,直接用现成的imap和pop3包即可,但是有时候邮件的内容不是plainText而是html甚至是一个url链接,原本的操作流程是点击url获取内容(比如csv等等 ...

  7. python将数字转为0010_用Python将HTML转为PDF。

    上期提到了如何获取公众号文章信息,这回就说下怎么将网页转为PDF,方便平常学习. 然后扩散一下之前一个比赛的结果(华章计算机抖音大赛). 顺便谈谈自己对今后送书的一个想法. 另外之前的送书活动,有中奖 ...

  8. python将html存为pdf_用Python将HTML转为PDF。

    上期提到了如何获取公众号文章信息,这回就说下怎么将网页转为PDF,方便日常学习.html 而后扩散一下以前一个比赛的结果(华章计算机抖音大赛).数据库 顺便谈谈本身对从此送书的一个想法.微信 另外以前 ...

  9. python html转pdf 调整大小_用Python将HTML转为PDF。

    上期提到了如何获取公众号文章信息,这回就说下怎么将网页转为PDF,方便平常学习. 然后扩散一下之前一个比赛的结果(华章计算机抖音大赛). 顺便谈谈自己对今后送书的一个想法. 另外之前的送书活动,有中奖 ...

最新文章

  1. 重磅直播|大规模点云可视化技术
  2. java方法体逻辑不会写怎么办,想自己写框架?不会写Java注解可不行
  3. 关于web服务器TIME_WAIT值高的问答
  4. hdu-Frosh Week(树状数组)
  5. C++三大继承构造函数的执行顺序详解
  6. AJAX(2),我的第一个AJAX程序
  7. 配对碱基链(信息学奥赛一本通-T1135)
  8. 基于vue2+nuxt构建的高仿饿了么(2018版)
  9. 揭秘ASP.NET 2.0的Eval方法
  10. WORD中如何进行双行合一
  11. 这15个Java多线程面试题及回答你确定不来看看!
  12. doc 问卷调查模板表_问卷调查表格式范本.doc
  13. 数学建模常用算法—熵权法(EWM)
  14. 2022-2028年中国航空货运产业发展动态及竞争战略分析报告
  15. layui-layer.open打开新页面进行数据处理,处理完成后数据表格重载问题
  16. 拼多多关键词搜索采集商品数据接口,拼多多分类ID搜索采集商品销量接口,拼多多上货接口,拼多多商品列表API接口
  17. 《论文阅读》Global-Local Bidirectional Reasoning for Unsupervised Representation Learning of 3D Point Clou
  18. warning: go env -w GO111MODULE=... does not override conflicting OS environment variable
  19. 最详细的教程axure新手入门:Axure教程
  20. 用计算机模拟股票大盘,股票模拟盘操作与实盘不同之处有哪些

热门文章

  1. python学习教程12-从文本中获取电话号码2
  2. Android即时通讯--仿QQ即时聊天:(一)初识Socket
  3. 手机连接电脑服务器未响应怎么解决办法,电脑DNS服务器未响应怎么处理呢?
  4. socket中结构与函数
  5. 《非暴力沟通两性篇》读书笔记
  6. 基于联邦学习中毒攻击的防御策略
  7. join()方法的作用
  8. 全国高校信息 ,全国市州信息 ,全国省市信息 ,全国区县联查信息 2019-08-27
  9. 你真的会用ls命令吗?--文件管理命令(ls命令详解)
  10. Echarts地图china.js