解析校内网邮箱

本文介绍了一个使用Python进行邮件处理的应用实例,包括通过配置文件读取邮件服务器信息、使用POP3协议登录邮箱、接收并解析邮件内容及附件。特别关注了中文文件名的正确解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一并写的参考了前人的资料,修复了一些程序中存在的bug,对于中文附件文件名解析的时候会出现需要迭代解码的情况,
写邮箱登陆容易,对邮箱的解析确是一件麻烦的事情

遇到不懂的地方,多用Pycharm调试,看看错在哪

config.ini配置文件

[mail]
smpthost=mail.bjtu.edu.cn
pophost=mail.bjtu.edu.cn
name=xxxxxxxxxxxxxx
passwd=xxxxxxxxxx

邮箱登陆部分

from  poplib import *
import logging
import  configparser

# import getpass, poplib
#
# M = poplib.POP3('localhost')
# M.user(getpass.getuser())
# M.pass_(getpass.getpass())
# numMessages = len(M.list()[1])
# for i in range(numMessages):
#     for j in M.retr(i+1)[1]:
#         print(j)
class MailHelper(object):
    configpath='config.ini'
    configmail=configparser.ConfigParser()
    configmail.read(configpath)
    def __init__(self):
        self.pophost=self.configmail.get('mail','pophost')
        self.smtphost=self.configmail.get('mail','smtphost')
        self.username=self.configmail.get('mail','name')
        self.passwd=self.configmail.get('mail','passwd')
    def Login(self):
        try:
            self.pop=POP3_SSL(self.pophost)
            self.pop.set_debuglevel(0)
            self.pop.user(self.username)
            self.pop.pass_(self.passwd)
            self.total=self.pop.stat()[0]
            self.s=self.pop.list()

            print('登陆成功',self.total)
        except Exception as e:
            print('登陆失败'+str(e))
    def AcceptMail(self):
        from functools import reduce
        msg=self.pop.retr(541)[1]
        f=open(r"C:\Users\sunqi\Desktop\新建文本文档.txt",'wb')
        s=list(map(lambda x:x+b'\r\n',msg))
        f.writelines(s)
        f.close()
        print('ok')

s=MailHelper()
s.Login()
s.AcceptMail()

解析邮件内容部分


# coding=utf-8

import email

fp = open("C:\\Users\\sunqi\\Desktop\\新建文本文档.txt", 'r')
msg = email.message_from_file(fp) # 直接文件创建message对象,这个时候也会做初步的解码
subject = msg.get("subject") # 取信件头里的subject, 也就是主题
from email.header import decode_header
s=decode_header(subject)[0]  #列表里面包含一个集合提取从集合
print(s[0].decode(s[1]))
# 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC?=这样的subject
# h = email.header.Header(subject)
# dh = email.header.decode_header(h)
# subject = dh[0][0]
# print("subject:", subject)
print("from: ", email.utils.parseaddr(msg.get("from"))[1]) # 取from
print("to: ", email.utils.parseaddr(msg.get("to"))[1]) # 取to
print("Date: ", email.utils.parsedate(msg.get("Date")))

# 循环信件中的每一个mime的数据块
for par in msg.walk(): #遵循深度优先的遍历树形图中所有元素
    if not par.is_multipart(): # 这里要判断是否是multipart,是的话,里面的数据是无用的,至于为什么可以了解mime相关知识。
        name = par.get_param("name") #如果是附件,这里就会取出附件的文件名
        if name:
            #有附件
            # 下面的89/三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC.rar?=这样的文件名
            h = email.header.Header(name)
            dh = email.header.decode_header(h)[0][0].decode()
            if dh.endswith('?='):
                #若果文件名为中文
                dh = email.header.decode_header(dh)[0]
                fname=dh[0].decode(dh[1])
            else:
                fname=dh
            #print(dh)
            print('附件名:', fname)
            data = par.get_payload(decode=True) # 解码出附件数据,然后存储到文件中

            try:
                f = open(fname, 'wb') #注意一定要用wb来打开文件,因为附件一般都是二进制文件
            except Exception as e:
                print('附件名有非法字符,自动换一个\n出现异常:',str(e))
                f = open('aaaa', 'wb')
            f.write(data)
            f.close()
        else:
            #不是附件,是文本内容
            print(par.get_payload(decode=True).decode('gbk')) # 解码出文本内容,直接输出来就可以了。

        print('+'*60) # 用来区别各个部分的输出

fp.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值