[Python3] 使用imaplib收取邮件

邮件服务器分为两种,一种是POP3另一种则是IMAP。由于在作者工作时使用的邮箱只有IMAP,所以本文将讲解imaplib库进行获取

第一步 安装所需库

首先不用说,安装基本的库。

pip install imaplib
pip install email

安装完毕以后,打开你的编辑器。开始编写代码吧

第二步 连接到邮箱

import imaplib,email # 导入imap库和email库
from email.parser import BytesParser # 导入解析库

conn = imaplib.IMAP4(port="143",host="imap.xxx.com") # 输入端口以及服务器地址
conn.login("xxxxx@xxx.com","xxxxxxx") # 输入邮箱和密码登录
conn.select() # 输入邮箱文件夹搜索,默认INBOX
# results, data = conn.search('GB2312','SUBJECT "支付宝到账999"'.encode('gb2312')) 搜索中文标题邮件
results, data = conn.search(None,'ALL') # 搜索全部邮件
mail_list = list(reversed(data[0].split())) # 获取邮件列表,并分隔

第三步 获取邮件

下面这串代码是获取邮件的必备代码

for num in mail_list: # 循环获取到的邮件列表
    result, content = conn.fetch(num,'(RFC822)') # 传入邮件编号并向服务器取得邮件内容
    msg = BytesParser().parsebytes(content[0][1]) # 获取邮件

然后,下面这个是获取所有邮件标题并输出

import imaplib,email # 导入imap库和email库
from email.parser import BytesParser # 导入解析库

conn = imaplib.IMAP4(port="143",host="imap.bsiie.com") # 输入端口以及服务器地址
conn.login("xxxxx@xxx.com","xxxxxxx") # 输入邮箱和密码登录
conn.select() # 输入邮箱文件夹搜索,默认INBOX
results, data = conn.search(None,'ALL') # 搜索全部邮件
mail_list = list(reversed(data[0].split())) # 获取邮件列表,并分隔

for num in mail_list: # 循环获取到的邮件列表
    result, content = conn.fetch(num,'(RFC822)') # 传入邮件编号并向服务器取得邮件内容
    msg = BytesParser().parsebytes(content[0][1]) # 获取邮件
    subject =  email.header.decode_header(msg.get("Subject")) # 获取并解码邮件标题
    subject_bytes = subject[0][0] #读取字节流的标题保存
    subject_charset = subject[0][1] # 读取字节流的编码格式
    if None == subject_charset: # 如果编码格式是空
        subject = subject_bytes # 直接字节流输出
    else:
        subject = str(subject_bytes,subject_charset) # 解码输出
    print(subject)

下面这个是获取所有邮件发件人名字与邮箱并输出

import imaplib,email # 导入imap库和email库
from email.parser import BytesParser # 导入解析库

conn = imaplib.IMAP4(port="143",host="imap.bsiie.com") # 输入端口以及服务器地址
conn.login("xxxxx@xxx.com","xxxxxxx") # 输入邮箱和密码登录
conn.select() # 输入邮箱文件夹搜索,默认INBOX
results, data = conn.search(None,'ALL') # 搜索全部邮件
mail_list = list(reversed(data[0].split())) # 获取邮件列表,并分隔

for num in mail_list: # 循环获取到的邮件列表
    result, content = conn.fetch(num,'(RFC822)') # 传入邮件编号并向服务器取得邮件内容
    msg = BytesParser().parsebytes(content[0][1]) # 获取邮件
    email_from =  email.header.decode_header(msg.get("from")) # 获取并解码邮件发件人
    email_from_bytes = email_from[0][0] #读取字节流的标题保存
    email_from_charset = email_from[0][1] # 读取字节流的编码格式
    if None == email_from_charset: # 如果编码格式是空
        email_from = email_from_bytes # 直接字节流输出
    else:
        email_from = str(email_from_bytes,email_from_charset) # 解码输出
    print(email_from)

下面是获取所有邮件内容,获取内容的函数具体原理作者也没搞明白。只要照抄便是

import imaplib,email # 导入imap库和email库

conn = imaplib.IMAP4(port="143",host="imap.bsiie.com") # 输入端口以及服务器地址
conn.login("xxxxx@xxx.com","xxxxxxx") # 输入邮箱和密码登录
conn.select() # 输入邮箱文件夹搜索,默认INBOX
results, data = conn.search(None,'ALL') # 搜索全部邮件
mail_list = list(reversed(data[0].split())) # 获取邮件列表,并分隔

def get_body(msg):
    if msg.is_multipart():
        return get_body(msg.get_payload(0))
    else:
        return msg.get_payload(None,True)

for num in mail_list: # 循环获取到的邮件列表
    result, content = conn.fetch(num,'(RFC822)') # 传入邮件编号并向服务器取得邮件内容
    print(str(get_body(email.message_from_bytes(content[0][1])))) # 获取邮件内容,并转成字符串形式输出

原创文章,作者:悠静萝莉,如若转载,请注明出处:https://www.ksand.cn/p/361

发表评论

电子邮件地址不会被公开。 必填项已用*标注