刚开始用的poplib库,后来发现imbox库中可以直接获取未读邮件,又改用了imbox,下面两种方法都有,自己辨别使用;
读取表格内容,也分别写了xlwt.xlrd,两种也有区别
# -*- coding: utf-8 -*-
# @Time : 2020/05/28 16:37
# @File : zking_receive_mail.py
# ==================================
import csv
import codecs
import poplib
import xlwt
import xlrd
from imbox import Imbox
import keyring
import sys,os
# 解析邮件
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
from openpyxl import load_workbook
print ("sys.argv[0]------"+sys.argv[0])
def cur_file_dir():
# 获取脚本路径
path = sys.path[0]
# 判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
if os.path.isdir(path):
return path
elif os.path.isfile(path):
return os.path.dirname(path)
print ("path----"+path)
# 解析消息头中的字符串
# 没有这个函数,print出来的会使乱码的头部信息。如'=?gb18030?B?yrXWpL3hufsueGxz?='这种
# 通过decode,将其变为中文
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
# 解码邮件信息分为两个步骤,第一个是取出头部信息
# 首先取头部信息
# 主要取出['From','To','Subject']
'''
From: "=?gb18030?B?anVzdHpjYw==?=" <zzvonfzz@163.com>
To: "=?gb18030?B?ztLX1Ly6tcTTys/k?=" <zzvonfzz@163.com>
Subject: =?gb18030?B?dGV4dMTjusM=?=
'''
# 如上述样式,均需要解码
def get_header(msg):
info = []
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
# 文章的标题有专门的处理方法
if header == 'Subject':
value = decode_str(value)
elif header in ['From', 'To']:
# 地址也有专门的处理方法
hdr, addr = parseaddr(value)
name = decode_str(addr)
# value = name + ' < ' + addr + ' > '
value = name
info.append(value)
print(header + ':' + value)
return info[0],value
# 头部信息已取出
# 获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找
def guess_charset(msg):
charset = msg.get_charset()
if charset is None:
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos + 8:].strip()
return charset
# 邮件正文部分
# 取附件
# 邮件的正文部分在生成器中,msg.walk()
# 如果存在附件,则可以通过.get_filename()的方式获取文件名称
def get_file(msg):
f