You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python从邮件消息中提取URL的技术方案咨询

提取邮件中所有URL的Python脚本方案

别着急,我来一步步帮你搞定这个需求!其实你之前尝试的email模块方向是对的,只是可能没处理好邮件的多部分结构(比如很多邮件同时包含纯文本和HTML内容),搭配正则表达式就能完美提取所有URL了。

第一步:解析邮件,提取所有可读内容

邮件通常是MIME格式,可能包含多个内容块(比如纯文本text/plain和HTMLtext/html),我们需要把这些部分的内容都提取出来,才不会漏掉任何URL。这里用Python内置的email模块(搭配更现代的email.policy接口)来完成解析:

import email
from email.policy import default

def extract_email_content(file_path):
    with open(file_path, 'rb') as f:
        # 读取二进制邮件文件,用default策略适配现代邮件格式
        msg = email.message_from_binary_file(f, policy=default)
    
    content = []
    # 遍历邮件的所有MIME内容块
    for part in msg.walk():
        # 只处理纯文本和HTML类型的内容
        if part.get_content_type() in ['text/plain', 'text/html']:
            try:
                # 获取解码后的文本内容
                part_content = part.get_content()
                content.append(part_content)
            except:
                # 处理编码异常,避免脚本直接崩溃
                continue
    # 把所有内容拼接成一个字符串,方便后续正则匹配
    return '\n'.join(content)

第二步:用正则提取所有URL

接下来用正则表达式匹配内容里的URL,下面是一个通用的正则规则,能覆盖大部分http/https开头的URL(包括域名、路径、参数等):

import re

def extract_urls(text):
    # 匹配http/https开头URL的正则表达式
    url_pattern = re.compile(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+(/[-\w./?%&=]*)?')
    # 找出所有匹配的URL
    urls = url_pattern.findall(text)
    # 去重,避免重复URL多次输出
    unique_urls = list(set(urls))
    return unique_urls

第三步:整合脚本,支持命令行传参

最后把两部分功能整合,用argparse模块接收邮件路径参数,这样你就能直接在命令行运行脚本,传入邮件路径即可:

import argparse

def main():
    # 设置命令行参数解析器
    parser = argparse.ArgumentParser(description='Extract all URLs from an email file.')
    parser.add_argument('email_path', help='Path to your email message file')
    args = parser.parse_args()
    
    # 提取邮件内容
    email_content = extract_email_content(args.email_path)
    # 提取URL
    urls = extract_urls(email_content)
    
    # 输出结果
    print(f"Found {len(urls)} unique URLs:")
    for url in urls:
        print(url)

if __name__ == '__main__':
    main()

如何使用

把上面的代码保存为extract_email_urls.py,然后在命令行运行:

python extract_email_urls.py /path/to/your/email/file.eml

额外小提示

  • 如果遇到编码特殊的邮件,可以调整extract_email_content里的异常处理逻辑,适配更多场景
  • 要是需要匹配ftp等其他协议的URL,只需把正则里的https?://改成(?:https?|ftp)://即可
  • 新手可以先拿纯文本邮件测试脚本,再逐步尝试复杂的多部分邮件,更容易理解模块的工作逻辑

内容的提问来源于stack exchange,提问作者grayfoxdt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:46:03