首页 > 编程问答 >用Python解析邮件日志

用Python解析邮件日志

时间:2024-07-26 14:52:59浏览次数:10  
标签:python

我的任务有点困难。我有一个邮件日志,如:

Oct  3 15:30:18 mail1 postfix/lmtp[5369]: DB10242054: to=<XXXXX>, orig_to=<XXXXXX>, relay=ip[ip]:port, delay=1.4, delays=0.04/0/0.01/1.4, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[iP]:port): 250 2.0.0 Ok: queued as 4580B4208C)
Oct  3 15:30:18 mail1 postfix/smtp[5175]: 4580B4208C: to=<XXXXX>, relay=XXXXX[IP]:port, delay=0.52, delays=0.02/0.01/0.27/0.22, dsn=2.0.0, status=sent (250 2.0.0 OK 1412343018 rr9si6866736lbb - gsmtp)
Oct  3 15:33:57 mail1 amavis[5542]: (05542-09) Passed CLEAN {RelayedInbound}, [ip]:port [ip] <XXXX> -> <XXX>, Message-ID: <XXX>, mail_id: XXXXX, Hits: -1.899, size: 6483, queued_as: 806A24207B, 1483 ms
Oct  3 15:33:57 mail1 postfix/lmtp[6694]: F1FDD41F9D: to=<XXXXXX>, orig_to=<BBBBBB>, relay=ip[ip]:port, delay=1.7, delays=0.18/0/0.01/1.5, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 806A24207B)

我需要打印:

message from: 
message to:
sent at:
status:

邮件日志中的一个“事务”有一个唯一的 id,但该 id 可以出现在文件中的不同位置。

我的想法:| ||首先在文件中搜索单个电子邮件地址;

  • “保存”新列表中的所有匹配行(这样我就可以迭代较小的列表);
  • 我不知道如何解析下一步。 |我的代码现在看起来:

我不要求代码,但是如果您有这样的经验,您能分享一些想法吗?

My code now looks:

lines = []
queue_id = []
f_h = open('/path_to_/maillog', 'r')

def Find_Email(pattern,text):
    email = re.search(pattern, text)
    if email:
        lines.append(text)
        q_id = re.search('[A-F0-9]{10}', text)
        print text,
        if q_id:
            queue_id.append(q_id.group())
            
        
for line in f_h:
    Find_Email(r'[email protected]',line) 

I do not ask for code, but could you please share some ideas if you have such experience?


当然,我可以帮助解析 Python 中的邮件日志。对该问题的理解是正确的,关键是根据唯一的邮件 ID 将相关的日志行组合在一起。

以下是处理此问题的方法,包括一些代码示例以说明关键步骤:

1. 使用正则表达式提取数据:

已经开始使用正则表达式,这是正确的方法。创建一个函数,使用正则表达式从日志行中提取必要信息,包括:

  • 邮件 ID: 例如 ([A-F0-9]{10})
  • 发件人: 例如 (?:&lt;)?(.*?)(?:&gt;)? (在 from= orig_to= 之后)
  • 收件人: 例如 (?:&lt;)?(.*?)(?:&gt;)? (在 to= 之后)
  • 时间戳: 例如 ^(\w{3}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})
  • 状态: 例如 status=(\w+)
import re

def parse_log_line(line):
  """使用正则表达式解析日志行并返回一个字典。"""
  regex = r"(?P<timestamp>\w{3}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})\s+(?P<hostname>\S+)\s+(?P<process>\S+)(\[(?P<pid>\d+)\])?:\s+(?P<message_id>[A-F0-9]{10})?:?\s+(?P<rest>.*)"
  match = re.match(regex, line)
  if match:
    data = match.groupdict()
    # 从 'rest' 中提取更多信息,例如发件人、收件人、状态
    data['sender'] = re.search(r'orig_to=&lt;(.*?)&gt;', data['rest']).group(1) if 'orig_to' in data['rest'] else None
    data['recipient'] = re.search(r'to=&lt;(.*?)&gt;', data['rest']).group(1) if 'to' in data['rest'] else None
    data['status'] = re.search(r'status=(\w+)', data['rest']).group(1) if 'status' in data['rest'] else None
    return data
  return None

2. 使用字典存储邮件数据:

创建一个字典,使用邮件 ID 作为键。每个键的值将是另一个字典,其中包含 "发件人"、"收件人"、"时间戳" 和 "状态" 等信息。

mail_data = {}

3. 迭代日志文件并填充字典:

