Python 用POP接收邮件一、简介  POP(Post Office Protocal)最长用的POP版本是POP3,因此本文是以POP3为主。POP3非常简单,可以用来从邮件服务器上下载邮件,然后删除这些邮件。功能非常有限,后面讲解的IMAP完胜它,不过作为入门级的,还是有必要介绍一下,也对学习SMTP有帮助。  Python提供了poplib模块,它提供了使用POP的便利接口。二、实例  由于pop3功能较IMAP非常有限,而且我最后的程序并没有使用pop3,所以,不详细讲解,下面通过一个例子来说明下较为常见的功能。  这个例子的功能为进入邮箱,查看所有的邮件。首先显示邮件的发件人、主题,查看邮箱主题内容。需要模块import email, poplib, sys连接POP3服务器,登录个人邮箱账户  poplib提供POP3()方法和POP3_SSL()方法连接POP3服务器,区别和SMTP一样。gmail仍然使用POP3_SSL()方式,并返回class POP3实例p = poplib.POP3_SSL('pop.gmail.com')   使用POP3.user(), POP3.pass_()方法来登录个人账户try:p.user(user)

p.pass_(passwd)except poplib.error_proto: #可能出现的异常print('login failed')现在已经进入个人账户,下一步,利用POP3.list()函数查看邮箱内邮件信息。  关于list()函数的详细说明,请点击这里。list()函数有三个返回值,分别是:response, listings, octetsresponse 应答信息,我测试中出现的结果:      以b开头的字符串是Byte类型,我在实际测试的时候,返回的信息几乎都是Byte类型的。关于此类型及和普通字符串的转化会在后面举例说明。listings 是形如['message_id message_size',...]若干各message-id和message_size构成的list。后面就是通过message_id来检索邮件。我测试中出现的结果:  octets 不是特别清楚啥意思。response, listings, octets = p.list()最重要的就是listings数据  如上面解释的,listings是个list类型的数据,接下来我们取出listings中的message_id,也就是上面的 "1" "2" "3" "4" ...for listing in listings: #每次需要一个listingnumber, size = listing.split() #由于number和size是以空格分隔,所以利用split()函数分开,split()默认以' '为分隔  现在我们就取出了我们需要的message_id,也就是number,注意number需要从Byte类型转化为字符串类型。POP3.top()函数  利用此函数,取出邮件的headers,如下:response, lines, octets = p.top(number , 0)  lines存储内容,下面先转化成Message类型(lines默认为标准字符串类型,仅供说明,以实际代码为准)message = email.message_from_string('n'.join(lines))已经生成Message类,可以利用头部信息来查看From, Subject等信息for header in 'From', 'To', 'Subject', 'Date':if header in message:

print(header + ':' , message[header])   注意,此时的message[header]可能不会输出我们想看到的内容,有可能出现格式错乱问题,比如中英文的转化,所以还需要特殊来处理。处理方式请继续往下看IMAP部分。取出邮件所有信息  上面的top()函数只取出header信息以及根据参数确定的n行内容,如果用户希望查看邮件所有内容,那利用POP3.retr()函数取出response, lines, octets = p.retr(number)  还是将lines中的内容转换成Message类型:message = email.message_from_string('n'.join(lines))已经有了邮件所有信息,可以通过Message.get_payload()取出邮件正文了。  但是,get_payload()函数并不一定返回邮件正文。以下是官方说明:Return the current payload, which will be a list of Message objects when is_multipart() is True, or a string when is_multipart() is False.   在实际测试中,返回的就是a list of Message objects,这个问题困扰我很长时间,最终还是解决了,通过以下方法:复制代码maintype = message.get_content_maintype()if maintype == 'multipart':for part in message.get_payload():

if part.get_content_maintype() == 'text':

mail_content = part.get_payload(decode=True).strip()elif maintype == 'text':mail_content = e.get_payload(decode=True).strip() 复制代码此时,mail_content就是邮件正文了.  当然,如果是中文的话,这件事仍未完,还需要将它转化未'gbk',利用如下方式:mail_content = mail_content.decode('gbk')到现在,基本已经大功告成了,能够取出邮箱中所有的邮件,并查看邮件的header内容和邮件正文了^_^三、完整代码:复制代码-- encoding:utf-8 ---- encoding:gbk --import email, getpass, poplib, syshostname = 'pop.gmail.com'user = 'myUserName@gmail.com'passwd = '*'p = poplib.POP3_SSL('pop.gmail.com') #与SMTP一样,登录gmail需要使用POP3_SSL() 方法,返回class POP3实例try:# 使用POP3.user(), POP3.pass_()方法来登录个人账户

p.user(user)

p.pass_(passwd)except poplib.error_proto: #可能出现的异常print('login failed')else:response, listings, octets = p.list()

for listing in listings:

number, size = listing.split() #取出message-id

number = bytes.decode(number)

size = bytes.decode(size)

print('Message', number, '( size is ', size, 'bytes)')

print()

response, lines, octets = p.top(number , 0)

# 继续把Byte类型转化成普通字符串

for i in range(0, len(lines)):

lines[i] = bytes.decode(lines[i])

#利用email库函数转化成Message类型邮件

message = email.message_from_string('\n'.join(lines))

# 输出From, To, Subject, Date头部及其信息

for header in 'From', 'To', 'Subject', 'Date':

if header in message:

print(header + ':' , message[header])

#与用户交互是否想查看邮件内容

print('Read this message [ny]')

answer = input()

if answer.lower().startswith('y'):

response, lines, octets = p.retr(number) #检索message并返回

for i in range(0, len(lines)):

lines[i] = bytes.decode(lines[i])

message = email.message_from_string('\n'.join(lines))

print('-' * 72)

