透过Python 将接收邮件邮件进行分类统计

本文介绍如何使用Python和Exchangelib库处理Exchange邮件,包括环境配置、读取数据、时间转换和邮件筛选,以自动下载、分类并追踪公司邮件状态。

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

工作的需要自行学习了Python的一些功能,将所学的经验在这里分享给大家

 

 


前言

工作中我们可能会透过邮件,让其他公司收集资料,在学会Python之前,我们需要用人工将邮件一个一个的下载下来,并且统计有哪一家公司发送了资料,哪一家公司还没有发送,统计也是相当麻烦的事情,

因此我用Python写了一个工具,能够自动的接收邮件并且储存起来,相关的发送人员什么时候发送?并进行跟踪

公司的邮件是用exchange的形式

一、环境准备

我想将收起来的邮件统一放在一个固定的路径中,收件人的一些信息我要独立放在一个Excel里面去记录,处理好的准备要发送的邮件,我另外放在一个地方

 

二、使用步骤

 1.引入库

代码如下(示例):


import os
import urllib3
from datetime import timedelta,datetime
import pandas as pd
import numpy as np
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter
from exchangelib import DELEGATE, Account, Credentials, Message, Mailbox, HTMLBody,Configuration,NTLM,FileAttachment,EWSTimeZone


#此句用来消除ssl证书错误,exchange使用自签证书需加上
BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter

urllib3.disable_warnings() # 取消SSL安全连接警告
# Tell exchangelib to use this adapter class instead of the default
# exchangelib provides a sample adapter which ignores TLS validation errors.
# Use at own risk. NTML is NT LAN Manager.

# 设置邮箱账号 输入你的域账号如
creds = Credentials(
    username='xxxxxxxxx@domain.com',    # 修改为 公邮的 user <<<<<<<<<<<<<<<<<<<<修改连接自己的邮箱
    password='xxxxxxxxxxxxx'   #修改为自己的密码
)
config = Configuration(server='xxxxx.com', credentials=creds, auth_type=NTLM)
account = Account(
        primary_smtp_address='username@domain.com',
        credentials=creds,
        autodiscover=True,
        config=config,
        access_type=DELEGATE
    )

2.读入数据

代码如下(示例):

#  此处为文件路径
path_inbox = r"D:\Doc\Python\inbox\\"  #记录inbox 附件
path_outbox = r"D:\Doc\Python\outbox\\" #outbox 附件
path_data = r"D:\Doc\Python\data\\"  #data管理

# 自定义函数:保存所有邮件附件到本地制定地址
from exchangelib import UTC
def saveAttachments(attachments):
    for attachment in attachments:
        if 'xls' in attachment.name or 'XLS' in attachment.name:   #过滤要有‘xls' 在附件名中才存档
            save_file_name = os.path.join(path_inbox,attachment.name)
            with open(save_file_name, 'wb') as f:  #wb:以二进制写模式打开
                f.write(attachment.content)

inbox = account.inbox  # 获取用户账户的收件箱
unread_email_list = inbox.filter(is_read=False)  # 获取收件箱未读邮件列表
print(unread_email_list)
mail_file = os.path.join(path_data,"mail_log.xlsx")
mail_file_df = pd.read_excel(mail_file)  # 记录mail 的excel
row = len(mail_file_df)     # 读出 excel 的 行数
print(mail_file_df)
# 逆序排列未读邮件列表

mail_log.xlsx 是我要作为邮件记录的一个Excel格式内容如下:

里面包含了主题发件人发件人的邮箱, 与邮件的接收时间

我们来看一下怎么把这些资料从Email里面读出来

代码如下(示例):

我在处理接收时间的时候遇到这样子的报错 Excel does not support datetimes with timezones

因为在 exchange上面是用time zone的方式记录时间,Excel不接受这样子的时间方式,所以我先将参数直接转换成为文字格式,但是文字格式的日期与我们相差了8个小时,

我们怎么把这8个小时再追加回去呢?这时候就需要你用到strptime的函数来进行加工,加工后的日期才是真正的收件日期

因为同一个邮箱我们可能要做不同的事情,所以我们可以利用邮件标题中的特殊属性来进行邮件的过滤,这样python只会捞取要处理的邮件进行处理