读取日志文件,逐行解析。对于每条日志行:

  • 提取邮件 ID。
  • 如果邮件 ID 已存在于 mail_data 字典中,则更新现有条目。
  • 否则,使用提取的信息创建一个新条目。
with open('/path_to_/maillog', 'r') as f_h:
  for line in f_h:
    data = parse_log_line(line)
    if data:
      message_id = data['message_id']
      if message_id:
        if message_id in mail_data:
          mail_data[message_id].update(data)
        else:
          mail_data[message_id] = data

4. 打印所需的信息:

迭代 mail_data 字典并以所需格式打印信息。

for message_id, data in mail_data.items():
  print(f"Message ID: {message_id}")
  print(f"  From: {data.get('sender', 'N/A')}")
  print(f"  To: {data.get('recipient', 'N/A')}")
  print(f"  Sent at: {data.get('timestamp', 'N/A')}")
  print(f"  Status: {data.get('status', 'N/A')}")
  print("-" * 20)

这将为提供一个结构化的方式来处理邮件日志数据,并轻松地提取和打印需要的信息。

标签:python
From: 26282338

相关文章

  • Python,Pyinstaller打包含taichi模块的程序
    Python版本3.9、taichi版本1.7.1,pyinstaller版本6.9.0问题描述:正常Pyinstaller打包后报错[Taichi]version1.7.1,llvm15.0.1,commit0f143b2f,win,python3.9.19[Taichi]Startingonarch=x64Traceback(mostrecentcalllast):File"taichi\lang\_wrap_inspec......
  • Python,运行Yolo项目,报错AttributeError: ‘ImageDraw‘ object has no attribute ‘te
    Python3.9问题描述:其他电脑已经运行成功的Python,YOLO代码到我电脑上运行报错Traceback(mostrecentcalllast): File"C:\Users\Administrator\Desktop\20240725\识别项目\predict.py",line122,in<module>  frame=np.array(yolo.detect_image(frame)) Fil......
  • Python从零开始制做文字游戏(荒岛求生)
    文章目录前言开发游戏《荒岛求生》游戏大纲背景内容通关条件游戏过程探索荒岛购买物资休息总结代码开发定义变量当前代码引入背景故事当前代码循环问题解决:函数当前代码制作延时当前代码制作a函数(探索荒岛阶段)展示数......
  • 使用 Python 进行数据分析:入门指南
    使用Python进行数据分析:入门指南1.简介本指南将介绍如何使用Python进行数据分析,涵盖从数据加载到可视化分析的各个方面。2.必要的库NumPy:用于数值计算和数组操作。Pandas:用于数据处理和分析,提供DataFrame结构。Matplotlib:用于数据可视化,创建各种图表。Seab......
  • IT实战课堂计算机毕业设计源码精品基于Python的高校教育教材采购出入库进销存储信息管
    项目功能简介:《[含文档+PPT+源码等]精品基于Python的高校教育教材信息管理系统设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!软件开发环境及开发工具:开......
  • 为什么我的 Python 脚本失败并出现 TypeError?
    我正在编写一个Python脚本,该脚本应该计算数字列表的总和。但是,当我运行代码时遇到TypeError这是一个最小的例子:numbers=[1,2,3,'4']total=sum(numbers)print(total)Theerrormessageis:TypeError:unsupportedoperandtype(s)for+:'int'and'str......
  • 如何通过socks代理传递所有Python的流量?
    有如何通过http代理传递所有Python的流量?但是,它不处理sock代理。我想使用sock代理,我们可以通过ssh隧道轻松获得它。ssh-D5005user@server你可以使用socks库,让你的Python代码通过SOCKS代理传递所有流量。这个库可以让你在套接字级别上指定代......
  • 如何在streamlit python中流式传输由LLM生成的输出
    代码:fromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchainimportPromptTemplatefromlangchain_community.llmsimportLlamaCppfromlangchain.chainsimportRetrievalQAimports......
  • python mysql操作
    pipinstallmysql-connector-pythonimportmysql.connector#配置数据库连接参数config={'user':'your_username','password':'your_password','host':'your_host','database'......
  • Python 中的面向对象编程
    一.介绍在本文中,我们将使用Python中的类和对象来探索基本的OOP概念。面向对象编程(OOP)是一种强大的方法,可帮助开发人员组织代码,使其易于理解、重用和维护。Python是一种灵活的语言,可以很好地支持OOP概念。1.类和对象类是创建对象的蓝图。它定义了该类的对象将......