maintype = message.get_content_maintype()

if maintype == 'multipart':

for part in message.get_payload():

if part.get_content_maintype() == 'text':

mail_content = part.get_payload(decode=True).strip()

elif maintype == 'text':

mail_content = e.get_payload(decode=True).strip()

try:

mail_content = mail_content.decode('gbk')

except UnicodeDecodeError:

print('Decoding to gbk error')

sys.exit(1)

print(mail_content)

print()

print('Delete this message? [ny]')

answer = input()

if answer.lower().startswith('y'):

p.dele(number)

print('Deleted')finally:print('log out')

p.quit()

python 接收邮件服务器地址_python登录pop3邮件服务器接收邮件的方法相关推荐

  1. python教程app下载地址_Python爬取APP下载链接的实现方法

    首先是准备工作 Python 2.7.11:下载python 其中python2和python3目前同步发行,我这里使用的是python2作为环境.Pycharm是一款比较高效的Python IDE, ...

  2. win10如何修改dns服务器地址,win10如何修改dns服务器地址

    win10如何修改dns服务器地址 内容精选 换一换 您可以通过华为云的域名注册服务管理您的域名,如表1所示. 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践. ...

  3. 报税系统服务器地址怎么填,报税上海服务器地址

    报税上海服务器地址 内容精选 换一换 服务器迁移通常有三种手段:全新部署业务.主机迁移服务.镜像迁移,如表1所示.对于华为云上云服务器的跨帐号跨区域迁移,建议采用镜像迁移方式.跨帐号跨区域迁移云服务器 ...

  4. espace服务器地址为空,espace手机服务器地址设置

    espace手机服务器地址设置 内容精选 换一换 TTL(Time-To-Live)指解析记录在本地DNS服务器中的缓存时间.本地DNS服务器指用户客户端(手机.电脑等)连接Internet网络使用的 ...

  5. 浙江移动无线dns服务器地址,浙江移动4g的dns服务器地址

    浙江移动4g的dns服务器地址 内容精选 换一换 当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的.本章节以Windows 2012版本操作系统为例进行N ...

  6. 国内和国外DNS服务器地址 全国各地电信DNS服务器地址

    国内和国外DNS服务器地址 全国各地电信DNS服务器地址 北京:202.96.199.133  202.96.0.133 202.106.0.20 202.106.148.1 202.97.16.19 ...

  7. 奇瑞文档云服务器地址,奇瑞文档云服务器地址是多少

    奇瑞文档云服务器地址是多少 内容精选 换一换 SAP云服务器规格在申请SAP ECS之前,请参考SAP标准Sizing方法进行SAPS值评估,并根据Sizing结果申请云端ECS服务器资源,详细信息请 ...

  8. js文件 本地 上传服务器地址,js 本地文件同步服务器地址

    js 本地文件同步服务器地址 内容精选 换一换 用户可以将本地NAS存储中的数据,通过云专线迁移至云上SFS Turbo文件系统中,进行云上业务拓展.此方案通过在云上创建一台Linux操作系统的云服务 ...

  9. (转载)国内和国外DNS服务器地址 全国各地电信DNS服务器地址

    国内和国外DNS服务器地址 全国各地电信DNS服务器地址 北京:202.96.199.133  202.96.0.133 202.106.0.20 202.106.148.1 202.97.16.19 ...

  10. 深圳自然人报税系统的服务器地址,自然人报税网络设置服务器地址

    自然人报税网络设置服务器地址 内容精选 换一换 DNS服务器用于解析弹性文件服务中文件系统的域名.DNS服务器东北区IP地址为100.125.6.250,其它区域详情请参见华为云内网DNS地址.默认情 ...

最新文章

  1. Eclipse更改系统主题
  2. DL之DeepLabv2:DeepLab v2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  3. 2018 中国服务创新大会 | 早鸟票正式开售
  4. vux flexbox使用_Flexbox用大的,彩色的动画gif进行解释
  5. php 本站已运行了多少天,本站已运行了多少天”代码(js版+php版)
  6. 卷起来了!DeepMind发布媲美普通程序员的AlphaCode,同日OpenAI神经数学证明器拿下奥数题...
  7. Canvas X Draw for Mac7.0.2英文版
  8. Linux设备驱动入门
  9. matlab中怎么计算信噪比,如何计算通信中的信噪比SNR
  10. 【学习笔记】系统集成项目管理一:项目进度网络图(01)单双代号网络图
  11. amend用法 git 信息_详解git commit --amend 用法
  12. ffmpeg编程查看视频文件信息
  13. java语言情话_用Java实现每天给对象发情话
  14. 测试英语词水平的软件,英语词汇量测试程序
  15. 静态内部类、静态变量的加载次数-理解静态内部类实现线程安全的单例模式懒加载
  16. 入侵介绍: 1。上传漏洞 2。暴库 3。注入 4。旁注 5。COOKIE诈骗
  17. ggplot2图形排版:patchwork包简单入门
  18. 在服务器上搭建个人网盘
  19. xlwings模块(数据保存为xlsx文件)
  20. 安卓手机管理_今天你又刷了多久手机?使用 App Usage 管理和追踪手机及应用的使用情况(安卓)...

热门文章

  1. 怎么查看自己电脑是否被安装远程监控
  2. [蓝牙 4.0 CC2541 开发] BLE架构与OSAL
  3. gdiplus画直线
  4. WebService SOAPUI接口测试
  5. 网安学习日志(5)流量分析基础
  6. Latex学习--参考文献排版(ieee access 模板)
  7. layui官网地址(备份),layui文档地址(新)
  8. LightTools.v5.1_完整好用版本\
  9. latex毕业论文模板(附源码)
  10. Java常见算法(一)