for email in unread_email_list:  #.order_by('-datetime_received'):
    # 转换 timezone
    # 如不转换 存入excel会报错 ”Excel does not support datetimes with timezones“
    dt = str(email.datetime_received) #转换文字
    dt = dt[:19] #取前19码 yyyy-mm-dd hh:mm:ss
    received_time = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")+ timedelta(hours=8) # + 8hr
    print(received_time)

    # 如果邮件标题中包含‘【xxx数据处理xxx】’ 邮件过滤
    if '【xxx数据处理】' in email.subject:    #'QiQi' in email.sender.name 可以过滤 sender
        print(" --------------- prepare date start here ----------------")
        pd1 = [email.subject, email.sender.name, email.sender.email_address, received_time]
        row = row + 1
        mail_file_df.loc[row] = pd1
        email.is_read = True  # 将邮件设置为已读
        email.save(update_fields=['is_read'])  # 保存邮件的已读属性
        # 调用自定义函数:保存邮件附件到本地
        saveAttachments(email.attachments)
mail_file_df.to_excel(mail_file,na_rep=11,index=False)

 

 


总结

以上就是今天想给大家的内容,非常的简短,就能够处理邮件下载分类统计的功能,完整的代码如下:

# coding=utf-8
#
import os
import urllib3
from datetime import timedelta,datetime
import pandas as pd
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter
from exchangelib import DELEGATE, Account, Credentials, Message, Mailbox, HTMLBody,Configuration,NTLM,FileAttachment,EWSTimeZone
#此句用来消除ssl证书错误,exchange使用自签证书需加上
BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter

urllib3.disable_warnings() # 取消SSL安全连接警告
# Tell exchangelib to use this adapter class instead of the default
# exchangelib provides a sample adapter which ignores TLS validation errors.
# Use at own risk. NTML is NT LAN Manager.

# 设置邮箱账号 输入你的域账号如
creds = Credentials(
    username='username@domain.com',    # 修改为 公邮的 user
    password='xxxxxx'
)
config = Configuration(server='xxxx.com', credentials=creds, auth_type=NTLM)
account = Account(
        primary_smtp_address='username@domain.com',
        credentials=creds,
        autodiscover=True,
        config=config,
        access_type=DELEGATE
    )
#  此处为文件路径
path_inbox = r"D:\Doc\Python\inbox\\"  #记录inbox 附件
path_outbox = r"D:\Doc\Python\outbox\\" #outbox 附件
path_data = r"D:\Doc\Python\data\\"  #data管理

# 自定义函数:保存所有邮件附件到本地制定地址
from exchangelib import UTC
def saveAttachments(attachments):
    for attachment in attachments:
        if 'xls' in attachment.name:   #过滤要有‘xls' 在附件名中才存档
            save_file_name = os.path.join(path_outbox,attachment.name)
            with open(save_file_name, 'wb') as f:
                f.write(attachment.content)

inbox = account.inbox  # 获取用户账户的收件箱
unread_email_list = inbox.filter(is_read=False)  # 获取收件箱未读邮件列表
mail_file = os.path.join(path_data,"mail_log.xlsx")
mail_file_df = pd.read_excel(mail_file)  # 记录mail 的excel
row = len(mail_file_df)     # 读出 excel 的 行数
# 逆序排列未读邮件列表
for email in unread_email_list:  #.order_by('-datetime_received'):
#    print(email.subject)  # 打印邮件标题
#    print(email.text_body)  # 打印邮件是否已读
#    print(email.sender.name)  # 打印邮件发件人
#    print(email.sender.email_address)
#    print(email.datetime_received)  # 打印邮件接收时间
    # 转换 timezone
    # 如不转换 存入excel会报错 ”Excel does not support datetimes with timezones“
    dt = str(email.datetime_received) #转换文字
    dt = dt[:19] #取前19码 yyyy-mm-dd hh:mm:ss
    received_time = datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")+ timedelta(hours=8) # + 8hr
#    print(received_time)


    # 如果邮件标题中包含‘【abc数据处理】’ 邮件过滤
    if '【abc数据处理】' in email.subject:    #'QiQi' in email.sender.name 可以过滤 sender
        print(" --------------- prepare date start here ----------------")
        pd1 = [email.subject, email.sender.name, email.sender.email_address, received_time]
        row = row + 1
        mail_file_df.loc[row] = pd1
#        email.is_read = True  # 将邮件设置为已读
#        email.save(update_fields=['is_read'])  # 保存邮件的已读属性
        # 调用自定义函数:保存邮件附件到本地
        saveAttachments(email.attachments)
mail_file_df.to_excel(mail_file,na_rep=11,index=False)

print("--------done---------")
'''
if __name__ == "__main__":
    # 连接邮箱服务器
    account = connectServer()
    while True:
        # 获取未读邮件列表
        unhandleMails = getUnreadMail(account)
        # 处理邮件
        handleMail(unhandleMails, account)
        time.sleep(30) # 休眠30秒
'''

要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值