import poplib
import os
from email.parser import Parser
from email.parser import BytesParser
from email.header import decode_header
from email.utils import parseaddr
#解析消息头中的字符串
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
#将邮件附件或内容保存至文件
#即邮件中的附件数据写入附件文件
def savefile(filename, data, path):
try:
filepath = path + filename
print('Save as: ' + filepath)
f = open(filepath, 'wb')
f.write(data)
except:
print(filepath + ' open failed')
finally:
f.close()
#获取邮件的字符编码,首先在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
#然后调用message的walk循环处理邮件中的每一个子对象(包括文本、html、附件一次或多次)
#邮件头属性中的filename存在则该子对象是附件,对附件名称进行编码并将附件下载到指定目录
#由于网络上传输的邮件都是编码以后的格式,需要在get_payload的时候指定decode=True来转换成可输出的编码
#如果邮件是text或者html格式,打印格式并输出转码以后的子对象内容
def print_info(msg,i):
subject = ""
print("+++++++++++++第%d封邮件+++++++++++++++"%i)
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
if header == 'Subject':
subject = value = decode_str(value)
else:
hdr, addr = parseaddr(value)
name = decode_str(addr)
value = name + ' < ' + addr + ' > '
print(header + ':' + value)
for part in msg.walk():
filename = part.get_filename()
content_type = part.get_content_type()
charset = guess_charset(part)
if filename:
filename = decode_str(filename)
ext = os.path.splitext(filename)
if ext != None:
filename = subject + str(i) +ext[-1]
else:
filename = subject + str(i)
data = part.get_payload(decode = True)
if filename != None or filename != '':
print('存在附件附件名: ' + filename)
savefile(filename, data, mypath)
#下载正文
# else:
# email_content_type = ''
# content = ''
# if content_type == 'text/plain':
# email_content_type = 'text'
# elif content_type == 'text/html':
# email_content_type = 'html'
# if charset:
# content = part.get_payload(decode=True).decode(charset)
# print(email_content_type + ' ' + content)
server = poplib.POP3_SSL('pop.163.com')
server.user('13911118361')
server.pass_('dbzq000686')
# server = poplib.POP3('pop.nesc.cn')
# server.user('dbzqecm')
# server.pass_('dbzq000686')
mypath = 'E:/mail'
# stat()返回邮件数量和占用空间:
print('邮件总数: %s. 大小: %s' % server.stat())
resp, mails, objects = server.list()
#print(mails)
for i in range(len(mails)):
k=i+1
#取出某一个邮件的全部信息
resp, lines, octets = server.retr(k)
#邮件取出的信息是bytes,转换成Parser支持的str
lists = []
for e in lines:
try:
lists.append(e.decode())
except:
print(e)
msg_content = '\r\n'.join(lists)
msg = Parser().parsestr(msg_content)
print_info(msg,(k))
#server.dele(index)
#提交操作信息并退出
server.quit()
邮件下载demo
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 本文以下面这个类库做为讲解解《强大的php发送邮件类》点击标题可以去下该类库。如果你需要查看更多的php类库可以点...