Python实现IMAP协议接收并解析邮件内容

Python实现IMAP协议接收并解析邮件内容

**前言:**昨天接到这个任务,然后搜索了很多资料和博客去看,这些资料链接我会放在本文后面

一、开通IMAP服务

我以网页邮箱(163邮箱为例

1、登陆网易邮箱并找到设置

在这里插入图片描述

2、进入开通页面

在这里插入图片描述

3、按照指引步骤来并记住设备密码(授权码),一定要记住,一定要备份

二、编写Python代码

1、登陆邮箱
#-*- encoding: utf-8 -*-
import email,sys
from imapclient import IMAPClient
from bs4 import BeautifulSoup
#服务器网址
hostname = 'imap.163.com'
#用户名即邮箱账号
username = '邮箱账号'
#授权码不是邮箱原密码
passwd = '你的授权码'
#链接服务器
server = IMAPClient(hostname, ssl= True)
#登陆
try:
    #登陆账号
    server.login(username, passwd)
    # 上传客户端身份信息
    server.id_({"name": "IMAPClient", "version": "2.1.0"})
    #导航目录的列表,'INBOX','草稿箱'、'已发送'等
    dictList = server.list_folders()
    # print(dictList)
    #对收件箱只读
    info = server.select_folder('INBOX', readonly = True)
except server.Error:
    print('Could not login')
    sys.exit(1)
2、获取收件箱里面的邮件以及内容解析
#获取邮件列表
result = server.search()
for uid in result:
    massageList = server.fetch(uid,['BODY[]'])
    mailBody = massageList[uid][b'BODY[]']
    #邮件内容解析最里面那层是按字节来解析邮件主题内容,这个过程生成Message类型
    try :
        #我看其他博主的都是拿到str类型的,如果这个时候拿到邮件的类型是str就用这个
        email_content = email.message_from_string(mailBody)
    except TypeError:
        #但压力在我这,我没拿到str类型的,拿到的是bytes字节类型的,那就用字节解析吧
        email_content = email.message_from_bytes(mailBody)
        #如果想知道字符集的可以在这先输出一下,查看结果里面的字符集是'utf-8'还是什么
        # print(email_content)
    #标题
    subject = email.header.make_header(email.header.decode_header(email_content['SUBJECT']))
    #发件人
    mail_from = email.header.make_header(email.header.decode_header(email_content['From']))
    #收件日期
    envlope = (server.fetch(uid,['ENVELOPE']))[uid][b'ENVELOPE']
    dates = envlope.date
    # 获取内容的type编码方式
    maintype = email_content.get_content_maintype()
    if maintype == 'multipart':
        for part in email_content.get_payload():
            #获取邮件中的文本
            if part.get_content_maintype() == 'text':
                #取出正文内容并去掉前后的换行符、空格
                mail_content = part.get_payload(decode=True).strip()
    elif maintype == 'text':
        mail_content = email_content.get_payload(decode=True).strip()    
    #用对应的字符集去解码
    try:
        #解码显示中文,如果utf-8不行用gbk或者其他
        mail_content = mail_content.decode('gbk')
    except UnicodeDecodeError:
        try: 
            #拿到的内容是html格式的
             mail_content = mail_content.decode('utf-8')
        except UnicodeDecodeError:
            print('decode error')
            sys.exit(1)
3、取出来的内容进行html解析并写入txt
#写进txt
#记得写上编码方式为'gb18030',不然写入txt会报错
with open(f'D:\IMAP\{uid}.txt','w+',encoding="gb18030") as f:
f.write(f'From:{mail_from}'+'\n')
f.write(f'Subject:{subject}'+'\n')
f.write(f'Date:{dates}'+'\n')
f.write(f'正文内容:'+'\n')
#用BeautifulSoup库的HTML解析器来解析邮件文本,并去掉多余的换行符
f.write((BeautifulSoup(mail_content,'html.parser').get_text().strip()).replace('\n\n', '')+'\n') 
4、完整代码如下
#-*- encoding: utf-8 -*-
import email,sys
from imapclient import IMAPClient
from bs4 import BeautifulSoup
#服务器网址
hostname = 'imap.163.com'
#用户名即邮箱账号
username = '邮箱账号'
#授权码不是邮箱原密码
passwd = '你的授权码'
#链接服务器
server = IMAPClient(hostname, ssl= True)
#登陆
try:
    #登陆账号
    server.login(username, passwd)
    # 上传客户端身份信息
    server.id_({"name": "IMAPClient", "version": "2.1.0"})
    #导航目录的列表,'INBOX','草稿箱'、'已发送'等
    dictList = server.list_folders()
    # print(dictList)
    #对收件箱只读
    info = server.select_folder('INBOX', readonly = True)
except server.Error:
    print('Could not login')
    sys.exit(1)
#获取邮件列表
result = server.search()
for uid in result:
    massageList = server.fetch(uid,['BODY[]'])
    mailBody = massageList[uid][b'BODY[]']
    #邮件内容解析最里面那层是按字节来解析邮件主题内容,这个过程生成Message类型
    try :
        email_content = email.message_from_string(mailBody)
    except TypeError:
        email_content = email.message_from_string(str(email.message_from_bytes(mailBody)))
        # print(email_content)
    #标题
    subject = email.header.make_header(email.header.decode_header(email_content['SUBJECT']))
    #发件人
    mail_from = email.header.make_header(email.header.decode_header(email_content['From']))
    #收件日期
    envlope = (server.fetch(uid,['ENVELOPE']))[uid][b'ENVELOPE']
    dates = envlope.date
    # 获取内容的type编码方式
    maintype = email_content.get_content_maintype()
    if maintype == 'multipart':
        for part in email_content.get_payload():
            #获取邮件中的文本
            if part.get_content_maintype() == 'text':
                #下载
                mail_content = part.get_payload(decode=True).strip()
    elif maintype == 'text':
        mail_content = email_content.get_payload(decode=True).strip()    
    try:
        #解码显示中文,如果utf-8不行用gbk或者其他
        mail_content = mail_content.decode('gbk')
    except UnicodeDecodeError:
        try: 
             mail_content = mail_content.decode('utf-8')
        except UnicodeDecodeError:
            print('decode error')
            sys.exit(1)
    #写进txt
    with open(f'D:\IMAP\{uid}.txt','w+',encoding="gb18030") as f:
        f.write(f'From:{mail_from}'+'\n')
        f.write(f'Subject:{subject}'+'\n')
        f.write(f'Date:{dates}'+'\n')
        f.write(f'正文内容:'+'\n')
        f.write((BeautifulSoup(mail_content,'html.parser').get_text().strip()).replace('\n\n', '')+'\n')    
# print('From: ', mail_from)
# print('Subject: ', subject)
# print('Date:',dates)
# print('-'*10, 'mail content', '-'*10)
# print(mail_content.replace('<br>', '\n'))
# print('-'*10, 'mail content', '-'*10)
#退出登陆
server.logout()

三、其他参考链接

1、Python实现IMAP协议接收和解析邮件内容

2、什么是IMAP协议

3、python_imap收取邮件 + 邮件内容解析

4、Python IMAP/POP3收取并解析邮件

article/details/114489568)

