Python 用POP接收邮件

摘要:
Python提供了poplib模块,它为使用POP提供了一个方便的接口。Gmail仍然使用POP3_SSL(),并返回classPOP3实例p=popib POP3_SSL使用POP3.user(),POP3.pass_()方法登录个人帐户try:p.userp。通过,例外。error_Proto:#可能出现异常print3.现在您已经输入了个人帐户。接下来,使用POP3.list()函数查看邮箱中的电子邮件信息。

一、简介
  POP(Post Office Protocal)最长用的POP版本是POP3,因此本文是以POP3为主。POP3非常简单,可以用来从邮件服务器上下载邮件,然后删除这些邮件。功能非常有限,后面讲解的IMAP完胜它,不过作为入门级的,还是有必要介绍一下,也对学习SMTP有帮助。
  Python提供了poplib模块,它提供了使用POP的便利接口。
二、实例
  由于pop3功能较IMAP非常有限,而且我最后的程序并没有使用pop3,所以,不详细讲解,下面通过一个例子来说明下较为常见的功能。
  这个例子的功能为进入邮箱,查看所有的邮件。首先显示邮件的发件人、主题,查看邮箱主题内容。
1. 需要模块

import email, poplib, sys

2. 连接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')

3. 现在已经进入个人账户,下一步,利用POP3.list()函数查看邮箱内邮件信息。

  关于list()函数的详细说明,请点击这里
list()函数有三个返回值,分别是:response, listings, octets

  • response 应答信息,我测试中出现的结果:

    Python 用POP接收邮件第1张

  以b开头的字符串是Byte类型,我在实际测试的时候,返回的信息几乎都是Byte类型的。关于此类型及和普通字符串的转化会在后面举例说明。

  • listings 是形如['message_id message_size',...]若干各message-id和message_size构成的list。后面就是通过message_id来检索邮件。我测试中出现的结果:

  Python 用POP接收邮件第2张

  • octets 不是特别清楚啥意思。
response, listings, octets = p.list()

4. 最重要的就是listings数据

  如上面解释的,listings是个list类型的数据,接下来我们取出listings中的message_id,也就是上面的 "1" "2" "3" "4" ...

for listing in listings: #每次需要一个listing
number, size = listing.split() #由于number和size是以空格分隔,所以利用split()函数分开,split()默认以' '为分隔

  现在我们就取出了我们需要的message_id,也就是number,注意number需要从Byte类型转化为字符串类型。

5. POP3.top()函数

  利用此函数,取出邮件的headers,如下:

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

  lines存储内容,下面先转化成Message类型(lines默认为标准字符串类型,仅供说明,以实际代码为准)

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

6. 已经生成Message类,可以利用头部信息来查看From, Subject等信息

for header in 'From', 'To', 'Subject', 'Date':
    if header in message:
        print(header + ':' , message[header]) 

  注意,此时的message[header]可能不会输出我们想看到的内容,有可能出现格式错乱问题,比如中英文的转化,所以还需要特殊来处理。处理方式请继续往下看IMAP部分。

7. 取出邮件所有信息
  上面的top()函数只取出header信息以及根据参数确定的n行内容,如果用户希望查看邮件所有内容,那利用POP3.retr()函数取出

response, lines, octets = p.retr(number)

  还是将lines中的内容转换成Message类型:

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

8. 已经有了邮件所有信息,可以通过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()        

9. 此时,mail_content就是邮件正文了.

  当然,如果是中文的话,这件事仍未完,还需要将它转化未'gbk',利用如下方式:

mail_content = mail_content.decode('gbk')

10. 到现在,基本已经大功告成了,能够取出邮箱中所有的邮件,并查看邮件的header内容和邮件正文了^_^
三、完整代码:

#-*- encoding:utf-8 -*-
#-*- encoding:gbk -*-

import email, getpass, poplib, sys

hostname = '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('
'.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('
'.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 用POP接收邮件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle sqlldr使用示例Ping监控脚本下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

windows下设置GPU加速tensorflow运算(GT1050)

一、自己的环境 操作系统:win10   GPU:GTX1050+CUDA9.0+cuDNN    IDE:Pycharm    框架:tensorflow-gpu    解释器:Python3.6(强烈建议anaconda3,又方便又强大,下载太慢可以找镜像) 二、安装顺序 1、首先安装CUDA9.0。下载地址:https://developer.nvi...

Python 展示 codon happy new year

安装 安装软件 pip install dna_features_viewer -i https://pypi.tuna.tsinghua.edu.cn/simple 代码 from dna_features_viewer import GraphicFeature, GraphicRecord sequence = "CAUGCGCCUCCUUAUA...

python django 连接 sql-server

1.准备工作 python3.6连接sqlserver数据库需要引入pymssql模块 pymssql官方:https://pypi.org/project/pymssql/ 没有安装的话需要: pip安装: pip install pymssql   2.连接数据库 首先你得明确目标数据库的:'服务器名称',"账户名称","密码","数据库名称"...

Shell终端收听音乐--网易云音乐命令行版

Musicbox:网易云音乐命令行版本 高品质网易云音乐命令行版本,简洁优雅,丝般顺滑,基于Python编写。 这款命令行的客户端使用 Python 构建,以 mpg123 作为播放后端: Vim 式的流畅操作,支持快捷键绑定 支持电台、收藏等各种特色功能 支持 OS X 及各类 Linux 发行版 安装Python2.* pacman -S pytho...

基础面试题

1. 为什什么学习Python? Life is short, You need Python 2. 通过什什么途径学习的Python? pass 3. Python和Java、PHP、C、C#、C++等其他语⾔言的对比? pass 4. 简述解释型和编译型编程语言? 将由高级语言编写的程序文件转换为可执行文件(二进制的)有两种方式,编译和解释,编译是在...

离线安装python的ibm_db模块

目前手头的项目是一个UI自动化框架,其中有些模块的功能需要与DB2数据库交互,于是百度了一下python操作DB2的模块是 ibm_db。 然而我的工作机器是一台windows堡垒机,不能联网,固不能直接使用pip进行安装,所以只能使用离线安装包了。 百度了一下,由于ibm_db模块的安装依赖于其他文件,所以需要下载好几个文件,按照百度上的方法试了一通,然...