使用Python下载邮件(pop/imap)

更多

最近实现了一个使用Python自带的poplib和imaplib库下载邮件的程序,本文将对这个程序进行介绍。详细的模块介绍参见Python的官方文档(poplibimaplib)。

1. 程序源码

本程序的实现流程:

  • 1. 设置邮箱地址、密码、邮件服务器、传输协议(pop/imap)、是否使用SSL及输出目录,并对其进行解析。(为方便起见,上述设置本文使用了硬编码的方式,请根据自己的需求修改输入来源)
  • 2. 根据邮箱地址创建输出目录。
  • 3. 根据传输协议选择pop/imap对应的执行函数,读取邮件信息,解码并保存。
  • 4. 如果目录为空或异常退出,删除输出目录。

下面将对其中的核心函数(pop3、imap4、parse_email)进行详细讲解。

2. 核心函数讲解

2.1 pop3

poplib.POP3_SSL(host, port)poplib.POP3(host, port):连接pop3服务器。
conn.user(usr):设置用户名。
conn.pass_(pwd):设置密码。
len(conn.list()[1]):取得邮箱中邮件的个数。
conn.retr(i)[1]:获取邮件内容。

2.2 imap4

imaplib.IMAP4_SSL(host, port)imaplib.IMAP4(host, port):连接imap4服务器。
conn.login(usr, pwd):用户登录。
conn.list():取得邮箱中所有文件夹的信息。每行信息包含标识、分隔符、文件夹名称三项,文件夹名称为UTF-7编码(如需转码请自行查找实现方法,如:某实现)。
conn.select(folder_name, readonly=True):选择文件夹,其中readonly选项表示只读。如果不指定文件夹名称,则默认为INBOX。
conn.search(None, "ALL"):查询选定文件夹下的邮件。第一个参数为字符集,一般设为None。第二个参数“ALL”为查询条件,其详细用法可参见这篇文章。其返回值是邮件的编号。
conn.fetch(i, "(RFC822)"):使用RFC822协议获取编号为i的邮件的内容。

注意:在本实现中,每次下载邮件时会计算md5值,如果重复(不同文件夹均有该邮件)则不再下载该邮件。

2.3 parse_email

msg.walk():遍历该邮件的每个子部分。
part.get_filename():获取该部分的文件名(有则为附件,否则为邮件正文)。
part.get_payload(decode=True):获取邮件内容,并解码。
email.Header.Header(filename):获取邮件附件的头信息。
email.Header.decode_header(h):对头信息进行解码,获得解码后的文件名。

本文内容遵从CC3.0版权协议,转载请注明:转自Pythoner

本文链接地址:使用Python下载邮件(pop/imap)

  1. [em_sbq] 貌似代码挺长,略复杂。。

    • 收163时报错
    • 2015/10/28 4:47下午

    () “/” “INBOX”
    (‘OK’, [‘() “/” “INBOX”‘, ‘(\\Drafts) “/” “&g0l6P3ux-“‘, ‘(\\Sent) “/” “&XfJT0ZAB-“‘, ‘(\\Trash) “/” “&XfJSIJZk-“‘, ‘(\\Junk) “/” “&V4NXPpCuTvY-“‘, ‘() “/” “&Xn9USpCuTvY-“‘, ‘() “/” “&i6KWBZCuTvY-“‘])
    [*] Handling folder: INBOX
    333
    [-] Search folder INBOX failed: command SEARCH illegal in state AUTH, only allowed in states SELECTED
    有人怀疑163只能用邮箱大师收,不能用其他客户端收。
    163 邮箱今天屏蔽了所有 “未知” 客户端的邮件收发功能
    http://www.v2ex.com/t/152504

      • 刀刀亮
      • 2015/12/22 5:56下午

      不是这样的,你是需要在邮箱客户端里面进行设置的。我的163邮箱进行设置后就能收发邮件了

    • helscn
    • 2016/10/29 5:00下午

    端口定义中IMAP的键名写错了,应该为imap4:

    DEFAULT_PORT = {
    “pop3”: {False: 110, True: 995},
    “imap3”: {False: 143, True: 993},
    }

    源代码中为imap3,使用imap收取邮件会报错的.

      • alioth310
      • 2016/10/29 6:42下午

      谢谢,确实是

    • 落落
    • 2016/12/14 10:20上午

    有没有更高效的方式验证已下载的邮件,例如用邮件的唯一性标识,而不是抓取邮件类容用md5来验证,

      • alioth310
      • 2016/12/15 11:05上午

      可以看下IMAP4.uid方法(https://docs.python.org/2/library/imaplib.html#imaplib.IMAP4.uid)

  1. 暂无 Trackback

[em_zan] [em_yali] [em_xiao] [em_xhj] [em_tucao] [em_tu] [em_tiaopi] [em_sx] [em_sdz] [em_sbq] [em_mobai] [em_kzh] [em_ku] [em_ksh] [em_keai] [em_jiong] [em_jing] [em_hx] [em_han] [em_ganga] [em_daxiao] [em_cool] [em_chi] [em_bu] [em_bizui] [em_ai]

return top