3、python_imap收取邮件 + 邮件内容解析

4、Python IMAP/POP3收取并解析邮件

5html文本写入txt

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python可以使用第三方库来实现邮件附件接收和提取附件的指定字段。常用的库有imaplib和email。 首先,需要使用imaplib库来连接到邮件服务器并登录帐户。可以使用IMAP4_SSL方法创建与服务器的安全连接。通过login方法提供正确的用户名和密码进行认证。 接下来,使用IMAP支持的search方法来搜索特定的邮件。可以使用“SEEN”参数来搜索未读邮件。可以根据邮件的发送日期、主题或发件人等指定字段来搜索。将结果存储在变量中。 然后,使用IMAP的fetch方法来获取特定邮件的正文和附件。可以使用邮件的唯一标识符(UID)作为参数来指定要获取的邮件。fetch方法返回邮件的所有部分,包括正文、附件和其它附件的相关信息。可以将邮件的正文和附件保存为文件。 最后,使用email库来解析邮件的正文和附件。使用email的Message类来解析邮件的正文。使用email的multipart模块来处理多部分邮件,包括解析附件的内容。可以使用email的get_payload方法获取附件的内容。使用email的header模块来获取附件的名称和其它相关信息。 通过提取附件的指定字段,可以根据需要对附件进行进一步处理和分析。 总结起来,Python可以使用imaplib和email库来实现邮件附件接收和提取附件的指定字段。首先通过IMAP连接到邮件服务器并搜索指定的邮件,然后使用fetch方法获取邮件的正文和附件,最后使用email库解析邮件内容并提取附件的指定字段。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值