Skip to content

Commit f3c2755

Browse files
committed
add pop3 demo
1 parent 38988b9 commit f3c2755

1 file changed

Lines changed: 74 additions & 0 deletions

File tree

email/fetchmail_pop3.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import poplib
4+
import email
5+
from email.parser import Parser
6+
from email.header import decode_header
7+
from email.utils import parseaddr
8+
9+
def guess_charset(msg):
10+
charset = msg.get_charset()
11+
if charset is None:
12+
content_type = msg.get('Content-Type', '').lower()
13+
pos = content_type.find('charset=')
14+
if pos >= 0:
15+
charset = content_type[pos + 8:].strip()
16+
return charset
17+
18+
def decode_str(s):
19+
value, charset = decode_header(s)[0]
20+
if charset:
21+
value = value.decode(charset)
22+
return value
23+
24+
def print_info(msg, indent=0):
25+
if indent == 0:
26+
for header in ['From', 'To', 'Subject']:
27+
value = msg.get(header, '')
28+
if value:
29+
if header=='Subject':
30+
value = decode_str(value)
31+
else:
32+
hdr, addr = parseaddr(value)
33+
name = decode_str(hdr)
34+
value = u'%s <%s>' % (name, addr)
35+
print('%s%s: %s' % (' ' * indent, header, value))
36+
if (msg.is_multipart()):
37+
parts = msg.get_payload()
38+
for n, part in enumerate(parts):
39+
print('%spart %s' % (' ' * indent, n))
40+
print('%s--------------------' % (' ' * indent))
41+
print_info(part, indent + 1)
42+
else:
43+
content_type = msg.get_content_type()
44+
if content_type=='text/plain' or content_type=='text/html':
45+
content = msg.get_payload(decode=True)
46+
charset = guess_charset(msg)
47+
if charset:
48+
content = content.decode(charset)
49+
print('%sText: %s' % (' ' * indent, content + '...'))
50+
else:
51+
print('%sAttachment: %s' % (' ' * indent, content_type))
52+
53+
email = raw_input('Email: ')
54+
password = raw_input('Password: ')
55+
pop3_server = raw_input('POP3 server: ')
56+
57+
server = poplib.POP3(pop3_server)
58+
#server.set_debuglevel(1)
59+
print(server.getwelcome())
60+
# 认证:
61+
server.user(email)
62+
server.pass_(password)
63+
print('Messages: %s. Size: %s' % server.stat())
64+
resp, mails, octets = server.list()
65+
# 获取最新一封邮件, 注意索引号从1开始:
66+
resp, lines, octets = server.retr(len(mails))
67+
# 解析邮件:
68+
msg = Parser().parsestr('\r\n'.join(lines))
69+
# 打印邮件内容:
70+
print_info(msg)
71+
# 慎重:将直接从服务器删除邮件:
72+
# server.dele(len(mails))
73+
# 关闭连接:
74+
server.quit()

0 commit comments

Comments
 (0)